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

IT小君   2022-01-14T07:07:10

除了src/main/java文件夹之外,我们还有一个文件夹,其中包含一些生成的主要源代码所需的 Java 源代码。需要时手动调用代码生成生成的源代码被入源代码库。一切都将被构建并打包在一起

生成的 Java源将与主要源一起编译的最佳位置是什么?应该是:

  • /src/generated/javasrc/testInt/java(对于集成测试遵循相同的命名逻辑)
  • /generated-src/main/java(与“src 目录包含构建项目的所有源材料”相冲突)
  • /src/main/generated-java(嗯...generated-java不是类型)
  • ...?

第一个选项似乎最适合这种情况。你怎么认为?Maven 文档中是否有任何描述这种情况的内容(我忽略了)?你知道有类似结构的回购吗?

谢谢你。

回答

正如@Absurd-Mind 所建议的,我们正在考虑的方向是将源代码拆分为子模块(这在 gradle 中效果很好)。因此,生成的源和其他一些相关的源将进入它自己的子模块(它们将产生单独的工件),其余的将进入使用这个的其他子模块。谢谢你。

评论(5)
IT小君

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

  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-java和 src/test/generated-java)。

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

2022-01-14T07:07:10   回复
IT小君

据我所知,生成的源没有标准的文件夹结构。在我的项目中,我更喜欢src/gen/java一种符号。

2022-01-14T07:07:11   回复
IT小君

我完全同意接受的答案,只想为命名目录提供一个稍微不同的建议:

src-gen/main/java

背景:在Eclipse / Maven Tycho世界中(代码/资源生成经常扮演重要角色)有src-gen生成代码的目录,该目录已被建立为某种标准约定。(与 Maven 相比,默认项目布局有点不同,因为所有源文件都直接在srcand中src-gen)。

在一个 Maven 项目中,例如可以翻译成src-gen/main/java, src-gen/test/java, src-gen/test/resources. 我更喜欢将所有内容都移到“生成”目录中,因为

  • 目录树中的源src/main/javasrc-gen/main/java位于同一深度
  • 更清楚的是,它src-gen包含
    a)有助于构建的源/资源和
    b)生成的东西另一方面,名为“生成”的文件夹可以是任何东西。
  • 所有提到的优点generated/src/main/java仍然适用(例如易于清理)
  • 在快速谷歌搜索之后,看起来 Github 上已经有使用这种模式的项目

关于问题中其他建议的一些想法/意见:

  • 而不是/src/main/generated-java我可能宁愿使用类似的东西/src/main/java-gen,当按字母顺序对目录进行排序时,保持生成的代码和常规代码彼此相邻(<lang>-gen这也是 Eclipse 项目中已经使用的另一种模式)
  • 在我看来gen,更符合简短的官方名称之类srcit等等generated我已经src/gen/java在野外见过几次了,感觉它比/src/generated/java. 另一方面,一些 Maven 插件使用相当冗长的target/generated-sources/<lang>目录,所以generated-sources/main/java如果你不使用短名称,也可以是一个选项......

最终,我认为命名并不重要,这取决于您的喜好,因为这都不是官方约定。

2022-01-14T07:07:11   回复
IT小君

采用 NetBeans<project>/target/generated-sources/<tool>作为生成代码的位置。结果,您会在名为 的项目树中看到一个额外的叶子Generated Sources (<tool>),并且源代码将是可导航的,并且不会在标记中显示编译器错误。

因此,如果您提交代码,它将不在/target目录下,您必须为其他源代码位置设置 maven 项目。否则,我会建议保持采用的标准并将其置于<project>/target/generated-sources/<tool>.

2022-01-14T07:07:11   回复
IT小君

在 Maven 项目源文件存放里面src/main/javasrc/main/resources而测试类存放在里面src/test/java
在 Maven 生成的代码(编译代码)中存储到target/文件夹中。
构建 Maven 项目时,所有生成的代码都会在目标文件夹中更新。

2022-01-14T07:07:11   回复