通过在Maven中运行项目的java类来生成源代码

Rob*_*anu 11 java maven-2 code-generation

我正在将一个较大的Ant构建转换为Maven.作为Ant构建的一部分,我们有几个步骤通过调用项目的一个类来创建Java类,简化为:

javac SomeGenerator.java
java  SomeGenerator  generated # generate classes in generated/
javac generated/*.java
Run Code Online (Sandbox Code Playgroud)

我已经将每个生成器拆分为自己的Maven模块,但是我遇到了无法运行生成器的问题,因为它尚未在generate-sources阶段中编译.

我尝试过类似的东西

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.1.1</version>
            <executions>
                <execution>
                    <id>generate-model</id>
                    <goals>
                        <goal>java</goal>
                    </goals>
                    <phase>generate-sources</phase>

                    <configuration>
                        <mainClass>DTOGenerator</mainClass>
                        <arguments>
                            <argument>${model.generated.dir}</argument>
                        </arguments>
                    </configuration>
                </execution>
            </executions>
        </plugin>
Run Code Online (Sandbox Code Playgroud)

由于上面提到的原因,遗憾的是不起作用.将代码生成器分成两个项目,一个用于编译生成器,另一个用于生成DTO,这似乎有点过分.

有什么替代品?


使用Maven 2.2.1.

And*_*s_D 8

您可以在generate-sources阶段执行maven-compile-plugin.只需在现有执行之前添加另一个执行,并对其进行配置,以便它只获取生成器的源.

或者将项目拆分为两个:使用单独的POM构建生成器,并将生成器库包含为生成源的POM的依赖项.

我个人会拆分该项目.使构建文件更清晰,更易于维护.


xon*_*nya 5

我不想有 2 个不同的项目,所以我尝试设置 Maven 以将生成的编译代码添加到最终的 jar 包中。

这是我使用过的工作解决方案:

  • process-classes阶段(在阶段之后执行compile):
    • exec-maven-plugin用于执行能够在target/generated-sources/java文件夹中生成源文件的主类(在我的特定情况下,我使用Roaster 库来生成源代码);
    • build-helper-maven-plugin 用于在正确的位置添加生成的源
  • prepare-package阶段:
    • maven-compiler-plugin,为了检测变化并重新编译模块
    • maven-jar-plugin 用于生成 jar 包

这是我的 pom.xml:

<build>
    <plugins>

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.6.0</version>
            <executions>
                <execution>
                    <phase>process-classes</phase>
                    <goals>
                        <goal>java</goal>
                    </goals>
                    <configuration>
                        <mainClass>com.example.MyClassWriter</mainClass>
                        <arguments>
                            <argument>${project.basedir}</argument>
                            <argument>${project.build.directory}</argument>
                        </arguments>
                    </configuration>
                </execution>
            </executions>
        </plugin>

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>build-helper-maven-plugin</artifactId>
            <version>3.0.0</version>
            <executions>
                <execution>
                    <phase>process-classes</phase>
                    <goals>
                        <goal>add-source</goal>
                    </goals>
                    <configuration>
                        <sources>
                            <source>${project.build.directory}/generated-sources/java</source>
                        </sources>
                    </configuration>
                </execution>
            </executions>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.6.1</version>
            <executions>
                <execution>
                    <phase>prepare-package</phase>
                    <goals>
                        <goal>compile</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.0.2</version>
            <executions>
                <execution>
                    <phase>prepare-package</phase>
                </execution>
            </executions>
        </plugin>

    </plugins>
</build>
Run Code Online (Sandbox Code Playgroud)