如何编写pom.xml实现Maven构建生成的Java子项目?
问题
需要编写pom.xml完成以下三步操作:
- 从Sonatype Nexus仓库下载专有代码生成器
- 执行代码生成器生成Java项目
- 构建生成的项目
当前已完成前两步的pom编写,但不清楚如何优雅实现第三步——生成的Project1和Project2都是Maven模块,结构如下:
|--> pom.xml | |--> .repository | |--> Generator.exe | |--> Project1 | |--> pom.xml | |--> src/main/java/project1 | |--> Project2 | |--> pom.xml | |--> src/main/java/project2
已编写的pom.xml内容如下:
<?xml version="1.0" encoding="utf-8" ?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <artifactId>parent</artifactId> <groupId>com.maven</groupId> <version>1.1.1</version> <relativePath/> </parent> <groupId>com.foo</groupId> <artifactId>foobar</artifactId> <version>1.0.0.0-SNAPSHOT</version> <packaging>pom</packaging> <name>foobar</name> <properties> <repository.directory>${project.basedir}/.repository</repository.directory> <dependency.codegenerator.version>1.0.0.0-SNAPSHOT</dependency.codegenerator.version> <dependency.codegenerator.directory>${repository.directory}</dependency.codegenerator.directory> <dependency.codegenerator.exe>${repository.directory}/Generator.exe</dependency.codegenerator.exe> </properties> <build> <plugins> <!-- Get generator --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>unpack</id> <phase>validate</phase> <goals> <goal>unpack</goal> </goals> <configuration> <artifactItems> <!-- Generator--> <artifactItem> <groupId>com.foo</groupId> <artifactId>generator</artifactId> <version>${dependency.codegenerator.version}</version> <classifier>bin_x64</classifier> <type>zip</type> <outputDirectory>${dependency.codegenerator.directory}</outputDirectory> <overWrite>false</overWrite> </artifactItem> </artifactItems> </configuration> </execution> </executions> </plugin> <!-- Generate --> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <executions> <!-- Generate sources phase --> <execution> <id>generate-projects</id> <phase>generate-sources</phase> <configuration> <executable>${dependency.codegenerator.exe}</executable> <workingDirectory>${project.basedir}</workingDirectory> <arguments> <argument>${project.basedir}</argument> </arguments> </configuration> <goals> <goal>exec</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
不想通过逐个添加执行任务来构建每个项目,希望找到更优雅的实现方式。
解决方案
推荐使用maven-invoker-plugin来批量构建生成的模块,这个插件可以在当前Maven生命周期中,触发对指定目录下Maven项目的构建,无需手动逐个配置执行任务,实现方式如下:
在现有pom.xml的<plugins>节点中添加以下配置:
<!-- 构建生成的模块 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-invoker-plugin</artifactId> <version>3.5.0</version> <executions> <execution> <id>build-generated-projects</id> <!-- 放在generate-sources之后,确保生成完项目再构建 --> <phase>process-sources</phase> <goals> <goal>run</goal> </goals> <configuration> <!-- 指定生成的项目所在目录 --> <pomIncludes> <pomInclude>Project1/pom.xml</pomInclude> <pomInclude>Project2/pom.xml</pomInclude> </pomIncludes> <!-- 执行的Maven命令,这里用install,可按需改为compile/package等 --> <goals> <goal>install</goal> </goals> <!-- 传递当前项目的属性到子项目 --> <inheritPlugins>false</inheritPlugins> <cloneProjectsTo>${project.build.directory}/invoker</cloneProjectsTo> <settingsXml>${user.home}/.m2/settings.xml</settingsXml> </configuration> </execution> </executions> </plugin>
方案优势
- 无需手动编写多个exec任务调用mvn命令,配置更简洁
- 可以统一指定要执行的Maven目标(如install、package)
- 支持传递当前项目的环境配置(如settings.xml)到生成的模块
- 插件会自动处理模块间的依赖关系(如果Project1和Project2有依赖)
另一种可选方案:动态添加模块
如果希望生成的模块完全融入当前Maven reactor,可以通过以下方式:
- 在代码生成器执行完成后,用maven-antrun-plugin动态修改父pom的
<modules>节点,添加Project1和Project2 - 但这种方式需要编写Ant脚本修改XML,复杂度较高,不如invoker插件直接
内容的提问来源于stack exchange,提问作者Monorom
相关产品推荐
相关产品推荐

