diff --git a/play-scala-compile-di-example/.gitignore b/play-scala-compile-di-example/.gitignore
new file mode 100644
index 000000000..eb0b5d686
--- /dev/null
+++ b/play-scala-compile-di-example/.gitignore
@@ -0,0 +1,67 @@
+logs
+target
+/.idea
+/.idea_modules
+/.classpath
+/.project
+/.settings
+/RUNNING_PID
+
+/db
+.eclipse
+/lib/
+/logs/
+/modules
+/project/target
+/target
+tmp/
+test-result
+server.pid
+*.eml
+/dist/
+.cache
+
+# User-specific stuff:
+.idea/workspace.xml
+.idea/tasks.xml
+.idea/dictionaries
+.idea/vcs.xml
+.idea/jsLibraryMappings.xml
+
+# Sensitive or high-churn files:
+.idea/dataSources.ids
+.idea/dataSources.xml
+.idea/dataSources.local.xml
+.idea/sqlDataSources.xml
+.idea/dynamic.xml
+.idea/uiDesigner.xml
+
+# Gradle:
+build
+.gradle
+.idea/gradle.xml
+.idea/libraries
+
+
+# Mongo Explorer plugin:
+.idea/mongoSettings.xml
+
+## File-based project format:
+*.iws
+
+## Plugin-specific files:
+
+# IntelliJ
+/out/
+
+# mpeltonen/sbt-idea plugin
+.idea_modules/
+
+# JIRA plugin
+atlassian-ide-plugin.xml
+
+# Crashlytics plugin (for Android Studio and IntelliJ)
+com_crashlytics_export_strings.xml
+crashlytics.properties
+crashlytics-build.properties
+fabric.properties
diff --git a/play-scala-compile-di-example/.mergify.yml b/play-scala-compile-di-example/.mergify.yml
new file mode 100644
index 000000000..32f8689ae
--- /dev/null
+++ b/play-scala-compile-di-example/.mergify.yml
@@ -0,0 +1,27 @@
+pull_request_rules:
+ - name: automatic merge on CI success require review
+ conditions:
+ - status-success=Travis CI - Pull Request
+ - "#approved-reviews-by>=1"
+ - "#changes-requested-reviews-by=0"
+ - label!=block-merge
+ actions:
+ merge:
+ method: squash
+ strict: smart
+
+ - name: automatic merge on CI success for TemplateControl
+ conditions:
+ - status-success=Travis CI - Pull Request
+ - label=merge-when-green
+ - label!=block-merge
+ actions:
+ merge:
+ method: squash
+ strict: smart
+
+ - name: delete branch after merge
+ conditions:
+ - merged
+ actions:
+ delete_head_branch: {}
diff --git a/play-scala-compile-di-example/.travis.yml b/play-scala-compile-di-example/.travis.yml
new file mode 100644
index 000000000..1e8c0e7c4
--- /dev/null
+++ b/play-scala-compile-di-example/.travis.yml
@@ -0,0 +1,50 @@
+language: scala
+scala:
+ - 2.12.8
+
+before_install:
+ - curl -sL https://github.com/shyiko/jabba/raw/master/install.sh | bash && . ~/.jabba/jabba.sh
+
+env:
+ global:
+ - JABBA_HOME=$HOME/.jabba
+ matrix:
+ # There is no concise way to specify multi-dimensional build matrix:
+ # https://github.com/travis-ci/travis-ci/issues/1519
+ - SCRIPT=scripts/test-sbt TRAVIS_JDK=adopt@1.8.192-12
+ - SCRIPT=scripts/test-sbt TRAVIS_JDK=adopt@1.11.0-1
+ - SCRIPT=scripts/test-gradle TRAVIS_JDK=adopt@1.8.192-12
+ - SCRIPT=scripts/test-gradle TRAVIS_JDK=adopt@1.11.0-1
+
+# Exclude some combinations from build matrix. See:
+# https://docs.travis-ci.com/user/customizing-the-build/#Build-Matrix
+matrix:
+ fast_finish: true
+ allow_failures:
+ # Current release of Gradle still does not supports Play 2.7.x releases
+ # As soon as there is a release of Gradle that fixes that, we can then
+ # remove this allowed failure.
+ - env: SCRIPT=scripts/test-gradle TRAVIS_JDK=adopt@1.8.192-12
+ - env: SCRIPT=scripts/test-gradle TRAVIS_JDK=adopt@1.11.0-1
+ # Java 11 is still not fully supported. It is good that we are already
+ # testing our sample applications to better discover possible problems
+ # but we can allow failures here too.
+ - env: SCRIPT=scripts/test-sbt TRAVIS_JDK=adopt@1.11.0-1
+
+install:
+ - $JABBA_HOME/bin/jabba install $TRAVIS_JDK
+ - unset _JAVA_OPTIONS
+ - export JAVA_HOME="$JABBA_HOME/jdk/$TRAVIS_JDK" && export PATH="$JAVA_HOME/bin:$PATH" && java -Xmx32m -version
+
+script:
+ - $SCRIPT
+
+before_cache:
+ - find $HOME/.ivy2 -name "ivydata-*.properties" -delete
+ - find $HOME/.sbt -name "*.lock" -delete
+
+cache:
+ directories:
+ - "$HOME/.ivy2/cache"
+ - "$HOME/.gradle/caches"
+ - "$HOME/.jabba/jdk"
diff --git a/play-scala-compile-di-example/LICENSE b/play-scala-compile-di-example/LICENSE
new file mode 100644
index 000000000..670154e35
--- /dev/null
+++ b/play-scala-compile-di-example/LICENSE
@@ -0,0 +1,116 @@
+CC0 1.0 Universal
+
+Statement of Purpose
+
+The laws of most jurisdictions throughout the world automatically confer
+exclusive Copyright and Related Rights (defined below) upon the creator and
+subsequent owner(s) (each and all, an "owner") of an original work of
+authorship and/or a database (each, a "Work").
+
+Certain owners wish to permanently relinquish those rights to a Work for the
+purpose of contributing to a commons of creative, cultural and scientific
+works ("Commons") that the public can reliably and without fear of later
+claims of infringement build upon, modify, incorporate in other works, reuse
+and redistribute as freely as possible in any form whatsoever and for any
+purposes, including without limitation commercial purposes. These owners may
+contribute to the Commons to promote the ideal of a free culture and the
+further production of creative, cultural and scientific works, or to gain
+reputation or greater distribution for their Work in part through the use and
+efforts of others.
+
+For these and/or other purposes and motivations, and without any expectation
+of additional consideration or compensation, the person associating CC0 with a
+Work (the "Affirmer"), to the extent that he or she is an owner of Copyright
+and Related Rights in the Work, voluntarily elects to apply CC0 to the Work
+and publicly distribute the Work under its terms, with knowledge of his or her
+Copyright and Related Rights in the Work and the meaning and intended legal
+effect of CC0 on those rights.
+
+1. Copyright and Related Rights. A Work made available under CC0 may be
+protected by copyright and related or neighboring rights ("Copyright and
+Related Rights"). Copyright and Related Rights include, but are not limited
+to, the following:
+
+ i. the right to reproduce, adapt, distribute, perform, display, communicate,
+ and translate a Work;
+
+ ii. moral rights retained by the original author(s) and/or performer(s);
+
+ iii. publicity and privacy rights pertaining to a person's image or likeness
+ depicted in a Work;
+
+ iv. rights protecting against unfair competition in regards to a Work,
+ subject to the limitations in paragraph 4(a), below;
+
+ v. rights protecting the extraction, dissemination, use and reuse of data in
+ a Work;
+
+ vi. database rights (such as those arising under Directive 96/9/EC of the
+ European Parliament and of the Council of 11 March 1996 on the legal
+ protection of databases, and under any national implementation thereof,
+ including any amended or successor version of such directive); and
+
+ vii. other similar, equivalent or corresponding rights throughout the world
+ based on applicable law or treaty, and any national implementations thereof.
+
+2. Waiver. To the greatest extent permitted by, but not in contravention of,
+applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and
+unconditionally waives, abandons, and surrenders all of Affirmer's Copyright
+and Related Rights and associated claims and causes of action, whether now
+known or unknown (including existing as well as future claims and causes of
+action), in the Work (i) in all territories worldwide, (ii) for the maximum
+duration provided by applicable law or treaty (including future time
+extensions), (iii) in any current or future medium and for any number of
+copies, and (iv) for any purpose whatsoever, including without limitation
+commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes
+the Waiver for the benefit of each member of the public at large and to the
+detriment of Affirmer's heirs and successors, fully intending that such Waiver
+shall not be subject to revocation, rescission, cancellation, termination, or
+any other legal or equitable action to disrupt the quiet enjoyment of the Work
+by the public as contemplated by Affirmer's express Statement of Purpose.
+
+3. Public License Fallback. Should any part of the Waiver for any reason be
+judged legally invalid or ineffective under applicable law, then the Waiver
+shall be preserved to the maximum extent permitted taking into account
+Affirmer's express Statement of Purpose. In addition, to the extent the Waiver
+is so judged Affirmer hereby grants to each affected person a royalty-free,
+non transferable, non sublicensable, non exclusive, irrevocable and
+unconditional license to exercise Affirmer's Copyright and Related Rights in
+the Work (i) in all territories worldwide, (ii) for the maximum duration
+provided by applicable law or treaty (including future time extensions), (iii)
+in any current or future medium and for any number of copies, and (iv) for any
+purpose whatsoever, including without limitation commercial, advertising or
+promotional purposes (the "License"). The License shall be deemed effective as
+of the date CC0 was applied by Affirmer to the Work. Should any part of the
+License for any reason be judged legally invalid or ineffective under
+applicable law, such partial invalidity or ineffectiveness shall not
+invalidate the remainder of the License, and in such case Affirmer hereby
+affirms that he or she will not (i) exercise any of his or her remaining
+Copyright and Related Rights in the Work or (ii) assert any associated claims
+and causes of action with respect to the Work, in either case contrary to
+Affirmer's express Statement of Purpose.
+
+4. Limitations and Disclaimers.
+
+ a. No trademark or patent rights held by Affirmer are waived, abandoned,
+ surrendered, licensed or otherwise affected by this document.
+
+ b. Affirmer offers the Work as-is and makes no representations or warranties
+ of any kind concerning the Work, express, implied, statutory or otherwise,
+ including without limitation warranties of title, merchantability, fitness
+ for a particular purpose, non infringement, or the absence of latent or
+ other defects, accuracy, or the present or absence of errors, whether or not
+ discoverable, all to the greatest extent permissible under applicable law.
+
+ c. Affirmer disclaims responsibility for clearing rights of other persons
+ that may apply to the Work or any use thereof, including without limitation
+ any person's Copyright and Related Rights in the Work. Further, Affirmer
+ disclaims responsibility for obtaining any necessary consents, permissions
+ or other rights required for any use of the Work.
+
+ d. Affirmer understands and acknowledges that Creative Commons is not a
+ party to this document and has no duty or obligation with respect to this
+ CC0 or use of the Work.
+
+For more information, please see
+
diff --git a/play-scala-compile-di-example/NOTICE b/play-scala-compile-di-example/NOTICE
new file mode 100644
index 000000000..6d6c034d3
--- /dev/null
+++ b/play-scala-compile-di-example/NOTICE
@@ -0,0 +1,8 @@
+Written by Lightbend
+
+To the extent possible under law, the author(s) have dedicated all copyright and
+related and neighboring rights to this software to the public domain worldwide.
+This software is distributed without any warranty.
+
+You should have received a copy of the CC0 Public Domain Dedication along with
+this software. If not, see .
diff --git a/play-scala-compile-di-example/README.md b/play-scala-compile-di-example/README.md
new file mode 100644
index 000000000..a2e870f1c
--- /dev/null
+++ b/play-scala-compile-di-example/README.md
@@ -0,0 +1,58 @@
+# play-scala-compile-di-example
+
+[](https://travis-ci.org/playframework/play-scala-compile-di-example)
+
+This is an example of Play using the Scala API with manually wired compile time dependency injection.
+
+The application loader here is `MyApplicationLoader` which uses `MyComponents` to wire together an injector.
+
+For testing, a `MyApplicationFactory` is defined and mixed in:
+
+```scala
+trait MyApplicationFactory extends FakeApplicationFactory {
+
+ override def fakeApplication: Application = {
+ val env = Environment.simple(new File("."))
+ val configuration = Configuration.load(env)
+ val context = ApplicationLoader.Context(
+ environment = env,
+ sourceMapper = None,
+ webCommands = new DefaultWebCommands(),
+ initialConfiguration = configuration,
+ lifecycle = new DefaultApplicationLifecycle()
+ )
+ val loader = new MyApplicationLoader()
+ loader.load(context)
+ }
+
+}
+```
+
+Once the `MyApplicationFactory` is defined, the fake application is used by TestSuite types:
+
+```scala
+class ServerSpec extends PlaySpec
+ with BaseOneServerPerSuite
+ with MyApplicationFactory
+ with ScalaFutures
+ with IntegrationPatience {
+
+ private implicit val implicitPort = port
+
+ "Server query should" should {
+ "work" in {
+ whenReady(play.api.test.WsTestClient.wsUrl("/").get) { response =>
+ response.status mustBe play.api.http.Status.OK
+ }
+ }
+ }
+}
+```
+
+## Further Documentation
+
+* [Compile Time Dependency Injection](https://www.playframework.com/documentation/latest/ScalaCompileTimeDependencyInjection)
+* [Using ScalaTest + Play](https://www.playframework.com/documentation/latest/ScalaTestingWithScalaTest#Using-ScalaTest-+-Play)
+* [ScalaTest User Guide](http://www.scalatest.org/user_guide)
+* [ScalaTest/Scalactic 3.0.0 Release Notes](http://www.scalatest.org/release_notes/3.0.0)
+* [ScalaTest Plus Play](https://github.com/playframework/scalatestplus-play)
diff --git a/play-scala-compile-di-example/app/MyApplicationLoader.scala b/play-scala-compile-di-example/app/MyApplicationLoader.scala
new file mode 100644
index 000000000..189993818
--- /dev/null
+++ b/play-scala-compile-di-example/app/MyApplicationLoader.scala
@@ -0,0 +1,21 @@
+import play.api._
+import play.api.routing.Router
+
+class MyApplicationLoader extends ApplicationLoader {
+ private var components: MyComponents = _
+
+ def load(context: ApplicationLoader.Context): Application = {
+ components = new MyComponents(context)
+ components.application
+ }
+}
+
+class MyComponents(context: ApplicationLoader.Context)
+ extends BuiltInComponentsFromContext(context)
+ with play.filters.HttpFiltersComponents
+ with _root_.controllers.AssetsComponents {
+
+ lazy val homeController = new _root_.controllers.HomeController(controllerComponents)
+
+ lazy val router: Router = new _root_.router.Routes(httpErrorHandler, homeController, assets)
+}
diff --git a/play-scala-compile-di-example/app/controllers/HomeController.scala b/play-scala-compile-di-example/app/controllers/HomeController.scala
new file mode 100644
index 000000000..474c1817a
--- /dev/null
+++ b/play-scala-compile-di-example/app/controllers/HomeController.scala
@@ -0,0 +1,24 @@
+package controllers
+
+import javax.inject.Inject
+
+import play.api.mvc._
+
+/**
+ * This controller creates an `Action` to handle HTTP requests to the
+ * application's home page.
+ */
+
+class HomeController @Inject()(cc: ControllerComponents) extends AbstractController(cc) {
+
+ /**
+ * Create an Action to render an HTML page with a welcome message.
+ * The configuration in the `routes` file means that this method
+ * will be called when the application receives a `GET` request with
+ * a path of `/`.
+ */
+ def index = Action {
+ Ok(views.html.index("Your new application is ready."))
+ }
+
+}
diff --git a/play-scala-compile-di-example/app/views/index.scala.html b/play-scala-compile-di-example/app/views/index.scala.html
new file mode 100644
index 000000000..4488bad13
--- /dev/null
+++ b/play-scala-compile-di-example/app/views/index.scala.html
@@ -0,0 +1,14 @@
+@*
+ * This template takes a single argument, a String containing a
+ * message to display.
+ *@
+@(message: String)
+
+@*
+ * Call the `main` template with two arguments. The first
+ * argument is a `String` with the title of the page, the second
+ * argument is an `Html` object containing the body of the page.
+ *@
+@main("Welcome to Play") {
+
Your message is: @message
+}
diff --git a/play-scala-compile-di-example/app/views/main.scala.html b/play-scala-compile-di-example/app/views/main.scala.html
new file mode 100644
index 000000000..9414f4be6
--- /dev/null
+++ b/play-scala-compile-di-example/app/views/main.scala.html
@@ -0,0 +1,23 @@
+@*
+ * This template is called from the `index` template. This template
+ * handles the rendering of the page header and body tags. It takes
+ * two arguments, a `String` for the title of the page and an `Html`
+ * object to insert into the body of the page.
+ *@
+@(title: String)(content: Html)
+
+
+
+
+ @* Here's where we render the page title `String`. *@
+ @title
+
+
+
+
+
+ @* And here's where we render the `Html` object containing
+ * the page content. *@
+ @content
+
+
diff --git a/play-scala-compile-di-example/build.gradle b/play-scala-compile-di-example/build.gradle
new file mode 100644
index 000000000..87fa68d91
--- /dev/null
+++ b/play-scala-compile-di-example/build.gradle
@@ -0,0 +1,41 @@
+plugins {
+ id 'play'
+ id 'idea'
+}
+
+def playVersion = "2.6.21"
+def scalaVersion = System.getProperty("scala.binary.version", /* default = */ "2.12")
+
+model {
+ components {
+ play {
+ platform play: playVersion, scala: scalaVersion, java: '1.8'
+ injectedRoutesGenerator = true
+
+ sources {
+ twirlTemplates {
+ defaultImports = TwirlImports.SCALA
+ }
+ }
+ }
+ }
+}
+
+dependencies {
+ play "com.typesafe.play:play-logback_$scalaVersion:$playVersion"
+ play "com.typesafe.play:filters-helpers_$scalaVersion:$playVersion"
+ playTest "org.scalatestplus.play:scalatestplus-play_$scalaVersion:3.1.2"
+}
+
+repositories {
+ jcenter()
+ maven {
+ name "lightbend-maven-releases"
+ url "https://repo.lightbend.com/lightbend/maven-release"
+ }
+ ivy {
+ name "lightbend-ivy-release"
+ url "https://repo.lightbend.com/lightbend/ivy-releases"
+ layout "ivy"
+ }
+}
diff --git a/play-scala-compile-di-example/build.sbt b/play-scala-compile-di-example/build.sbt
new file mode 100644
index 000000000..3a56ee61e
--- /dev/null
+++ b/play-scala-compile-di-example/build.sbt
@@ -0,0 +1,11 @@
+name := """play-scala-compile-di-example"""
+
+version := "1.0-SNAPSHOT"
+
+lazy val root = (project in file(".")).enablePlugins(PlayScala)
+
+scalaVersion := "2.12.8"
+
+crossScalaVersions := Seq("2.11.12", "2.12.4")
+
+libraryDependencies += "org.scalatestplus.play" %% "scalatestplus-play" % "3.1.2" % Test
diff --git a/play-scala-compile-di-example/conf/application.conf b/play-scala-compile-di-example/conf/application.conf
new file mode 100644
index 000000000..eac8bafef
--- /dev/null
+++ b/play-scala-compile-di-example/conf/application.conf
@@ -0,0 +1 @@
+play.application.loader=MyApplicationLoader
diff --git a/play-scala-compile-di-example/conf/logback.xml b/play-scala-compile-di-example/conf/logback.xml
new file mode 100644
index 000000000..d21cd69d3
--- /dev/null
+++ b/play-scala-compile-di-example/conf/logback.xml
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+ ${application.home:-.}/logs/application.log
+
+ %date [%level] from %logger in %thread - %message%n%xException
+
+
+
+
+
+ %coloredLevel %logger{15} - %message%n%xException{10}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/play-scala-compile-di-example/conf/routes b/play-scala-compile-di-example/conf/routes
new file mode 100644
index 000000000..18027a30a
--- /dev/null
+++ b/play-scala-compile-di-example/conf/routes
@@ -0,0 +1,9 @@
+# Routes
+# This file defines all application routes (Higher priority routes first)
+# ~~~~
+
+# An example controller showing a sample home page
+GET / controllers.HomeController.index
+
+# Map static resources from the /public folder to the /assets URL path
+GET /assets/*file controllers.Assets.versioned(path="/public", file: Asset)
diff --git a/play-scala-compile-di-example/gradle/wrapper/gradle-wrapper.jar b/play-scala-compile-di-example/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 000000000..01b8bf6b1
Binary files /dev/null and b/play-scala-compile-di-example/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/play-scala-compile-di-example/gradle/wrapper/gradle-wrapper.properties b/play-scala-compile-di-example/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 000000000..89dba2d9d
--- /dev/null
+++ b/play-scala-compile-di-example/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,5 @@
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.9-bin.zip
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStorePath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
diff --git a/play-scala-compile-di-example/gradlew b/play-scala-compile-di-example/gradlew
new file mode 100755
index 000000000..cccdd3d51
--- /dev/null
+++ b/play-scala-compile-di-example/gradlew
@@ -0,0 +1,172 @@
+#!/usr/bin/env sh
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=$((i+1))
+ done
+ case $i in
+ (0) set -- ;;
+ (1) set -- "$args0" ;;
+ (2) set -- "$args0" "$args1" ;;
+ (3) set -- "$args0" "$args1" "$args2" ;;
+ (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=$(save "$@")
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+ cd "$(dirname "$0")"
+fi
+
+exec "$JAVACMD" "$@"
diff --git a/play-scala-compile-di-example/gradlew.bat b/play-scala-compile-di-example/gradlew.bat
new file mode 100644
index 000000000..e95643d6a
--- /dev/null
+++ b/play-scala-compile-di-example/gradlew.bat
@@ -0,0 +1,84 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/play-scala-compile-di-example/project/build.properties b/play-scala-compile-di-example/project/build.properties
new file mode 100644
index 000000000..c0bab0494
--- /dev/null
+++ b/play-scala-compile-di-example/project/build.properties
@@ -0,0 +1 @@
+sbt.version=1.2.8
diff --git a/play-scala-compile-di-example/project/plugins.sbt b/play-scala-compile-di-example/project/plugins.sbt
new file mode 100644
index 000000000..372755e6f
--- /dev/null
+++ b/play-scala-compile-di-example/project/plugins.sbt
@@ -0,0 +1,2 @@
+// The Play plugin
+addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.6.21")
diff --git a/play-scala-compile-di-example/public/images/favicon.png b/play-scala-compile-di-example/public/images/favicon.png
new file mode 100644
index 000000000..c7d92d2ae
Binary files /dev/null and b/play-scala-compile-di-example/public/images/favicon.png differ
diff --git a/play-scala-compile-di-example/public/javascripts/hello.js b/play-scala-compile-di-example/public/javascripts/hello.js
new file mode 100644
index 000000000..02ee13c7c
--- /dev/null
+++ b/play-scala-compile-di-example/public/javascripts/hello.js
@@ -0,0 +1,3 @@
+if (window.console) {
+ console.log("Welcome to your Play application's JavaScript!");
+}
diff --git a/play-scala-compile-di-example/public/stylesheets/main.css b/play-scala-compile-di-example/public/stylesheets/main.css
new file mode 100644
index 000000000..e69de29bb
diff --git a/play-scala-compile-di-example/scripts/script-helper b/play-scala-compile-di-example/scripts/script-helper
new file mode 100644
index 000000000..9a2faa643
--- /dev/null
+++ b/play-scala-compile-di-example/scripts/script-helper
@@ -0,0 +1,13 @@
+#!/usr/bin/env bash
+
+set -e
+set -o pipefail
+
+java_version=$(java -version 2>&1 | java -version 2>&1 | awk -F '"' '/version/ {print $2}')
+
+if [[ $java_version = 1.8* ]] ; then
+ echo "The build is using Java 8 ($java_version). No addional JVM params needed."
+else
+ echo "The build is using Java 9+ ($java_version). We need additional JVM parameters"
+ export _JAVA_OPTIONS="$_JAVA_OPTIONS --add-modules=java.xml.bind"
+fi
diff --git a/play-scala-compile-di-example/scripts/test-gradle b/play-scala-compile-di-example/scripts/test-gradle
new file mode 100755
index 000000000..84a051a20
--- /dev/null
+++ b/play-scala-compile-di-example/scripts/test-gradle
@@ -0,0 +1,13 @@
+#!/usr/bin/env bash
+
+. "$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )/script-helper"
+
+# Using cut because TRAVIS_SCALA_VERSION is the full Scala
+# version (for example 2.12.4), but Gradle expects just the
+# binary version (for example 2.12)
+scala_binary_version=$(echo $TRAVIS_SCALA_VERSION | cut -c1-4)
+
+echo "+------------------------------+"
+echo "| Executing tests using Gradle |"
+echo "+------------------------------+"
+./gradlew -Dscala.binary.version=$scala_binary_version check -i --stacktrace
diff --git a/play-scala-compile-di-example/scripts/test-sbt b/play-scala-compile-di-example/scripts/test-sbt
new file mode 100755
index 000000000..0425367b1
--- /dev/null
+++ b/play-scala-compile-di-example/scripts/test-sbt
@@ -0,0 +1,8 @@
+#!/usr/bin/env bash
+
+. "$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )/script-helper"
+
+echo "+----------------------------+"
+echo "| Executing tests using sbt |"
+echo "+----------------------------+"
+sbt ++$TRAVIS_SCALA_VERSION test
diff --git a/play-scala-compile-di-example/test/ApplicationSpec.scala b/play-scala-compile-di-example/test/ApplicationSpec.scala
new file mode 100644
index 000000000..fc38b4f17
--- /dev/null
+++ b/play-scala-compile-di-example/test/ApplicationSpec.scala
@@ -0,0 +1,29 @@
+import org.scalatest.concurrent.ScalaFutures
+import org.scalatestplus.play._
+import play.api.test.Helpers._
+import play.api.test._
+
+/**
+ * Runs an integration test with an application
+ */
+class ApplicationSpec extends PlaySpec
+ with BaseOneAppPerTest
+ with MyApplicationFactory
+ with ScalaFutures {
+
+ "Routes" should {
+ "send 404 on a bad request" in {
+ route(app, FakeRequest(GET, "/boum")).map(status(_)) mustBe Some(NOT_FOUND)
+ }
+ }
+
+ "HomeController" should {
+ "render the index page" in {
+ val home = route(app, FakeRequest(GET, "/")).get
+
+ status(home) mustBe OK
+ contentType(home) mustBe Some("text/html")
+ contentAsString(home) must include("Your new application is ready.")
+ }
+ }
+}
diff --git a/play-scala-compile-di-example/test/MyApplicationFactory.scala b/play-scala-compile-di-example/test/MyApplicationFactory.scala
new file mode 100644
index 000000000..70bd1d85f
--- /dev/null
+++ b/play-scala-compile-di-example/test/MyApplicationFactory.scala
@@ -0,0 +1,24 @@
+import java.io.File
+
+import org.scalatestplus.play.FakeApplicationFactory
+import play.api._
+import play.api.inject._
+import play.core.DefaultWebCommands
+
+trait MyApplicationFactory extends FakeApplicationFactory {
+
+ override def fakeApplication: Application = {
+ val env = Environment.simple(new File("."))
+ val configuration = Configuration.load(env)
+ val context = ApplicationLoader.Context(
+ environment = env,
+ sourceMapper = None,
+ webCommands = new DefaultWebCommands(),
+ initialConfiguration = configuration,
+ lifecycle = new DefaultApplicationLifecycle()
+ )
+ val loader = new MyApplicationLoader()
+ loader.load(context)
+ }
+
+}
diff --git a/play-scala-compile-di-example/test/SeleniumSpec.scala b/play-scala-compile-di-example/test/SeleniumSpec.scala
new file mode 100644
index 000000000..4b0c5fdbb
--- /dev/null
+++ b/play-scala-compile-di-example/test/SeleniumSpec.scala
@@ -0,0 +1,18 @@
+import org.scalatestplus.play._
+
+class SeleniumSpec extends PlaySpec
+ with BaseOneServerPerTest
+ with OneBrowserPerTest
+ with MyApplicationFactory
+ with HtmlUnitFactory {
+
+ "SeleniumSpec" should {
+
+ "work from within a browser" in {
+
+ go to ("http://localhost:" + port)
+
+ pageSource must include("Your new application is ready.")
+ }
+ }
+}
diff --git a/play-scala-compile-di-example/test/ServerSpec.scala b/play-scala-compile-di-example/test/ServerSpec.scala
new file mode 100644
index 000000000..cc3bc6c3f
--- /dev/null
+++ b/play-scala-compile-di-example/test/ServerSpec.scala
@@ -0,0 +1,23 @@
+import org.scalatest.concurrent.{IntegrationPatience, ScalaFutures}
+import org.scalatestplus.play._
+
+/**
+ * Runs a play server on the default test port (Helpers.testServerPort == 19001).
+ */
+class ServerSpec extends PlaySpec
+ with BaseOneServerPerSuite
+ with MyApplicationFactory
+ with ScalaFutures
+ with IntegrationPatience {
+
+ private implicit val implicitPort = port
+
+ "Server query should" should {
+ "work" in {
+ whenReady(play.api.test.WsTestClient.wsUrl("/").get) { response =>
+ response.status mustBe play.api.http.Status.OK
+ }
+ }
+ }
+}
+