Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 编译阶段后通过Maven插件生成新源代码_Java_Maven_Code Generation_Pom.xml - Fatal编程技术网

Java 编译阶段后通过Maven插件生成新源代码

Java 编译阶段后通过Maven插件生成新源代码,java,maven,code-generation,pom.xml,Java,Maven,Code Generation,Pom.xml,我有一个Maven项目,需要在其中执行两个代码生成步骤。一个生成一些Java类型,然后第二个依赖于这些Java类型生成更多的代码。有没有一种方法可以在构建过程中同时执行这两个步骤 目前我的步骤是: 执行第一个代码生成插件(在生成源代码期间) 将生成类型的目录添加到生成路径 执行第二代代码插件(在编译期间) 然而,我的问题是,第二代代码生成插件生成的任何内容都不会被编译(因为编译阶段已经完成)。如果我将第二个代码生成插件附加到早期阶段,它将失败,因为它需要来自第一个代码生成插件的类出现在类路径上

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

目前我的步骤是:

  • 执行第一个代码生成插件(在
    生成源代码期间
  • 将生成类型的目录添加到生成路径
  • 执行第二代代码插件(在编译期间)
  • 然而,我的问题是,第二代代码生成插件生成的任何内容都不会被编译(因为编译阶段已经完成)。如果我将第二个代码生成插件附加到早期阶段,它将失败,因为它需要来自第一个代码生成插件的类出现在类路径上

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

    有什么想法吗?

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

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

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

    [UPDATE]在我的项目中,我通过测试运行代码生成器。如果没有特殊选项,文件将生成到临时文件夹中,并与源进行比较。这使我能够看到在生成的代码()中何时发生意外更改


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

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

    <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>
    
    
    org.apache.maven.plugins
    :

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

    但我并没有得到你想要的。

    感谢Udo的回复-您提出了一个有趣的替代方案,我没有考虑过。我认为你的格式有点混乱,为了清楚起见,你能纠正一下吗?@ssedano:执行顺序有保证吗?@Aarondigula看到我的添加。那么我如何绑定到生成源阶段?我必须为此编写一个maven插件吗?@Wudong:一个简单的maven模块只需要几行代码,但为了可靠地工作,您需要将代码生成器移动到一个stand aline项目(maven可能不会加载运行时生成的JAR)。如果这太费劲了,试试看我刚刚试过使用maven exec插件从一个依赖模块运行Java主类,它工作得很好,所以根本不需要独立的项目。谢谢你的启发。