【发布时间】:2014-08-26 20:14:33
【问题描述】:
我一直在尝试获取 IntelliJ 的编译,以通知我使用 Play Framework 2.3.3 和 Scala 2.11.2 的多模块项目中的源代码中的错误 - IntelliJ 版本为 13.1.4(最新稳定版,Ultimate版)。
多模块项目的布局与 Adrian Hurt 的 play-multidomain-seed 项目非常相似,请参阅 https://github.com/adrianhurt/play-multidomain-seed 或 Typesafe Activator 中的进一步参考。层次结构如下所示:
/root
/app
...
/conf
...
/modules
/module1
/app
...
/conf
...
/module2
/app
...
/conf
...
根项目有一个build.sbt 以及一个项目目录,其中包含一个 Scala 对象,该对象包含在构建过程中使用的通用设置和辅助方法。每个子项目都位于modules 文件夹中,并且还有一个build.sbt,它在根级别的build.sbt 中被引用。
现在,如果我使用前面提到的 play-multidomain-seed 项目模板,我可以使用 activator/sbt 让一切正常运行。在我使用“导入 SBT 项目”功能将项目导入 IntelliJ 后,我可以使用它,但是当我运行编译时(即 CTRL+F9 用于“制作项目”——运行增量编译或完全重新编译)它不会显示任何编译时错误(例如无法解析的符号或其他语法错误)。代码编辑器中的 Scala 高亮显示将显示正确的错误消息!在命令行上以sbt/activator 运行编译会发现错误,而 IntelliJ 只是说“编译成功完成”。
有趣的是,这似乎只发生在 Play 项目的子项目中,使用标准文件夹布局的库项目(即src/main/scala 等中的源代码)工作得很好 - 即我得到了正确的编译器反馈来自 IntelliJ。根据 IntelliJ 的“项目结构”对话框正确设置源和资源路径,即 Play 子项目使用 app 作为其源文件夹。
我有另一个基于 Play 2.2.x 的项目,它使用单个 Build.scala 文件而不是单个 build.sbt 文件并且工作正常 - 我还没有真正想出如何“移植”Build.scala 文件但是,转到 Play 2.3,因为他们已经改变了很多东西,并且文档说 build.sbt 是(尽可能)最佳实践。
我还没有开始重新安装 Scala/Play 插件。我可能会尝试使用 IntelliJ 14 的 EAP 来看看这是否会改变任何东西。我尝试了将项目导入 IntelliJ 的“导入 SBT 项目”方法以及 Play Framework 的 idea 命令和 sbt-idea 插件的 gen-idea 命令(这应该与 Play 所做的大致相似,因为它是我认为使用这个插件的某个版本/分支)。将设置 -> IDE 设置 -> Scala 中的“增量编译方式”设置从“IntelliJ IDEA”更改为“sbt 增量编译器”也不会改变任何内容。
那里的任何人也看到过这个问题,或者对我可以尝试什么有任何想法?这让我很难过:)。
TL;DR
如果我在 Scala 源文件中有错误,IntelliJ 启动的编译过程不会报告它,但控制台上的sbt 会正确报告它。 IntelliJ 荧光笔(在代码编辑器中)还将其标记为带有正确错误消息的错误(例如“无法解析符号 xyz”)。这仅适用于 Play 模块,而不适用于“标准”库项目。我认为编译器根本不编译 Play 模块中的源文件,原因我不明白。
【问题讨论】:
-
我刚刚完成了从 4 个
build.sbt文件中迁移项目(1 个用于引用 3 个子项目 sbt 文件的根项目)。在 Play 2.3 的 SBT 插件更改遇到一些障碍后,我在 playframework.com/documentation/2.3.x/Migration23 的迁移指南的帮助下运行了它。现在使用单个Build.scala文件并使用idea命令生成IDEA 项目文件,IntelliJ 实际上在构建项目时报告错误!我感到震惊和敬畏 -build.sbt文件或 IntelliJ 的 Scala 插件一定有问题......
标签: scala intellij-idea playframework