如何用Maven实现将依赖库提取至可执行Jar以解决启动缓慢问题?
解决Maven打包可执行JAR启动缓慢的问题
你用maven-assembly-plugin打包的JAR启动慢,核心原因是它默认会把依赖的JAR包内嵌在主JAR的某个目录下,JVM启动时得从这些嵌套的JAR里逐个加载类,这个过程比直接从本地文件系统加载依赖慢很多——这也是为什么IntelliJ启动快,它直接用本地仓库里的依赖文件。
要实现“将所需库提取到生成的Jar中”,推荐用maven-shade-plugin,它能把所有依赖的.class文件直接合并到你的主JAR里,生成一个真正的“胖JAR”,启动速度会和IntelliJ里一致。
具体配置步骤
- 先把pom.xml里的maven-assembly-plugin配置注释或移除(如果不需要保留原有打包方式的话)
- 添加maven-shade-plugin的配置到
<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> <!-- 指定你的主类,作为可执行JAR的入口 --> <mainClass>com.yourpackage.YourMainClass</mainClass> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.yourpackage.YourMainClass</mainClass> </transformer> <!-- 合并META-INF/services下的文件,避免依赖冲突导致服务加载失败 --> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> </transformers> </configuration> </execution> </executions> </plugin>
打包运行
执行命令:
mvn clean package
打包完成后,target目录下会生成两个JAR:一个是普通的主JAR,另一个是带-jar-with-dependencies后缀的可执行胖JAR,直接运行这个胖JAR即可:
java -jar target/your-project-name-1.0-SNAPSHOT-jar-with-dependencies.jar
注意事项
- 如果你的依赖中有重复的资源文件(比如同名配置文件),shade插件默认会覆盖,可通过配置
ResourceTransformer自定义合并逻辑 - 胖JAR体积会比assembly打包的JAR大,但启动速度会显著提升,和IntelliJ内运行速度基本一致
内容的提问来源于stack exchange,提问作者BitMaster48
相关产品推荐
相关产品推荐

