【问题标题】:Play sub-projects do not compile播放子项目不编译
【发布时间】:2013-12-17 09:40:59
【问题描述】:

这是我的多项目 Play 2.2 应用程序的布局 - 我仍在尝试转换为 build.sbt:

myApp
  + app
  + build.sbt
  + conf
  |   + routes
  + project
  |  + build.properties
  |  + Build.scala
  |  + plugin.sbt
  + modules
     + myModule
         + app
         + build.sbt
         + conf
             + routes

myApp/build.sbt:

name := "myApp"

version := "1.0-SNAPSHOT"

organization := "com.mydomain"

lazy val myModule = project.in(file("modules/myModule"))

lazy val main = project.in(file(".")).dependsOn(myModule).aggregate(myModule)

play.Project.playScalaSettings

resolvers ++= Seq(
  Resolvers.typesafe,
  Resolvers.sonatype
)

myApp/projects/Build.scala:

import sbt._

object Resolvers {
  val sonatype = Resolver.sonatypeRepo("snapshots")
  val typesafe = "Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/"
}

myApp/modules/myModule/build.sbt:

name := "myModule"

libraryDependencies ++= Seq(
  "com.typesafe.play" %% "play" % "2.2.1" % "provided",
  "org.reactivemongo" %% "reactivemongo" % "0.10.0-SNAPSHOT",
  "org.reactivemongo" %% "play2-reactivemongo" % "0.10.0-SNAPSHOT"
)

resolvers ++= Seq(
  Resolvers.typesafe,
  Resolvers.sonatype
)

我在编译上面的项目时遇到了两个问题:

1)即使只有子项目有依赖(主项目只是很多子项目的容器),我也要在主构建文件myApp/build.sbt中指定resolvers;如果我不这样做,该项目将无法编译。这不是阻塞问题.. 但我想了解原因。

2) 然后,当我尝试编译项目时,我总是收到以下错误:

[error] /home/j3d/Projects/myApp/conf/routes:9: not found: value myModule
[error] -> /myModule myModule.Routes
[error] /home/j3d/Projects/myApp/conf/routes: not found: value myModule
[error] /home/j3d/Projects/myApp/conf/routes:12: not found: value myModule
[error] GET     /assets/*file               controllers.Assets.at(path="/public", file)
[error] /home/j3d/Projects/myApp/conf/routes:9: not found: value handler
[error] -> /myModule myModule.Routes
[error] four errors found
[error] (main/compile:compile) Compilation failed
[error] Total time: 12 s, completed Dec 1, 2013 6:34:55 PM

这里是 myApp/conf/routes...

GET     /                           controllers.Application.index

-> /myModule myModule.Routes

GET     /assets/*file               controllers.Assets.at(path="/public", file)

...最后是 myApp/modules/myModule/conf/myModule.routes:

GET     /myModule/greetings         controllers.myModule.Greetings.hello

我错过了什么吗?

【问题讨论】:

    标签: scala playframework sbt


    【解决方案1】:

    想出了如何让它工作,下面是我的解决方案。首先,我为所有项目 [myApp/project/Build.scala] 定义了默认设置和解析器:

    import sbt._
    import Keys._
    
    object ApplicationBuild extends Build {
    
      val defaultResolvers = Seq(
        Resolver.sonatypeRepo("snapshots"),
        "Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/"
      )
    
      val defaultSettings = Defaults.defaultSettings ++ Seq(
        scalacOptions += "-language:reflectiveCalls",
        resolvers ++= defaultResolvers
      ) 
    }
    

    然后我刚刚将ApplicationBuild.defaultSettings 导入到每个build.sbt 中。这是主项目构建文件[myApp/build.sbt]...

    name := "myApp"
    
    version := "1.0-SNAPSHOT"
    
    lazy val auth = project.in(file("modules/myModule"))
    
    lazy val main = project.in(file(".")).dependsOn(myModule).aggregate(myModule)
    
    ApplicationBuild.defaultSettings
    
    playScalaSettings
    

    ...这里是子项目构建文件[myApp/modules/myModule/build.sbt]:

    name := "myModule"
    
    ApplicationBuild.defaultSettings
    
    playScalaSettings
    
    libraryDependencies ++= Seq(
      "org.reactivemongo" %% "play2-reactivemongo" % "0.10.0-SNAPSHOT",
      "org.reactivemongo" %% "reactivemongo" % "0.10.0-SNAPSHOT"
    )
    

    它只是有效,希望它有所帮助;-)

    【讨论】:

    • 这个解决方案已经过去了几年,但仍然导致问题(至少对我而言)。在 Play 2.6 中,defaultSettings 已弃用,因此使用了 coreDefaultSettings,但是扩展的类/特征 Build 也已弃用,我找不到可以使用的替代方法。 IntelliJ 建议我使用.sbt format,但我不确定使用什么语法。有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多