5

我有一个 Maven 项目,我需要在其中执行两个代码生成步骤。一个生成一些 Java 类型,然后第二个依赖这些 Java 类型生成更多代码。有没有办法在我的构建过程中同时执行这两个步骤?

目前我的步骤是:

  1. 执行第一个代码生成插件(期间generate-sources
  2. 将生成类型的目录添加到构建路径
  3. 执行第二个代码生成插件(期间compile

但是我的问题是第二个代码生成插件生成的任何东西都不会被编译(因为编译阶段已经完成)。如果我将第二个代码生成插件附加到较早的阶段,它会失败,因为它需要第一个代码生成插件中的类出现在类路径中。

我知道我可以把它分成两个模块,一个依赖于另一个,但我想知道这是否可以在一个 pom.xml 中实现。似乎需要一种在正常编译阶段完成后再次调用 compile 的方法。

有任何想法吗?

4

2 回答 2

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

于 2011-01-04T16:44:03.283 回答
3

显而易见的解决方案(在编译阶段之后生成代码)不起作用,因为 Maven 不允许重新排序阶段。

正确的解决方案是使用模块。您需要两个:第一个模块包含代码生成器。在第二个模块中,您可以使用第一个模块中的生成器来生成generate-sources阶段中的某些内容。

这种方法的一大优势:你永远不会陷入某种循环(比如“A”需要生成的代码需要“A”)。因此,您的构建将更加简单,您将花费更少的时间寻找奇怪的错误。

[更新]在我的项目中,我从测试中运行代码生成器。如果没有特殊选项,文件将生成到临时文件夹中并与源文件进行比较。这使我可以看到生成的代码(我将其置于版本控制之下)何时发生了意外更改。

设置系统属性后,源文件将被覆盖,我可以将更改提交到我的 VCS。

于 2011-01-04T16:00:48.370 回答