如何在单个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
相关产品推荐
相关产品推荐

