我遇到过几次这个问题。对我来说,该项目将使用sbt 进行编译,但 Intellij 在解析引用时遇到了麻烦。以下是我发现的一些原因:
原因 1:命名空间混乱
我遇到过几次的一个原因是 Intellij 由于一些通配符导入而对命名空间感到困惑 - 它实际上与项目配置无关。
例如,我们发现如果您 import play.api._,那么 Intellij 将无法解析 import controllers.routes(或 controllers 中的任何其他内容)。如果你把它们换掉,没关系。
您可以通过移动导入来测试这是否是问题所在,或者查看相同的导入是否适用于不同的文件。
要检查 Intellij 是否真的无法解析您的类,请尝试从 _root_ 引用该类。在上面的示例中,Intellij 始终能够解析 _root_.controllers.routes,因此我知道这与我的项目配置方式无关。
(不过我不会在代码中留下那个_root_,我认为它有点丑陋和令人困惑!有人会删除它,然后问题就会回来。相反,我会尝试删除通配符导入)
原因 2:生成的来源未标记为“来源”
routes 等类和view 中的其他模板类是自动生成的。可能项目配置不正确,Intellij 没有意识到有自动生成的路由和 twirl 源文件。
在我的系统上,这些自动生成的文件夹以 src_managed(所有路由内容)和 twirl(所有模板内容)的形式存在于 target/scala-[VERSION]/ 中。
要检查/修复此问题,请执行以下操作:
- 文件 -> 项目结构
- 在左侧窗格中选择“模块”
- 在中心窗格中选择相关模块
- 选择右侧窗格中的“来源”标签
- 在
target 中找到上述文件夹并将src_managed/main 和twirl/main 标记为“来源”(注意您标记的是main 文件夹,而不是外部文件夹)
原因 3:target 被排除
我发现有时当您导入项目时,Intellij 会自动将target 目录标记为已排除。这意味着其中的“来源”被有效地忽略了。因此,请确保您的自动生成的源不在某些排除目录中。
要解决此问题,请按照 2 中的说明进行操作,并确保 target 文件夹没有特殊标记。在我的 Intellij 版本中,这意味着图标是正常的棕色 - 不是红色或蓝色。
如果您必须这样做,那么target 中的所有目录可能都不 被排除在外。为了完整起见,我会递归地将所有目录(如 resolution-cache 和 streams)标记为已排除,以便仅不排除 twirl 和 routes 源目录。
不幸的是,作为一个团队,我们经常遇到这些问题。我们使用的一个技巧是复制/粘贴彼此的.idea/modules/root.iml 文件,因为这是所有配置所在的位置。因此,如果一位开发人员有一个工作设置,只需将他们的 Intellij conf 复制到您自己的机器上。
这是我的 conf 的 sn-p,它与源和排除的配置方式有关(它基本上复制了上面 2 和 3 中的步骤)。我将它用于 play 2.3 应用程序,它可以工作。如果您有其他自动生成代码的复杂配置或依赖项,您可以尝试将其合并到您的 root.iml 中,或者如果您有一个简单的游戏项目,则只需将您的 content 元素替换为:
...
<content url="file://$MODULE_DIR$/../..">
<sourceFolder url="file://$MODULE_DIR$/../../app" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/../../app-2.11" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/../../target/scala-2.11/src_managed/main" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/../../target/scala-2.11/twirl/main" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/../../target/scala-2.11/src_managed/test" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/../../target/scala-2.11/twirl/test" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/../../test" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/../../test-2.11" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/../../conf" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/../../target/scala-2.11/resource_managed/main" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/../../target/scala-2.11/resource_managed/test" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/../../test/resources" type="java-test-resource" />
<excludeFolder url="file://$MODULE_DIR$/../../target/resolution-cache" />
<excludeFolder url="file://$MODULE_DIR$/../../target/streams" />
</content>
...