You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写pom.xml实现Maven构建生成的Java子项目?

问题

需要编写pom.xml完成以下三步操作:

  1. 从Sonatype Nexus仓库下载专有代码生成器
  2. 执行代码生成器生成Java项目
  3. 构建生成的项目

当前已完成前两步的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,可以通过以下方式:

  1. 在代码生成器执行完成后,用maven-antrun-plugin动态修改父pom的<modules>节点,添加Project1和Project2
  2. 但这种方式需要编写Ant脚本修改XML,复杂度较高,不如invoker插件直接

内容的提问来源于stack exchange,提问作者Monorom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 23:10:24