https://github.com/tekintian/java-maven-executable-jar
java maven 项目可执行jar包生成的6种方法示例项目, java executable jar make demo
https://github.com/tekintian/java-maven-executable-jar
Last synced: 6 months ago
JSON representation
java maven 项目可执行jar包生成的6种方法示例项目, java executable jar make demo
- Host: GitHub
- URL: https://github.com/tekintian/java-maven-executable-jar
- Owner: tekintian
- Created: 2024-03-21T13:06:33.000Z (over 1 year ago)
- Default Branch: master
- Last Pushed: 2024-03-21T23:52:01.000Z (over 1 year ago)
- Last Synced: 2025-02-15T05:28:18.667Z (8 months ago)
- Language: Java
- Size: 15.3 MB
- Stars: 1
- Watchers: 2
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# 全网最全的 java maven项目创建可执行jar的6种方法,可以用于任何JAVA项目包含spring, springboot项目
JAVA项目创建可运行的jar文件其实就是在jar文件中构建清单文件META-INF/MANIFEST.MF, 在这个前端文件中需要指定入口类 main-class, 还有打包相关的依赖项目等.
第6种方法依赖的额外包最少,文件也最小, 第五种方法生成的jar文件最大, 但是他启动的是一个tomcat服务,通常用于web项目的部署.
其他几种方法没有内置服务,适合于控制台应用的jar打包, Spring Boot Maven Plugin这个和springboot是无缝集成的,常用于springboot项目, 以下是对各种插件生成可执行jar的配置方法和各自的优缺点的总结和对比.## 1. 使用maven-jar-plugin和maven-dependency-plugin插件
优点: 处理过程透明,我们可以自定义每个步骤
不足: 手动; 依赖项不在最终的jar中,这意味着只有当libs文件夹对jar是可访问和可见的时,我们的可执行jar才会运行- pom依赖如下
~~~xml4.0.0
cn.tekin
spring_demo
1.0-SNAPSHOT
8
8
UTF-8
5.3.29
org.springframework
spring-core
${spring.version}
org.springframework
spring-context
${spring.version}
${project.name}
org.apache.maven.plugins
maven-dependency-plugin
copy-dependencies
prepare-package
copy-dependencies
${project.build.directory}/libs
org.apache.maven.plugins
maven-jar-plugin
true
libs/
cn.tekin.MyApp
~~~
- 构建jar命令
这里构建的jar文件是不包含依赖文件的, 所有的依赖文件全部位于libs目录下
~~~sh
mvn package
~~~- jar包中的清单文件 META-INF/MANIFEST.MF
生成的MANIFEST.MF内容如下
~~~mf
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: Tekin
Class-Path: libs/spring-core-5.3.29.jar libs/spring-jcl-5.3.29.jar lib
s/spring-context-5.3.29.jar libs/spring-aop-5.3.29.jar libs/spring-be
ans-5.3.29.jar libs/spring-expression-5.3.29.jar
Created-By: Apache Maven 3.6.3
Build-Jdk: 1.8.0_362
Main-Class: cn.tekin.MyApp
~~~- 执行jar
java -jar target/spring_demo.jar## 2. 使用Apache Maven Assembly Plugin插件
优点: 依赖包含在jar文件中
不足: 只能对制品进行基础控制, 如没有类重定位的支持这个配置默认会生成2个jar文件, 一个包含配置清单和依赖的jar包 xxx-jar-with-dependencies.jar, 另外一个是不包含依赖且没有清单的jar包.
~~~xmlorg.apache.maven.plugins
maven-assembly-plugin
package
single
cn.tekin.MyApp
jar-with-dependencies
~~~
注意这里省略的其他配置,其他配置见1;- 生成jar文件
mvn package- 清单文件
~~~mf
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: Tekin
Build-Jdk: 1.8.0_362
Main-Class: cn.tekin.MyApp
~~~- 运行:
这里生成的可执行jar是包含依赖包的jar文件.
java -jar target/spring_demo-jar-with-dependencies.jar## 3. Apache Maven Shade Plugin
优点: 依赖包含在jar文件中, 可对我们的jar制品进行高级控制, 可对依赖的类进行重命名和重新定位.
不足: 我们想使用高级功能时配置较为复杂, 生成的jar文件大小比上面2种稍大.~~~xml
org.apache.maven.plugins
maven-shade-plugin
shade
true
cn.tekin.MyApp
~~~
- 清单文件
~~~mf
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: Tekin
Created-By: Apache Maven 3.6.3
Build-Jdk: 1.8.0_362
Main-Class: cn.tekin.MyApp
~~~## 4. Spring Boot Maven Plugin
优点: 依赖项包含在jar文件中,我们可以在每个可访问的位置运行它,可对打包制品进行高级控制,排除jar文件的依赖项等,还可以打包war文件不足: 添加可能不必要的Spring和Spring Boot相关类, 生成的jar文件大小比方法3稍大
~~~xml
${project.name}
org.springframework.boot
spring-boot-maven-plugin
2.3.12.RELEASE
repackage
spring-boot
cn.tekin.MyApp
~~~- 清单文件
~~~mf
Manifest-Version: 1.0
Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx
Archiver-Version: Plexus Archiver
Built-By: Tekin
Start-Class: cn.tekin.MyApp
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Spring-Boot-Version: 2.3.12.RELEASE
Created-By: Apache Maven 3.6.3
Build-Jdk: 1.8.0_362
Main-Class: org.springframework.boot.loader.JarLauncher
~~~## 5. Web Application With Executable Tomcat
优点: 依赖项包含在jar文件中,容易部署和运行不足: 很多年未发行新版本, 且因为在内置的war文件中打包了一个内置的tomcat发行包, 所以jar文件比较大.
~~~xml
javax.servlet
javax.servlet-api
4.0.1
provided
${project.name}
org.apache.tomcat.maven
tomcat7-maven-plugin
2.2
tomcat-run
exec-war-only
package
/
false
webapp.jar
utf-8
~~~- 清单文件
~~~mf
Manifest-Version: 1.0
Main-Class: org.apache.tomcat.maven.runner.Tomcat7RunnerCli
~~~## 6. One Jar Maven Plugin
优点: 干净的委托模型,允许类处于OneJar的顶级,支持外部Jar,并且可以支持Native库, 在jar文件中包含了one-jar的源码,可以自己扩展
不足: 停止维护很多年了.
~~~xml4.0.0
cn.tekin
spring_demo
1.0-SNAPSHOT
8
8
UTF-8
5.3.29
org.springframework
spring-core
${spring.version}
org.springframework
spring-context
${spring.version}
${project.name}
com.jolira
onejar-maven-plugin
cn.tekin.MyApp
true
Tekin
one-jar
~~~
- 清单文件
~~~mf
Manifest-Version: 1.0
ImplementationVersion: 1.0-SNAPSHOT
Main-Class: com.simontuffs.onejar.Boot
One-Jar-Main-Class: cn.tekin.MyApp
~~~## 总结
创建可运行的jar文件其实就是在jar文件中构建清单文件META-INF/MANIFEST.MF, 在这个前端文件中需要指定入口类 main-class, 还有打包相关的依赖项目等.
第6种方法依赖的额外包最少,文件也最小, 第五种方法生成的jar文件最大.同一项目不同的插件生成的jar可执行文件文件大小比较:
1. maven-jar-plugin 4.2M + 5kb
2. Apache Maven Assembly Plugin 4.1M
3. Apache Maven Shade Plugin 4.2M
4. Spring Boot Maven Plugin 4.3M
5. Web Application With Executable Tomcat 9.2M
6. One Jar Maven Plugin 3.8M