无法解析符号路径
Posted
技术标签:
【中文标题】无法解析符号路径【英文标题】:Cannot resolve symbol routes 【发布时间】:2014-11-21 14:26:00 【问题描述】:这个在 IntelliJ IDEA 14 中找不到的“路由”有什么问题?
【问题讨论】:
实际上可以使用更多信息,例如播放版本,路线配置,错误消息,日志,越多越好。 Intellij Idea 14, Play 2.3.6 , 没有更多错误消息只是 Intellij idea 无法解析符号“路由”。 试试redirect(controllers.routes.App...
尝试返回重定向(controllers.routes.Application.index());结果相同
你能建立你的项目吗?如果我没记错的话,Play 会从那里生成routes
文件到target
文件夹中。
【参考方案1】:
根据documentation:
对于路由文件中使用的每个控制器,路由器都会生成 路由包中的“反向控制器”,具有相同的操作 方法,具有相同的签名,但返回一个 play.mvc.Call 而不是 play.mvc.Result。
在编译应用程序时会生成反向控制器。因此,您需要编译您的应用程序以使这些类在您的 IDE 中可访问。为了确保 Idea 正确找到文件,您可以右键单击包含生成的类的目标子目录并将其标记为源目录。
【讨论】:
【参考方案2】:我遇到过几次这个问题。对我来说,该项目将使用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>
...
【讨论】:
【参考方案3】:你试过没有***
吗?
return redirect(routes.Application.index();
【讨论】:
是的,我刚刚使用了 return redirect(routes.Application.index(); 我有 Intellij 15,Play 2.4.6 框架。我也遇到了同样的cannot resolve symbol routes
错误。如何解决这个问题?需要帮助。【参考方案4】:
我解决了执行在另一个线程https://***.com/a/34085037/5078874中指定的这两个步骤
(我使用的是 Idea 15.0.1)
addSbtPlugin("com.github.mpeltonen" % "sbt-idea" % "1.6.0")
然后执行命令:
sbt gen-idea
【讨论】:
【参考方案5】:正如biesior 建议的那样,这对我有用:
return redirect(controllers.routes.Application.index());
【讨论】:
以上是关于无法解析符号路径的主要内容,如果未能解决你的问题,请参考以下文章
VS编写C++/C时出现错误LNK2001 无法解析的外部符号 main