无法解析符号路径

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/maintwirl/main 标记为“来源”(注意您标记的是main 文件夹,而不是外部文件夹)

原因 3:target 被排除

我发现有时当您导入项目时,Intellij 会自动将target 目录标记为已排除。这意味着其中的“来源”被有效地忽略了。因此,请确保您的自动生成的源不在某些排除目录中。

要解决此问题,请按照 2 中的说明进行操作,并确保 target 文件夹没有特殊标记。在我的 Intellij 版本中,这意味着图标是正常的棕色 - 不是红色或蓝色。

如果您必须这样做,那么target 中的所有目录可能都 被排除在外。为了完整起见,我会递归地将所有目录(如 resolution-cachestreams)标记为已排除,以便仅不排除 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

"error LNK2019: 无法解析的外部符号"原因分析

无法解析的外部符号 C++

QT调用matlab引擎提示无法解析的外部符号

Xcode13符号化解析

无法解析的外部符号