Maven目录结构中生成的源文件的位置

50
除了 src/main/java 文件夹外,我们还有一个包含一些生成的 Java 源代码的文件夹,这些源代码是主要源代码所需的。在需要时手动调用代码生成。生成的源代码已检入源代码存储库中。所有内容将一起构建和打包。 最好的位置放置将与主要源代码一起编译的生成的 Java 源代码是什么?应该是: - /src/generated/java (遵循集成测试的 src/testInt/java 的相同命名逻辑) - /generated-src/main/java (与“src目录包含构建项目的所有源材料”发生冲突) - /src/main/generated-java (生成的 Java 不是类型) 第一个选项似乎是这种情况下最合适的选择。你认为呢?Maven 文档中有描述这种情况(我可能忽略了)吗?你知道有类似结构的任何存储库吗? 按照@Absurd-Mind的建议,我们考虑将源代码拆分为子模块(在 Gradle 中可以很好地工作)。因此,生成的源代码和其他相关源代码将进入自己的子模块(它们将生成单独的构件),其余部分将进入使用此模块的其他子模块。谢谢。

1
我通常使用target文件夹来存储生成的Java源代码。对于您的情况,它应该是类似于/target/main/java的东西。 - Balwinder Singh
当我使用目标文件夹时,我的源文件无法看到生成的类。我想我可以将它们放在子项目中并添加依赖项,但我不知道如何以这种方式将其全部放入同一模块中。 - MiguelMunoz
5个回答

53

我认为位置取决于源代码的生成和处理方式。

  1. 源代码是在构建过程中自动生成的:那么我会使用 target/main/java/, target/test/java/ 等目录。这些代码没有被提交到版本控制系统(CVS)中,因为您可以很容易地重新构建它们。如果您清除项目,则 target 目录将被删除,并且源代码将被重新生成。

  2. 源代码是通过外部工具或类似工具手动生成的:我会使用 generated/src/main/java/, generated/src/test/java/, generated/src/main/resources/ 等目录。这些代码应该被提交到版本控制系统中。一个好处是,一旦您看到顶层目录名称为 generated,则知道下面所有的文件/目录也是生成的。另外,在顶层目录下有标准的 Maven 目录结构。另一个好处是清理很容易,只需删除 generated 并重新创建即可,而无需查看许多其他目录(如在您的示例中:src/main/generated-javasrc/test/generated-java)。

编辑:另一个不错的解决方案是创建一个只包含生成源代码的 Maven 项目,例如 myproject-generated-1.0.3.jar。这个项目将成为您实际应用程序的依赖项。然后,您只需将生成的源代码放在 src/main/java 目录中。


1
@игор 我有点好奇,你更喜欢哪种路径/解决方案? - Absurd-Mind
4
那么目录下的target/generated-sources和target/generated-test-sources是用来做什么的?虽然这两个目录都是空的。我正在使用maven 3.2.5。当你构建项目时会创建这些目录。 - RuntimeException
2
由注解处理器生成的源代码通常(请参见fx Mapstruct或https://maven.apache.org/plugins/maven-compiler-plugin/compile-mojo.html#generatedSourcesDirectory)放置在*target/generated-sources/annotations*中。 - Hervian
1
@Hervian 我建议不要将目标目录中的任何内容提交到您的源代码控制中。 - Absurd-Mind
@Absurd-Mind 哦,是的,你说得对,我太匆忙了,没有注意到问题是关于放置将被检查的生成源代码的位置。好问题 - 我喜欢你的“EDIT”答案。 - Hervian
显示剩余3条评论

7
据我所知,生成的源代码没有标准的文件夹结构。在我的项目中,我更喜欢使用类似于 src/gen/java 的表示方法。

4

我完全同意接受的答案。我只是想为包含第三方工具生成的代码的目录提供一个稍微不同的命名建议:

src-gen/main/java

背景:在Eclipse/Maven Tycho的世界中(其中代码/资源生成通常起着重要作用),有一个名为“src-gen”的生成代码目录,已经成为某种标准惯例。(与Maven相比,默认项目布局有些不同,因为所有源文件直接位于“src”和“src-gen”中)。
在Maven项目中,例如可以将其翻译为“src-gen/main/java”,“src-gen/main/resources”,“src-gen/test/java”,“src-gen/test/resources”。我更喜欢这种方式,而不是将所有内容移动到“generated”目录中,因为:
- 在“src/main/java”和“src-gen/main/java”中的源文件处于目录树中的相同深度。 - 更清楚地表明“src-gen”包含生成的源/资源,对构建有所贡献。另一方面,仅命名为“generated”的文件夹并不能告诉您有关其内容的信息。它可能包含任何内容,如生成的文档或生成的测试数据,或者它可能只是一个临时文件夹。 - 所有提到的“generated/src/main/java”的优点仍然适用(例如,易于清理)。 - 经过快速的谷歌搜索,看起来已经有在Github上使用这种模式的项目了。
对于问题中的其他建议,一些想法/意见如下:
- 我可能会选择类似于“/src/main/java-gen”这样的东西,当按字母顺序排序目录时,将生成的和常规代码放在一起(“-gen”也是Eclipse项目中已经使用的另一种模式)。 - 在我看来,“gen”与简短的官方名称(如“src”,“it”等)更加匹配,而不是“generated”。我已经看到过几次“src/gen/java”的情况,并且觉得它比“/src/generated/java”更常见。另一方面,一些Maven插件使用相当冗长的“target/generated-sources/”目录,因此“generated-sources/main/java”也可以是一个选项,如果您不喜欢短名称的话...... - 最终,我认为命名并不是那么重要,这取决于您的个人喜好,因为这些都不是“官方”惯例。

1
NetBeans采用<project>/target/generated-sources/<tool>作为生成代码的位置。因此,您会在项目树中看到一个额外的叶子,命名为Generated Sources (<tool>),源代码将是可导航的,并且不会显示标记中的编译器错误。
因此,如果您提交了代码,它将不会在/target目录下,您需要为附加的源代码位置设置maven项目。否则,我建议保持采用的标准,并将东西放在<project>/target/generated-sources/<tool>下。

-5
在Maven项目中,源文件存储在src/main/javasrc/main/resources目录下,测试类存储在src/test/java目录下。
在Maven生成代码(编译代码)存储在target/文件夹下。
当您构建Maven项目时,所有生成的代码将被更新到目标文件夹中。

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