【问题标题】:Generating new sources via Maven plugin after compile phase编译阶段后通过 Maven 插件生成新源
【发布时间】:2011-06-03 11:48:02
【问题描述】:

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

目前我的步骤是:

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

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

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

有什么想法吗?

【问题讨论】:

    标签: java maven code-generation pom.xml


    【解决方案1】:

    您始终可以配置编译器插件的两次执行,都与编译阶段相关联。在其中包含额外的东西:

    <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>
    

    你也可以试试&lt;includes&gt;&lt;include&gt;path/&lt;/include&gt;&lt;/includes&gt;

    根据official documentation

    当给定多个匹配特定阶段的执行时,它们将按照 POM 中指定的顺序执行,继承的执行首先运行。

    但我完全没有得到你真正想要的东西。 http://maven.apache.org/plugins/maven-compiler-plugin/examples/set-compiler-source-and-target.html

    【讨论】:

    • 感谢 Udo 的回复 - 你提出了一个我没有考虑过的有趣替代方案。我认为你的格式有点乱,为了清楚起见你能纠正它吗?
    • @ssedano:执行顺序有保障吗?
    • @AaronDigulla 看到我的补充。
    【解决方案2】:

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

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

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

    [UPDATE] 在我的项目中,我从测试中运行代码生成器。如果没有特殊选项,文件将生成到临时文件夹中并与源文件进行比较。这让我可以看到生成的代码何时发生意外更改 (which I put under version control)。

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

    【讨论】:

    • 我怎样才能绑定到 generate-sources 阶段呢?我必须为此编写一个 maven 插件吗?
    • @Wudong:一个简单的 Maven 模块只是几行代码,但要使其可靠工作,您需要将代码生成器移动到独立项目(Maven 可能不会加载在运行时生成)。如果这太费力了,试试maven.apache.org/plugins/maven-antrun-plugin
    • 我刚刚尝试使用 maven-exec-plugin 从依赖模块运行 Java 主类,它工作正常,所以毕竟不需要独立项目。感谢您的启发。
    猜你喜欢
    • 2012-06-11
    • 2011-05-06
    • 2014-07-11
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    • 2016-04-12
    • 2012-11-21
    • 2011-08-12
    相关资源
    最近更新 更多