如何用预构建JAR覆盖Maven生成的输出JAR?
解决预构建JAR通过maven-assembly-plugin直接作为Maven输出JAR的问题
你的核心问题是用fileSets会把原JAR当成普通文件打包进新JAR里,改成用files元素直接复制原JAR就能解决,同时调整插件配置确保生成的JAR是项目的主产物。
修改Assembly配置文件
把原来的fileSets替换成files,直接指定要复制的预构建JAR,这样assembly插件会直接将原JAR作为输出的JAR内容,而不是嵌套进去:
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 https://maven.apache.org/xsd/assembly-1.1.2.xsd"> <id>prebuilt-jar</id> <formats> <format>jar</format> </formats> <includeBaseDirectory>false</includeBaseDirectory> <!-- 替换fileSets为files,直接复制原JAR --> <files> <file> <source>${project.basedir}/lib/myjar</source> <!-- 输出文件名指定为项目的默认JAR名,确保覆盖 --> <outputFileName>${project.artifactId}-${project.version}.jar</outputFileName> </file> </files> </assembly>
调整pom.xml配置
需要确保maven-jar-plugin不生成默认的空JAR,同时让assembly插件的输出成为项目的主JAR:
<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> <groupId>com.mycompany</groupId> <artifactId>SomeArtifact</artifactId> <version>1.0.0</version> </parent> <artifactId>myartifact</artifactId> <packaging>jar</packaging> <name>myartifact</name> <build> <plugins> <!-- 禁用maven-jar-plugin的默认打包执行 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.3.0</version> <executions> <execution> <id>default-jar</id> <phase>none</phase> </execution> </executions> </plugin> <!-- 配置maven-assembly-plugin生成主JAR --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.7.1</version> <executions> <execution> <id>package-prebuilt-jar</id> <phase>package</phase> <goals> <goal>single</goal> </goals> <configuration> <finalName>${project.artifactId}-${project.version}</finalName> <appendAssemblyId>false</appendAssemblyId> <descriptors> <descriptor>src/assembly/myassembly.xml</descriptor> </descriptors> <!-- 确保生成的JAR被标记为项目的主 artifact --> <attach>true</attach> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>
关键说明
- 用
files元素直接复制原JAR,而不是fileSets,这样插件会直接把原JAR作为输出的JAR,而不是将其作为文件嵌套在新JAR内部。 - 显式禁用
maven-jar-plugin的default-jar执行,避免生成空的默认JAR干扰。 - 开启
attach配置,让assembly生成的JAR被Maven识别为项目的主构件,这样其他模块就能正常依赖它。
内容的提问来源于stack exchange,提问作者nullpointer
相关产品推荐
相关产品推荐

