我正在将一个较大的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.
6条答案
按热度按时间n1bvdmb61#
您可以在generate-sources阶段执行maven-compile-plugin。只需在现有执行之前添加另一个执行并配置它,以便它只为生成器拾取源代码。
或者将项目一分为二:使用单独的POM构建生成器,并将生成器库作为生成源代码的POM的依赖项。
就我个人而言,我会拆分项目。保持构建文件更干净,更容易维护。
p1iqtdky2#
我不想有两个不同的项目,所以我尝试设置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
用于生产罐 Package这是我的pom.xml:
字符串
jtoj6r0c3#
为了在一个项目中做到这一点,有三个步骤:
1.编译生成器代码
我们可以在
generate-sources
阶段使用maven-compiler-plugin
来完成。您也可以排除其他源文件。1.运行generator生成代码
我们可以在
process-sources
阶段使用exec-maven-plugin
。1.编译项目
下面是pom.xml的关键部分
字符串
kxxlusnw4#
我们面临着同样的问题。我们希望尽可能地尊重Maven的行为,不存在插件等问题...与Maven战斗太昂贵了!
我们意识到生成的代码的更新频率通常与我们手动编写的代码有很大的不同,所以分离代码对构建有很好的性能特征。所以我们接受将生成的类作为手动编写的依赖。
我们采用了下面的结构,与常规maven配置相比只有一个小小的变化,即源目录的变化。
父项目:Generations
我们为我们所有几代人创建了一个父项目。
注意:如果你想在同一个jar中生成多个结果,只需将它们放在同一个子目录中。
jar子项目:Generateds
第一个月
这种结构使我们能够:
<includes>
来处理一些类)。xwbd5t1u5#
我在这里发布了一个最小的工作设置https://github.com/baloise/inlinesourcecodegenerator它使用构建助手编译器和exec插件,并在同一个项目中的所有代码。
llmtgqce6#
下面是一个最小的、注解良好的
pom.xml
,它允许在同一个项目中生成代码,同时确保之后正确清理:字符串
XyzGenerator.java
文件中的CodeGenerator
类中的main
函数将输出目录作为第一个命令行参数;在上面,这是在<commandlineArgs>
标记中传递的。文件结构为:
型