无法使用Intellij与生成的源文件夹

144

相关问题 如何配置 IntelliJ IDEA 和/或 Maven 以自动添加使用 jaxb2-maven-plugin 生成的 Java 源代码目录?

我有一个自定义插件,可以在 target/generated-sources 下生成源码(注意这里没有工具名称)。所以我得到的源码是像 target/generated-sources/com/mycompany 等等。

这种格式不能改变,那么我能否配置 Intellij 将其作为源文件夹添加进去呢?目前为止,我发现 Intellij 已经将 target/generated-sources/com 添加为源文件夹了。

请注意,我没有配置插件的选项!

更新1:我不认同我必须将我的生成源码放在一个工具名文件夹下的事实。这可能是一个好的约定,但如果我只有一个生成器,我就没有必要把它放在那里了吧?再说了,在我的 pom.xml 文件中,我有一个resources部分,其中清楚地指出target/generated-sources应该被视为源文件夹。这在 Eclipse 中完美地工作,所以我不知道为什么 Intellij 不会尊重我的设置。

TL;DR -> 当我将target/generated-sources放在pom.xml的资源部分时,为什么 Intellij 会过于热衷于将target/generated-sources/com添加到类路径中?


1
请查看https://dev59.com/Lmgv5IYBdhLWcg3wQ-kV。 - Vadzim
尝试这个解决方案,它可能会解决你的问题。 点击此处查看解决方案 - Asad Abdin
尝试这个解决方案,它可能会解决你的问题。 点击此处查看解决方案 - Asad Abdin
14个回答

271

我正在使用Maven(SpringBoot应用程序),解决方案如下:

  1. 右键单击项目文件夹
  2. 选择 Maven
  3. 选择 生成源代码并更新文件夹

然后,Intellij会自动将生成的源代码导入项目中。


不需要自己搞乱文件夹结构就能正常工作! - szab.kel
3
这个回答应该得到更高的评价——比被采纳的答案更加方便。 - stusrob
12
请注意,在最新版本的Intellij 2019.1中,您可以点击Maven菜单中的第二个按钮(位于右侧,展开Maven侧边栏,在顶部,是第二个按钮)。 - Roeland Van Heddegem
我还需要检查我的Maven settings.xml文件,因为它指向了错误的非默认仓库。 - Jonathan
像魔法一样运作! - Marcin Rzepecki
“自动”一词意味着Intellj在没有用户交互的情况下执行操作。但事实并非如此。每次IntelliJ决定清除源代码或/和资源时,都需要单击“生成源代码并更新文件夹”按钮。清除它们是自动完成的,但重新导入项目则不是。这种行为真的很烦人。 - ThomasCh

197

你可以更改项目结构,将该文件夹添加为“源代码”目录。

项目结构 → 模块 → 点击 generated-sources 文件夹并将其设置为 sources 文件夹。

或者:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>build-helper-maven-plugin</artifactId>
    <version>1.4</version>
    <executions>
        <execution>
            <id>test</id>
            <phase>generate-sources</phase>
            <goals>
                <goal>add-source</goal>
            </goals>
            <configuration>
                <sources>
                    <source>${basedir}/target/generated-sources</source>
                </sources>
            </configuration>
        </execution>
    </executions>
</plugin>

5
这个选项听起来很有趣。每次运行"mvn idea:idea",我都会失去这个设置。是否有一种声明带有这个“解决方法”的Maven IDEA插件的方式? - Kannan Ekanath
3
如果生成的源文件在build目录下,你无法将其添加进去,因为IDEA会排除build文件夹。 - NBW
1
@NBW 你不能手动操作,是的。但如果你删除你的模块,然后重新导入它(使用这个插件进行设置),IDE会正确地识别一切。 - Zoltán
6
你也可以右键点击任何文件夹,然后使用“标记为”功能。 - Pieter De Bie
6
虽然我的pom.xml文件包含这个片段,但是IDEA没有看到生成的源代码。在我的情况下,运行mvn idea:idea解决了这个问题。记录一下。 - mmdemirbas
显示剩余9条评论

32

使用Gradle时,每当您刷新Gradle设置时,项目设置都将被清除。相反,您需要在build.gradle中添加以下行(或类似行),我正在使用Kotlin:

在刷新Gradle设置时,Gradle会清除项目设置。因此,您需要在build.gradle文件中添加以下代码(或类似代码)。由于我使用的是Kotlin,所以代码如下:
sourceSets {
    main {
        java {
            srcDir "${buildDir.absolutePath}/generated/source/kapt/main"
        }
    }
}

这对我来说在IntelliJ的项目导入和gradle idea都有效。谢谢! :) - Chris Cooper
1
只有在我的依赖项中不使用annotationProcessor时,这才有效。 - cdalxndr

22

非常简单:

只需右键单击目录并将其标记为生成的源根目录。请参见下面的屏幕截图。

输入图片描述


1
哪个目录?(点击) - Fullstack
@Fullstack 一旦您生成了源文件夹,请右键单击它,然后选择“标记目录为” --> “已生成的源根”。这个解决方案对我有用。 - Arsalan Siddiqui

20

解决方法

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

这正是我们可以在源目录上设置包前缀的原因。


不同但相关的问题请参考这里


3
这个修复方法是我在搜索了数天之后唯一有效的。谢谢! - CNDyson
哦,谢谢。我刚更新了Intellij,他们改了图标。我没想到橙色的文件夹意味着它不是源文件。 - Pieter De Bie
我找了半天终于找到了。使用antlr4对我很有帮助。谢谢! - Piotr Tempes
2
对于ANTLR >=4.5.3(可能更早版本),只要我的语法位于 src/main/antlr4/<path-to-package>/ 目录下,它就会出现在 target/generated-sources/antlr4/<path-to-package> 目录中。IntelliJ 会自动将正确的目录标记为源根目录,不需要任何包前缀。我怀疑当人们将语法直接放在 src/main/antlr4 目录中时,可能需要这个修复,这通常是出于某种原因建议这样做的。 - Alex Reinking

11
通过在模块设置中移除“排除”来解决问题(右键单击项目,“打开模块设置”)。 enter image description here

7

那个插件的作者犯了大错。那不是正确的做法!

任何变通方法都将是一个巨大的hack,请让插件开发者知道他的bug。

很抱歉,这是唯一能做的事情。


好的,这里有一个hack,在你的插件执行之后,使用antrun插件将目录移动到其他地方:

<plugin>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.6</version>
    <executions>
      <execution>
        <phase>process-sources</phase>
        <configuration>
          <target>
            <move todir="${project.build.directory}/generated-sources/toolname/com"
                  overwrite="true">
                <fileset dir="${project.build.directory}/generated-sources/com"/>
            </move>
          </target>
        </configuration>
        <goals>
          <goal>run</goal>
        </goals>
      </execution>
    </executions>
</plugin>

在这个例子中,toolname 应该被替换成任何唯一标识创建代码的插件名称,com 代表所创建包的根目录。如果你有多个包根目录,你可能需要多个 <move> 任务。
但是如果插件将文件夹添加为源文件夹,则会出现问题。

谢谢Sean。我实际上观察到Intellij添加了target/generated-sources/com以及target/generated-sources(这是在“资源”部分明确添加的源目录)。有没有其他方法可以防止发生第一件事?如果没有,那么我将尝试您的解决方法。 - Kannan Ekanath
1
是的,作者应该使用 target/generated-sources/my-tool - Vlastimil Ovčáčík

6

对于仍在努力解决生成的源代码无法被IntelliJ识别的人,

一个原因可能是生成文件大小太大,导致它无法加载,然后您需要将以下行放入您的“自定义IntelliJ IDEA属性”中(在帮助菜单下)。

idea.max.intellisense.filesize=7500

4

我运行了mvn generate-resources命令,然后将/target/generated-resources文件夹标记为“源代码”(项目结构->项目设置->模块->选择/target/generated-resources->点击蓝色的“源代码”图标)。


1
这不是一种非常持久的做法。 - Kai

3

自动将目录标记为生成的源代码 当您运行mvn clean install时,如果您想将目录标记为生成的源代码,则可以使用此解决方案


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