Play 项目中的简单 SBT 模块导致 Play 因未知原因而崩溃 - play 2.1
Posted
技术标签:
【中文标题】Play 项目中的简单 SBT 模块导致 Play 因未知原因而崩溃 - play 2.1【英文标题】:Simple SBT Module in Play Project Causes Play to Crash for Unknown reason - play 2.1 【发布时间】:2013-03-13 17:05:18 【问题描述】:https://github.com/jasongoodwin/play21-multimodule-demo 有代码。 我已经在 3 个不同的项目中重现了这个问题。我不知道怎么了。 一旦将聚合和dependsOn 放入build.scala 文件中,项目会在尝试开始播放时抛出错误。
[info] 从 /Users/jgoodwin/.sbt/plugins [info] 加载全局插件 从加载项目定义 /Users/jgoodwin/Development/src/ninjakeyboard/test/tmp/play21-multimodule-demo/project [错误] java.lang.ExceptionInInitializerError [错误] 使用'last' 完整的日志。项目加载失败:(r)etry、(q)uit、(l)ast 或 (忽视? q
构建文件
import sbt._import Keys._import play.Project._
object ApplicationBuild 扩展 Build
val appName = "multimodule-demo" val appVersion = "1.0-SNAPSHOT" //val scalaVersion = "2.10.0"
val appDependencies = Seq( // 在此处添加您的项目依赖项, 数据库, 异常)
val buildSettings = ( scalaVersion := "2.10.0" )
val main = play.Project(appName, appVersion, appDependencies, path = 文件(“网络”))。设置( // 这里添加你自己的项目设置 ).aggregate(testmodule).dependsOn(testmodule)
val 测试模块 = 项目( “测试模块”, 文件(“测试模块”), 设置 = buildSettings )
【问题讨论】:
可能需要更多信息,因为开放变量太多。它可能归结为 repos 不可用,目标和运行时 SBT 版本之间的冲突。你能在加载过程中得到完整的日志吗? 带有应用程序的 github 存储库在那里 - 您可以查看并尝试。对我来说变量太多了,无法提供比实际代码本身更有用的东西。 hmmmm...此时我可能会建议复制现有模块并将其用作“模板”。然后做一个 DIFF 看看你是否错过了什么。筛选整个 repo 需要做很多工作 我已经重现了 3 次问题。这只是一个带有用于子模块的 g8 模板的新项目。我遵循了播放文档,这就是结果。找不到任何在 2.1 上完成此操作的人。 您的项目结构与常规 Play 项目相比看起来完全不同。我对 SBT 没有经验,只是播放命令,也许结构导致崩溃。 【参考方案1】:我注意到在您的 github build.scala 中 testmodule 在主模块之后声明(并初始化),因此在项目加载期间出现空异常。 我犯了同样的错误,并且以正确的顺序放置模块使其工作。 我刚开始玩 Play2 和 Scala,但我相信使用 lazy val 也会有所帮助。
【讨论】:
谢谢 - 我会检查并尝试。这是一个很好的堆栈信息。 我证明在非播放 sbt 项目中遇到相同的 java.lang.ExceptionInInitializerError。通过先放置依赖任务来解决它(它最初的顺序错误,我认为没关系)。【参考方案2】:尝试创建一个新项目:
-
运行命令:
play new MyApp
运行play clean eclipse
创建目录modules
(在 MyApp 中)
运行命令play new MyModule
运行命令play clean eclipse
将控制器重命名为 MyModuleCon,并更改路由文件
运行命令play clean publish-local
将依赖项添加到您的 MyApp Build.scala 中:"mymodule" % "mymodule_2.10" % "1.0-SNAPSHOT"
将主路由重命名为 app.routes(因为模块也有路由,虽然可以删除!)
在主项目上运行:play dependencies eclipse
瞧,你有你的子模块,见我的 github:https://github.com/adis-me/PlayModuleExample
只需运行play run
并访问主项目:http://localhost:9000
,然后访问子模块:http://localhost:9000/module
。
我认为这对你来说应该可以解决问题!
编辑:2013-03-27
把上面的配置改成真正的子项目设置,按照以下步骤操作:
-
在 MyApp 上运行:
play clean
更改 MyApp 的 Build.scala 文件:
object ApplicationBuild 扩展 Build
val appName = "MyAppp"
val appVersion = "1.0-SNAPSHOT"
val appDependencies = Seq(
// Add your project dependencies here,
javaCore,
javaJdbc,
javaEbean
)
val subproject = play.Project(
"sub-project", appVersion, appDependencies, path = file("modules/MyModule")
)
val main = play.Project(appName, appVersion, appDependencies).settings(
// Add your own project settings here
).dependsOn(subproject).aggregate(subproject)
-
运行命令:
play clean eclipse
运行命令:play run
就是这样,您不能访问上述相同的网址。 可能是您的想法无法识别子项目中的类,只需将 MyModule 项目引用为主项目的引用库即可。
祝你好运!
【讨论】:
我会试试这个。请注意,尽管您仍然没有像文档这样的另一个文件夹中的播放项目:playframework.com/documentation/2.1.0/SBTSubProjects 请参阅那里的第一个代码示例。 不确定这是否是 Intellij 唯一的问题,因为我使用的是最终许可证,但我不这么认为。 是的,您可以使用这个示例(带有两个 Play 项目)并使其工作,然后尝试转换或添加一个“常规”SBT 项目。我只处理过 Play 项目。祝你好运,请告诉我们你的进展。以上是关于Play 项目中的简单 SBT 模块导致 Play 因未知原因而崩溃 - play 2.1的主要内容,如果未能解决你的问题,请参考以下文章
如何设置 sbt/scala/play 多模块项目,该项目将与 Intellij scala 插件一起正常工作
Play 2.0 / SBT:从 Build.scala 中的某些/所有模块中排除某些传递依赖项
为啥在 Play 2.3 项目中 sbt 编译后 sbt 失败并显示 NoClassDefFoundError: play/Play$ in Play 2.2.x 项目?