打胖包采用的是spring的标准来执行,所以使用的是spring boot提供的打包插件
参考来源:打包Spring Boot应用 - 廖雪峰的官方网站
pom配置
...org.springframework.boot spring-boot-maven-plugin
打包命令
mvn clean package
target目录
$ ls
classes
generated-sources
maven-archiver
maven-status
springboot-exec-jar-1.0-SNAPSHOT.jar
springboot-exec-jar-1.0-SNAPSHOT.jar.original 其中,springboot-exec-jar-1.0-SNAPSHOT.jar.original是Maven标准打包插件打的jar包,它只包含我们自己的Class,不包含依赖,而springboot-exec-jar-1.0-SNAPSHOT.jar是Spring Boot打包插件创建的包含依赖的jar,可以直接运行:
执行
java -jar springboot-exec-jar-1.0-SNAPSHOT.jar
org.springframework.boot spring-boot-maven-plugin ${spring-boot-dependencies.version} repackage
打包后的jar包解压后的文件目录

MANIFEST.MF文件
Manifest-Version: 1.0
Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx
Archiver-Version: Plexus Archiver
Built-By: gymd
Start-Class: com.shenyun.flinkgui.Application
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Spring-Boot-Version: 2.3.4.RELEASE
Created-By: Apache Maven 3.6.1
Build-Jdk: 1.8.0_321
Main-Class: org.springframework.boot.loader.JarLauncher 总结
打包后只有一个可以执行的jar文件,内部包含了配置,lib等(lib)
打包后使用``java -jar demo.jar``启动项目
demo.jar中有MF信息清单,有入口类的说明Main-class
spring boot项目的类入口Main-class为org.springframework.boot.loader.JarLauncher,这个是标准的java处理
另外有个Start-Class表示是项目上的入口类型,这个由spring boot来处理
spring-boot-maven-plugin,得到主jar
maven-dependency-plugin,得到依赖包,lib/*.jar 文件
maven-assembly-plugin,组合主jar,lib/*.jar,config/,bin/* 文件 (如果不用assembly,也可以手动组装)
pom.xml打包插件的引入
org.springframework.boot spring-boot-maven-plugin ${spring-boot-dependencies.version} ZIP
org.apache.maven.plugins maven-dependency-plugin 3.3.0 prepare-package copy-dependencies target/lib
org.apache.maven.plugins maven-assembly-plugin 3.4.2 ${basedir}/assembly.xml ${project.artifactId} false ${project.build.directory}/release UTF-8 make-assembly package single
assembly
dir false unix ${project.basedir}/src/main/resources ./config *.properties *.yml *.xml
unix ${project.basedir}/build/bin ./bin 0755 ${project.build.directory}/lib ./lib *.jar ${project.build.directory} ./ *.jar

内部结构

主jar包的MANIFEST.MF文件
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: shenyun
Created-By: Apache Maven 3.6.1
Build-Jdk: 1.8.0_321 1、内部结构是扁平的配置文件+编译class文件+META-INF文件
2、MANIFEST.MF不带有Main-class的指定,只有很简单的说明
java -cp ".:\
/opt/flinkgui-web/lib/*:\
/opt/flinkgui-web/flinkgui-web-1.0-SNAPSHOT.jar" \
com.shenyun.flinkgui.Application 
启动命令解释
java -cp ".:${path_1}:${path_2}" ${mainClassFullName}
1、-cp是java的标准参数,为jar的搜索路径
2、jar的搜索路径必须写全路径,不能使用相对路径
3、jar的搜索路径,jdk1.6以上,可以使用通配符 "/xxx/lib/*",但是不能写成"/xxx/lib/*.jar"
4、jar搜索路径有几个就要写完,linux使用冒号分割“:”,windows使用分号“;”分割
5、jar搜索路径需要使用引号包裹,
6、建议jar搜索路径前将点号 “.”加到最前面,这个将作为程序运行的classpath,日志文件目录默认在该路径下
7、spring boot的项目需要读取外部配置文件,可以在config文件夹中修改,文件夹名字config是spring的标准,非java的