如何使用Maven构建无主类的Fat Jar?
构建无主类的Maven Fat Jar(包含依赖)
方法一:使用Maven Assembly插件
你之前尝试的Assembly插件完全可以实现需求,核心是不要指定主类配置,同时确保打包时包含所有依赖。在项目的pom.xml中添加如下插件配置:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.6.0</version> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> <configuration> <!-- 打包包含所有依赖的Jar --> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <!-- 关键:显式关闭主类配置,适配类库场景 --> <archive> <manifest> <mainClass>false</mainClass> </manifest> </archive> </configuration> </execution> </executions> </plugin> </plugins> </build>
配置完成后,在IntelliJ的Maven侧边栏找到项目的Lifecycle -> package,双击执行即可。构建完成后,target目录下会生成两个Jar包,带-jar-with-dependencies后缀的就是你需要的Fat Jar。
方法二:使用Maven Shade插件(更推荐)
Shade插件是Maven官方推荐的Fat Jar打包工具,配置更简洁,处理依赖冲突的能力更强。同样无需指定主类,配置如下:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.5.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <!-- 可选:如需排除特定依赖,可在此添加过滤规则 --> <!-- <filters>...</filters> --> <!-- 不配置主类,跳过Manifest的主类设置 --> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <!-- 此处不指定mainClass参数即可 --> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build>
执行package命令后,target目录下的主Jar包就是包含所有依赖的Fat Jar。若想保留原Jar包不被覆盖,可添加<shadedArtifactAttached>true</shadedArtifactAttached>配置,此时会生成带-shaded后缀的Fat Jar。
验证打包结果
打包完成后,可通过两种方式确认有效性:
- 直接解压Jar包,检查内部是否包含项目所有类以及依赖库的类文件
- 将该Jar作为依赖引入其他Java项目,测试能否正常调用类库中的方法
内容的提问来源于stack exchange,提问作者JPA
相关产品推荐
相关产品推荐

