通过在Maven中运行项目的java类生成源代码
我正在将一个较大的Ant构建转换为Maven。作为Ant构建的一部分,我们有几个步骤,通过调用项目的一个类来创建Java类,简化为:
javac SomeGenerator.java
java SomeGenerator generated # generate classes in generated/
javac generated/*.java
我已经将每个生成器拆分为它自己的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>
遗憾的是,由于上述原因,这项措施不起作用。将代码生成器拆分为两个项目,一个用于编译生成器,另一个用于生成DTO,这似乎有些过分
还有什么替代方案
使用Maven 2.2.1
# 1 楼答案
我们面临同样的问题。我们希望尽可能地尊重Maven的行为,对插件没有任何问题等等。。。和Maven战斗太贵了
我们意识到生成代码的更新频率通常与我们手动编写的代码非常不同,因此分离代码对于构建具有非常好的性能特征。所以我们接受将生成的类作为手动编写的类的依赖项
我们采用了下面的结构,与常规的maven配置相比,只做了一点小小的更改,即源目录中的更改
父项目:世代
我们为我们所有的世代创建了一个母项目
子jar项目:Generateds
它是Generations项目的子目录
它有一个JAR类型
源目录指向父级目标中的子目录
<sourceDirectory>../target/generated1</sourceDirectory>
它通常在自己的/target目录中编译
这种结构使我们能够:
<includes>
来仅处理一些类)李># 2 楼答案
您可以在GenerateSources阶段执行maven编译插件。只需在现有执行之前添加另一个执行,并对其进行配置,使其只拾取生成器的源代码
或者将项目一分为二:使用单独的POM构建生成器,并将生成器库作为生成源的POM的依赖项包含在内
就我个人而言,我会把这个项目分开。使生成文件更干净,更易于维护
# 3 楼答案
我不想有两个不同的项目,所以我尝试设置Maven,以便将生成的编译代码添加到最终的jar包中
这是我使用的有效解决方案:
process-classes
阶段(在compile
阶段之后执行):exec-maven-plugin
用于执行能够在target/generated-sources/java
文件夹中生成源文件的主类(在我的特定情况下,我使用Roaster library生成源代码)李>build-helper-maven-plugin
用于将生成的源添加到正确的位置prepare-package
阶段:maven-compiler-plugin
,以便检测更改并重新编译模块maven-jar-plugin
用于生成jar包这是我的pom。xml:
# 4 楼答案
我在这里发布了一个最小的工作设置https://github.com/baloise/inlinesourcecodegenerator 它使用buildhelper编译器和exec插件,所有代码都在同一个项目中
# 5 楼答案
为了在一个项目中实现这一点,有3个步骤:
编译生成器代码
我们可以在
generate-sources
阶段使用maven-compiler-plugin
来完成。您还可以排除其他源文件运行生成器生成代码
我们可以在
process-sources
阶段使用exec-maven-plugin
来完成编制项目
以下是pom的关键部分。xml