If you haven’t been through it yet, this what the process of creating a new project with the Play Framework version 2.6 looks like:
$ sbt new playframework/play-scala-seed.g8 WARN: No sbt.version set in project/build.properties, base directory: /Users/al/Projects/Scala/Play [warn] Executing in batch mode. [warn] For better performance, hit [ENTER] to switch to interactive mode, or [warn] consider launching sbt without any commands, or explicitly passing 'shell' [info] Set current project to play (in build file:/Users/al/Projects/Scala/Play/) This template generates a Play Scala project name [play-scala-seed]: Scrupal6 organization [com.example]: com.alvinalexander play_version [2.6.12]: sbt_version [1.1.1]: scalatestplusplay_version [3.1.2]: Template applied in ./scrupal6
That last sentence of output is slightly erroneous, the actually directory is named Scrupal6 (with a capital letter “S”).
Inside that directory this is what you see when your Play Framework project is created:
drwxr-xr-x 15 al staff 510 Mar 31 10:54 . drwxr-xr-x 9 al staff 306 Mar 31 10:53 .. drwxr-xr-x 3 al staff 102 Mar 31 10:54 .g8 -rw-r--r-- 1 al staff 80 Mar 31 10:54 .gitignore drwxr-xr-x 3 al staff 102 Mar 29 14:07 Database drwxr-xr-x 4 al staff 136 Mar 31 10:54 app -rw-r--r-- 1 al staff 1010 Mar 31 10:54 build.gradle -rw-r--r-- 1 al staff 526 Mar 31 10:54 build.sbt drwxr-xr-x 6 al staff 204 Mar 31 10:54 conf drwxr-xr-x 3 al staff 102 Mar 31 10:54 gradle -rwxr--r-- 1 al staff 5296 Mar 31 10:53 gradlew -rw-r--r-- 1 al staff 2260 Mar 31 10:53 gradlew.bat drwxr-xr-x 5 al staff 170 Mar 31 10:54 project drwxr-xr-x 5 al staff 170 Mar 31 10:54 public drwxr-xr-x 3 al staff 102 Mar 31 10:54 test
This is what the Unix ‘find’ command shows the directory structure looks like:
. ./.g8 ./.g8/form ./.g8/form/app ./.g8/form/app/controllers ./.g8/form/app/controllers/$model__Camel$Controller.scala ./.g8/form/app/views ./.g8/form/app/views/$model__camel$ ./.g8/form/app/views/$model__camel$/form.scala.html ./.g8/form/default.properties ./.g8/form/test ./.g8/form/test/controllers ./.g8/form/test/controllers/$model__Camel$ControllerSpec.scala ./.gitignore ./app ./app/controllers ./app/controllers/HomeController.scala ./app/views ./app/views/index.scala.html ./app/views/main.scala.html ./build.gradle ./build.sbt ./conf ./conf/application.conf ./conf/logback.xml ./conf/messages ./conf/routes ./Database ./Database/tqm-sql.20180328 ./gradle ./gradle/wrapper ./gradle/wrapper/gradle-wrapper.jar ./gradle/wrapper/gradle-wrapper.properties ./gradlew ./gradlew.bat ./project ./project/build.properties ./project/plugins.sbt ./project/scaffold.sbt ./public ./public/images ./public/images/favicon.png ./public/javascripts ./public/javascripts/main.js ./public/stylesheets ./public/stylesheets/main.css ./test ./test/controllers ./test/controllers/HomeControllerSpec.scala
(Interestingly, it still doesn’t create a models folder. I’m not sure what the philosophy is behind that.)
The Play Framework build.sbt file
Here’s the auto-generated Play Framework build.sbt file:
name := """Scrupal6""" organization := "com.alvinalexander" version := "1.0-SNAPSHOT" lazy val root = (project in file(".")).enablePlugins(PlayScala) scalaVersion := "2.12.4" libraryDependencies += guice libraryDependencies += "org.scalatestplus.play" %% "scalatestplus-play" % "3.1.2" % Test // Adds additional packages into Twirl //TwirlKeys.templateImports += "com.alvinalexander.controllers._" // Adds additional packages into conf/routes // play.sbt.routes.RoutesKeys.routesImport += "com.alvinalexander.binders._"
Starting/running the new Play Framework app
You run your new Play Framework app using sbt
, specifically the sbt run
command. Here’s what that process looks like:
> sbt [info] Loading settings from idea.sbt ... [info] Loading global plugins from /Users/al/.sbt/1.0/plugins [info] Updating ProjectRef(uri("file:/Users/al/.sbt/1.0/plugins/"), "global-plugins")... [info] Done updating. [info] Loading settings from plugins.sbt,scaffold.sbt ... [info] Loading project definition from /Users/al/Projects/Scala/Play/Scrupal6/project [info] Updating ProjectRef(uri("file:/Users/al/Projects/Scala/Play/Scrupal6/project/"), "scrupal6-build")... [info] Done updating. [warn] Found version conflict(s) in library dependencies; some are suspected to be binary incompatible: [warn] * org.webjars:webjars-locator-core:0.33 is selected over 0.32 [warn] +- com.typesafe:npm_2.12:1.2.1 (depends on 0.32) [warn] +- com.typesafe.sbt:sbt-web:1.4.3 (scalaVersion=2.12, sbtVersion=1.0) (depends on 0.32) [warn] * org.codehaus.plexus:plexus-utils:3.0.17 is selected over {2.1, 1.5.5} [warn] +- org.apache.maven:maven-settings:3.2.2 (depends on 3.0.17) [warn] +- org.apache.maven:maven-repository-metadata:3.2.2 (depends on 3.0.17) [warn] +- org.apache.maven:maven-aether-provider:3.2.2 (depends on 3.0.17) [warn] +- org.apache.maven:maven-model:3.2.2 (depends on 3.0.17) [warn] +- org.apache.maven:maven-core:3.2.2 (depends on 3.0.17) [warn] +- org.apache.maven:maven-artifact:3.2.2 (depends on 3.0.17) [warn] +- org.apache.maven:maven-settings-builder:3.2.2 (depends on 3.0.17) [warn] +- org.apache.maven:maven-model-builder:3.2.2 (depends on 3.0.17) [warn] +- org.sonatype.plexus:plexus-sec-dispatcher:1.3 (depends on 1.5.5) [warn] +- org.eclipse.sisu:org.eclipse.sisu.plexus:0.0.0.M5 (depends on 2.1) [warn] * com.google.guava:guava:23.0 is selected over {10.0.1, 16.0, 20.0} [warn] +- io.methvin:directory-watcher:0.3.2 (depends on 23.0) [warn] +- com.fasterxml.jackson.datatype:jackson-datatype-guava:2.8.8 (depends on 10.0.1) [warn] +- org.eclipse.sisu:org.eclipse.sisu.plexus:0.0.0.M5 (depends on 10.0.1) [warn] +- com.spotify:docker-client:8.9.0 (depends on 10.0.1) [warn] Run 'evicted' to see detailed eviction warnings [info] Loading settings from build.sbt ... [info] Set current project to Scrupal6 (in build file:/Users/al/Projects/Scala/Play/Scrupal6/) [info] sbt server started at local:///Users/al/.sbt/1.0/server/acf366110f0ed262c367/sock [Scrupal6] $ run [info] Updating ... [info] Done updating. [warn] Found version conflict(s) in library dependencies; some are suspected to be binary incompatible: [warn] * com.google.guava:guava:22.0 is selected over 19.0 [warn] +- com.typesafe.play:play_2.12:2.6.12 (depends on 22.0) [warn] +- com.google.inject:guice:4.1.0 (depends on 19.0) [warn] * com.typesafe.akka:akka-stream_2.12:2.5.11 is selected over 2.4.20 [warn] +- com.typesafe.play:play-streams_2.12:2.6.12 (depends on 2.5.11) [warn] +- com.typesafe.akka:akka-http-core_2.12:10.0.11 () (depends on 2.4.20) [warn] * com.typesafe.akka:akka-actor_2.12:2.5.11 is selected over 2.4.20 [warn] +- com.typesafe.akka:akka-stream_2.12:2.5.11 () (depends on 2.5.11) [warn] +- com.typesafe.akka:akka-slf4j_2.12:2.5.11 () (depends on 2.5.11) [warn] +- com.typesafe.play:play_2.12:2.6.12 (depends on 2.5.11) [warn] +- com.typesafe.akka:akka-parsing_2.12:10.0.11 () (depends on 2.4.20) [warn] Run 'evicted' to see detailed eviction warnings --- (Running the application, auto-reloading is enabled) --- [info] p.c.s.AkkaHttpServer - Listening for HTTP on /0:0:0:0:0:0:0:0:9000 (Server started, use Enter to stop and go back to the console...)
One the app is running, just go to this URL to see the initial output:
- http://localhost:9000
Summary
All of this process is very different than the old play new
command, so I thought I’d show the process and output here. You can find more information about creating new Play Framework projects at this PlayFramework.com URL.