2016-03-31 12 views
3

Ich habe Schwierigkeiten, Informationen darüber zu finden, wie man das Play Framework in einem Multi-Projekt verwendet, in dem das Root-Projekt ein einfaches SBT-Projekt ist. Im Grunde ist dies mein Projekt Layout:Wie kann ich das Play Framework in einem Multiprojekt verwenden?

/
- gemeinsame
- some-andere-Projekte
- my-Play-Projekt
- - App
- - - Controller
- - conf
- - - Routen
- build.sbt

kann ich die Anwendung starten, indem my-play-project/run in der SBT-Konsole ausgeführt wird, aber wenn ich versuche, jede zu besuchen Seite, bekomme ich einen 500 und dieser Fehler protokolliert:

[error] /someorg/backend/cms/conf/routes: package router does not exist 
[error] /someorg/backend/cms/conf/routes: cannot find symbol 
[error] symbol: class ReversePostController 
[error] location: package controllers 
[error] /someorg/backend/cms/conf/routes: package controllers.javascript does not exist 
[error] /someorg/backend/cms/conf/routes: cannot find symbol 
[error] symbol: class ReversePostController 
[error] location: package controllers 
[error] /someorg/backend/cms/conf/routes: cannot find symbol 
[error] symbol: variable RoutesPrefix 
[error] location: class controllers.routes 
[error] /someorg/backend/cms/conf/routes: package controllers.javascript does not exist 
[error] /someorg/backend/cms/conf/routes: cannot find symbol 
[error] symbol: variable RoutesPrefix 
[error] location: class controllers.routes.javascript 
[error] (cms/compile:compileIncremental) javac returned nonzero exit code 
[info] Compiling 6 Scala sources and 1 Java source to /someorg/backend/cms/target/classes... 
[error] /someorg/backend/cms/conf/routes: package router does not exist 
[error] /someorg/backend/cms/conf/routes: cannot find symbol 
[error] symbol: class ReversePostController 
[error] location: package controllers 
[error] /someorg/backend/cms/conf/routes: package controllers.javascript does not exist 
[error] /someorg/backend/cms/conf/routes: cannot find symbol 
[error] symbol: class ReversePostController 
[error] location: package controllers 
[error] /someorg/backend/cms/conf/routes: cannot find symbol 
[error] symbol: variable RoutesPrefix 
[error] location: class controllers.routes 
[error] /someorg/backend/cms/conf/routes: package controllers.javascript does not exist 
[error] /someorg/backend/cms/conf/routes: cannot find symbol 
[error] symbol: variable RoutesPrefix 
[error] location: class controllers.routes.javascript 
[error] (cms/compile:compileIncremental) javac returned nonzero exit code 
[error] application - 

! @6pi9jna82 - Internal server error, for (GET) [/posts] -> 

play.sbt.PlayExceptions$CompilationException: Compilation error[package router does not exist] 
    at play.sbt.PlayExceptions$CompilationException$.apply(PlayExceptions.scala:27) 
    at play.sbt.PlayExceptions$CompilationException$.apply(PlayExceptions.scala:27) 
    at scala.Option.map(Option.scala:145) 
    at play.sbt.run.PlayReload$$anonfun$taskFailureHandler$1.apply(PlayReload.scala:49) 
    at play.sbt.run.PlayReload$$anonfun$taskFailureHandler$1.apply(PlayReload.scala:44) 
    at scala.Option.map(Option.scala:145) 
    at play.sbt.run.PlayReload$.taskFailureHandler(PlayReload.scala:44) 
    at play.sbt.run.PlayReload$.compileFailure(PlayReload.scala:40) 
    at play.sbt.run.PlayReload$$anonfun$compile$1.apply(PlayReload.scala:17) 
    at play.sbt.run.PlayReload$$anonfun$compile$1.apply(PlayReload.scala:17) 

Gibt es offensichtlich alles, was ich dieses Projekt fehle, dass Pausen? Der Controller ist auf die einfachste Weise definiert, wie in der Dokumentation erläutert. Das gleiche gilt für den einzigen Weg, den ich biete:

# Route 
GET  /posts  controllers.PostController.list 

// Controller 
package controllers 

import play.api.mvc.{Action, Controller} 

class PostController extends Controller { 
    def list = TODO 
} 

Ich bin mit Play-Framework-2.5.1 und dem Projekt zu bauen ist wie folgt definiert:

lazy val resolvers = ... 

lazy val projectSettings = Seq(
    organization := "some-organization", 
    scalaBinaryVersion := "2.11", 
    scalaVersion := "2.11.7", 
    externalResolvers := resolvers, 
    moduleConfigurations := Seq(), 
    retrieveManaged := true, 
    concurrentRestrictions in Global += Tags.limit(Tags.Test, 1), 
    transitiveClassifiers in Scope.GlobalScope := Seq("sources"), 
    ivyLoggingLevel := UpdateLogging.Quiet, 
    credentials += Credentials(Path.userHome/".ivy2"/".credentials"), 
    crossPaths := false, 
    publishMavenStyle := true, 
    publishArtifact in (Compile, packageDoc) := false, 
    publishArtifact in (Test, packageDoc) := false, 
    javacOptions := Seq("-source", "1.8", "-target", "1.8", "-encoding", "utf8"), 
    javaOptions := Seq("-server", "-XX:ReservedCodeCacheSize=192m", "-Xss2m"), 
    javaOptions in Test := Seq("-server", "-Xmx2g", "-XX:ReservedCodeCacheSize=192m", "-Xss2m"), 
    testFrameworks := Seq(TestFrameworks.ScalaTest, TestFrameworks.Specs2), 
    noTestCompletion(), 
    scalacOptions := Seq(
    "-deprecation", 
    "-optimize", 
    "-unchecked", 
    "-encoding", "utf8", 
    "-target:jvm-1.8", 
    "-Xlog-reflective-calls", 
    "-feature", 
    "-language:_" 
) ++ Seq(
     "by-name-right-associative", 
     "delayedinit-select", 
     "doc-detached", 
     "inaccessible", 
     "missing-interpolator", 
     "nullary-override", 
     "option-implicit", 
     "package-object-classes", 
     "poly-implicit-overload", 
     "private-shadow", 
     "unsound-match" 
    ).map(x => s"-Xlint:$x"), 
    compileOrder := CompileOrder.JavaThenScala, 
    fork in Test := true, 
    testOptions in Test := Seq(Tests.Filter(testName => testName.endsWith("Test") || testName.endsWith("Spec"))), 
    testOptions in Test += Tests.Argument("-oDF"), 
    testOptions in Test <+= (target in Test).map { t => 
    val testDir = t/"test-reports" 
    val maybeJUnitXml = if (flag("sbt.test.nojunitxml")) Seq.empty else Seq("-u", testDir.getAbsolutePath) 
    Tests.Argument(TestFrameworks.ScalaTest, maybeJUnitXml: _*) 
    } 
) 

lazy val cms = (project in file("cms")) 
    .settings(projectSettings) 
    .dependsOn(common, commonTest % "test", model % compileTest) 
    .enablePlugins(PlayScala) 

lazy val root = (project in file(".")) 
    .settings(projectSettings) 
    .aggregate(common, some-other-projects, cms) // TODO: Remove web 
+0

hinzuzufügen Ich konnte nicht ganz eine ähnliche Multi-Projekt-Build t bekommen o arbeite mit den Antworten unten. Wie auch immer, es hat sich als sehr hilfreich erwiesen, sich [Marius Soutier's Projektbeispiel für mehrere Projekte] näher anzusehen (https://github.com/mariussoutier/play-multi-multi-project). In meinem Fall hatte ich vergessen, 'scalaVersion in ThisBuild' zu verwenden, um die 'scalaVersion'-Einstellung auf alle Unterprojekte zu übertragen. –

Antwort

3

Update:

Jetzt, Sie haben Ihre build.sbt-Datei veröffentlicht, ich denke, das Problem ist die Kompilierreihenfolge. javac schlägt fehl, weil es das erwähnte Paket nicht finden kann.

Versuchen Sie, die standardmäßige Compilierreihenfolge Mixed zu verwenden.


Ich vermute, dass Sie nicht die SBT-Play-Plugin im my-play-project Teilprojekt haben ermöglichen und somit wurde Ihre Routen-Datei kompiliert nicht zu my-play-project/target/scala-2.11/routes/main/router

In my-play-project/build.sbt hinzu:

enablePlugins(PlayScala) 
+0

Das ist nicht der Fall, ich aktiviere das Plugin. Ich habe meine Frage mit der Build-Datei aktualisiert, wenn Sie es sich trotzdem ansehen möchten. –

+0

@cbley ist richtig. Selbst wenn ich in einem normalen Spiel-Projekt die Compiler-Reihenfolge auf JavaThenScala setze, bekomme ich den Fehler ".../conf/routes: Paket-Router existiert nicht" –

+0

Das stimmt, das Problem war mit der Kompilierreihenfolge, sorry für die späten Antworten! –

0

Versuchen Sie, die Play-Plug-in-Deklaration zum Stammprojekt unter /project/plugins.sbt

+0

Bereits erledigt, habe ich alle Schritte in der Dokumentation befolgt. –