【问题标题】:How can I use the Play Framework in a multi-project?如何在多项目中使用 Play 框架?
【发布时间】:2016-07-20 03:06:40
【问题描述】:

我正在努力寻找有关如何在根项目是普通 SBT 项目的多项目中使用 Play 框架的任何信息。基本上这是我项目的布局:

/
- 常见
- 其他一些项目
- 我的游戏项目
- - 应用
- - - 控制器
- - 会议
- - - 路线
- build.sbt

我可以通过在 SBT 控制台中运行 my-play-project/run 来启动应用程序,但是当我尝试访问任何页面时,我得到一个 500 并且记录了这个错误:

[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)

有什么明显的我遗漏的东西会破坏这个项目吗?如文档中所述,控制器以最简单的方式定义。我提供的唯一路线也是如此:

# Route
GET       /posts        controllers.PostController.list

// Controller
package controllers

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

class PostController extends Controller {
  def list = TODO
}

我使用的是 Play Framework 2.5.1,项目构建定义如下:

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

【问题讨论】:

  • 我无法使用以下答案获得类似的多项目构建。然而,仔细查看Marius Soutier's Play Multi-Project Sample Project 非常有帮助。就我而言,我忘记使用scalaVersion in ThisBuildscalaVersion 设置传播到所有子项目。

标签: scala playframework sbt playframework-2.5


【解决方案1】:

更新:

现在您已经发布了 build.sbt 文件,我认为问题在于编译顺序。 javac 失败,因为它找不到提到的包。

尽量使用默认的Mixed编译顺序。


我怀疑您没有在 my-play-project 子项目中启用 sbt-play 插件,因此您的路由文件未编译为 my-play-project/target/scala-2.11/routes/main/router

my-play-project/build.sbt,添加:

enablePlugins(PlayScala)

【讨论】:

  • 不是这样,我正在启用插件。如果你想看一下,我用构建文件更新了我的问题。
  • @cbley 是对的。即使在正常的播放项目中,如果我将编译器顺序设置为 JavaThenScala 我也会收到错误“.../conf/routes: package router does not exist”
  • 没错,问题出在编译顺序上,抱歉回复晚了!
【解决方案2】:

尝试将 Play 插件声明添加到 /project/plugins.sbt 的根项目中

【讨论】:

    猜你喜欢
    • 2014-12-04
    • 2013-03-18
    • 1970-01-01
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多