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

如何在单个pom.xml中同时构建父POM与JAR?Maven项目问询

解决方案:让Packaging为POM的Maven项目同时生成POM与JAR构件

好问题!你的场景是典型的复用父POM配置同时需要打包资源为JAR的需求,下面提供两种可靠的实现方式:

方案一:直接用maven-jar-plugin生成JAR

因为Maven中pom类型的项目默认不会触发JAR打包逻辑,所以我们可以显式配置maven-jar-plugin,并将其绑定到package阶段,这样执行clean install时就会同时生成POM和JAR文件。

在ProjectB的pom.xml中添加如下配置:

<build>
    <!-- 保留你原有的构建配置 -->
    <plugins>
        <!-- 显式配置JAR打包插件 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.3.0</version> <!-- 使用最新稳定版 -->
            <executions>
                <execution>
                    <id>package-jar</id>
                    <phase>package</phase> <!-- 绑定到package阶段 -->
                    <goals>
                        <goal>jar</goal> <!-- 执行jar打包目标 -->
                    </goals>
                    <configuration>
                        <!-- 可选:指定JAR的文件名,默认是artifactId-version.jar -->
                        <finalName>${project.artifactId}-${project.version}</finalName>
                        <!-- 确保src/main/resources下的所有资源都被包含 -->
                        <includes>
                            <include>**/*</include>
                        </includes>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

配置完成后,执行mvn clean install:

  • 会在ProjectB的target目录下生成ProjectB-xxx.jar
  • 同时Maven会将POM文件和JAR文件都安装到本地Maven仓库

如果ProjectA需要使用ProjectB中的资源(比如templates/file1.xml或i18n.properties),只需在ProjectA的pom.xml中添加对ProjectB JAR的依赖:

<dependency>
    <groupId>你的groupId</groupId>
    <artifactId>ProjectB</artifactId>
    <version>你的版本号</version>
    <type>jar</type> <!-- 指定依赖类型为jar,默认是pom -->
</dependency>

方案二:用maven-assembly-plugin定制JAR包(适合复杂场景)

如果需要更灵活地控制JAR包的内容(比如只打包特定目录、添加额外文件等),可以使用maven-assembly-plugin:

在ProjectB的pom.xml中添加:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.6.0</version>
            <executions>
                <execution>
                    <id>create-resource-jar</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                    <configuration>
                        <!-- 自定义要打包的资源目录 -->
                        <fileSets>
                            <fileSet>
                                <directory>src/main/resources</directory>
                                <outputDirectory>/</outputDirectory>
                                <includes>
                                    <include>templates/**</include>
                                    <include>i18n.properties</include>
                                </includes>
                            </fileSet>
                        </fileSets>
                        <finalName>${project.artifactId}-${project.version}-resources</finalName>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

这种方式可以精准控制打包内容,适合资源结构复杂的场景。

注意事项

  • 保持ProjectB的packaging="pom"不变,这样ProjectA依然可以通过父声明复用其配置
  • 执行install时,Maven会自动将生成的JAR安装到仓库,无需额外配置
  • 如果不需要区分POM和JAR的依赖,可以在ProjectB的pom.xml中添加<attachment>配置,让JAR作为POM的附属构件,但上面的方案已经足够满足需求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:28:47