Intellij无法识别antlr生成的源代码。

15

我在使用antlr4-maven-plugin生成的源代码时,遇到了Intellij无法识别生成的源代码的问题。所有对生成代码的引用都会出现错误,代码完成等功能也不能正常工作。

我使用maven来管理项目,并使用antlr4-maven-plugin生成代码。在maven下,我的代码可以正常引用并编译构建生成的代码。生成的代码位于/target/generated-sources/antlr4目录下,这也是Intellij所期望的。

我尝试过一些常见解决方法,如重新导入maven项目、更新文件夹、清除缓存等,但似乎都没有起到作用。

有人遇到过这种情况吗? 是否有办法在Intellij中直接指向生成的源代码?

7个回答

18

问题

target/generated-sources/antlr4 没有自动标记为源目录,而它的直接子目录 com.example 是。Intellij Idea 无法检测到位于 target/generated-sources/antlr4/com.example 中的类的正确包。

原因

源文件 *.g4src/main/antlr4/com.example 中,但实际上应该是 src/main/antlr4/com/example。请注意 /。你可能忘记在Idea中将 src/main/antlr4 标记为源目录,当你认为你正在创建包结构时,实际上只创建了一个名为 com.example 的单一目录。

修复方案

src/main/antlr4 标记为源目录,创建正确的目录结构 src/main/antlr4/com/example,然后重新编译。

替代方案

进入“项目结构 - 模块 - 源文件夹”,找到 target/generated-sources/antlr4/com.example,点击“编辑属性”,将“包前缀”设置为 com.example


相关但不同的问题在这里


5

以下是对我有效的步骤:

  1. 在右侧选项卡中打开Maven项目
  2. 右键单击包含我的antlr代码的模块
  3. 点击生成源代码和更新文件夹

1
嘿,真的成功了!谢谢。生成的源文件夹被标记为生成的源根目录,其余的目标文件夹仍然被忽略。完美。 - Pierre Henry
这个解决了我的问题!谢谢。 - Pavanraotk

5

我的问题在某种程度上类似于@spilymp的问题:

我直接将*.g4文件放在src/main/antlr4文件夹中:

.
├── src/
|   └── main/
|       ├── antlr/
|       |   ├── Main.g4
|       |   └── imported.g4
|       └── java/
|           └── com/
|               └── test/
|                   └── Test.java

这导致源代码被生成到 default 包中。我修改了包结构,使其与Java的包结构匹配:
.
├── src/
|   └── main/
|       ├── antlr/
|       |   ├── com/
|       |   |   └── test/
|       |   |       └── Main.g4            
|       |   └── imports/
|       |       └── imported.g4
|       └── java/
|           └── com/
|               └── test/
|                   └── Test.java

(请确保在 src/main/antlr4/imports 中直接导入)
完成后,只需从Maven菜单中运行antlr4目标([模块] > 插件 > antlr4 > antlr4:antlr4),将生成源文件并保存至默认位置(target/generated-sources/antlr4)。在Intellij中,它们已被标记为蓝色的“generated-sources”图标,现在可以导入MainParser类了!

4
我遇到了一个我认为可能是相似的问题。 我新使用IntelliJ,所以我有些猜测。
你的项目中的gen文件夹是褐色的(即资源文件)还是蓝色的(源代码)?
在我成功将gen文件夹注册为包含源代码之前,我无法使我的项目识别生成的代码。
很抱歉要说,你可能需要调整一下 - 我不记得我是如何做到的 - 但在我改变这个之后一切都好了。

1
是的,我以前也遇到过这个问题。通常点击所有正常按钮就可以解决了。所有正常按钮包括:Maven编译、重新导入项目、生成源代码、无效缓存、重启IDEA。 - oillio

4
原来是我调整了偏好设置导致了这个问题。如果其他人也遇到了这个问题,可以按照以下步骤解决:
1. 如v0rl0n所提到的,首先确保gen文件夹已被列为源代码目录。请进入模块设置 -> 模块 -> 源,在右侧找到蓝色的源文件夹并确认生成的源文件夹已被列出(行上应有[generated]标记)。
2. 如果你的生成的源文件夹已经被列出,但仍未被识别,请进入偏好设置 -> 文件类型,查看忽略的文件和文件夹字段。确保没有列出任何与你的生成的源文件夹匹配的内容。
在我的情况下,我将target添加到了列表中,这导致了问题,并且花费了很长时间才找到。

1

我有一个类似的问题。Intellij在java文件夹中找到了我的生成代码,但没有在java的子文件夹中找到。我通过将我的语法文件(*.g4)放入包(com.test)中解决了这个问题:

.
├── src/
|   └── main/
|       ├── antlr/
|       |   └── com.test/
|       |       └── Test.g4
|       └── java/
|           └── test/
|               └── Test.java
└── target/
    └── generated-sources/
        └── antlr/
            └── com.test/
                ├── TestBaseListener.java
                └── ...

1
最简单的解决方法是右键点击 gen 目录,选择 Mark Directory as -> Sources Root

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接