我有一个Maven项目,我需要在其中执行两个代码生成步骤。一个生成一些Java类型,然后第二个依赖于那些Java类型来生成更多代码。有没有办法在我的构建过程中发生这两个步骤?
目前我的步骤是:
generate-sources
期间)compile
期间)但是我的问题是第二代码生成插件生成的任何内容都不会被编译(因为编译阶段已经完成)。如果我将第二个代码生成插件附加到早期阶段,则会失败,因为它需要第一个代码生成插件中的类出现在类路径中。
我知道我可以把它分成两个模块,其中一个依赖于另一个,但我想知道这是否可以在一个pom中实现。看起来需要一种在正常编译阶段完成后再次调用编译的方法。
有什么想法吗?
答案 0 :(得分:5)
您始终可以配置两个编译器插件的执行,两者都与编译阶段相关联。在其中一个你包括额外的东西:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<executions>
<execution>
<id>one</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
<configuration></configuration>
</execution>
<execution>
<id>two</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
<configuration>
<compilerArgument>-verbose -bootclasspath ${java.home}\lib\rt.jar</compilerArgument>
</configuration>
</execution>
</executions>
<plugin>
您也可以尝试<includes><include>path/</include></includes>
当给出与特定阶段匹配的多个执行时,它们将按照POM中指定的顺序执行,并且首先运行继承的执行。
但我完全没有得到你想要的东西。 http://maven.apache.org/plugins/maven-compiler-plugin/examples/set-compiler-source-and-target.html
答案 1 :(得分:3)
显而易见的解决方案(在编译阶段后生成代码)不起作用,因为Maven不允许对阶段重新排序。
正确的解决方案是使用modules。您需要两个:第一个模块包含代码生成器。在第二个模块中,您可以使用第一个模块中的生成器生成generate-sources
阶段的内容。
这种方法的最大优点是:你永远不会陷入某种循环(比如“A”需要生成需要“A”的代码)。因此,您的构建将更加简单,您将花费更少的时间来寻找奇怪的错误。
[更新] 在我的项目中,我从测试中运行代码生成器。如果没有特殊选项,文件将生成到临时文件夹中并与源进行比较。这让我可以看到生成的代码(which I put under version control)中出现意外更改的时间。
设置系统属性后,源文件将被覆盖,我可以将更改提交给我的VCS。