删除Maven生成的默认JAR包引发构建失败问题求助
我之前也踩过这个坑!你遇到的报错核心原因很明确:maven-shade-plugin默认依赖maven-jar-plugin生成的主JAR包来进行合并打包操作,如果你直接禁用了jar插件,shade插件就找不到它需要处理的基础构件了,自然会报“project main artifact does not exist”的错误。
下面给你两种可行的解决方案,根据你的需求选就行:
方案一:保留maven-jar-plugin,让shade插件替代默认JAR(推荐)
不需要完全禁用jar插件,只需要配置shade插件,让它生成的JAR替换掉maven-jar-plugin生成的默认主构件。这样既满足你对最终构件的需求,又不会出现构件缺失的问题。
示例配置如下:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>2.3</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <!-- 关键配置:让shade生成的JAR作为项目主构件,替代jar插件的产物 --> <shadedArtifactAttached>false</shadedArtifactAttached> <!-- 这里可以添加你的shade自定义配置,比如指定主类、合并依赖规则等 --> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.yourpackage.YourMainClass</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build>
方案二:禁用maven-jar-plugin,手动指定shade的输入源
如果你确实需要禁用maven-jar-plugin,那得明确告诉shade插件从哪里获取要打包的类文件——直接指定项目编译后的class目录即可。
示例配置如下:
<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> <!-- 让jar插件在package阶段不执行 --> <phase>none</phase> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>2.3</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <!-- 指定编译后的class目录作为shade的输入源 --> <sources> <source> <directory>${project.build.outputDirectory}</directory> </source> </sources> <!-- 同样可以配置主类等自定义内容 --> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.yourpackage.YourMainClass</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build>
简单总结下:第一种方案更符合Maven的默认生命周期,减少配置复杂度;第二种方案适合你明确不需要默认JAR的场景。
内容的提问来源于stack exchange,提问作者Saurabh Srivastava
相关产品推荐
相关产品推荐

