SpringBoot便捷打包方式
1、使用原因
由于部署的时候,通过maven打包,打出的包都非常大。这是因为每次打包都会将项目中引入的所有包都打包一次。所有包中包含了java jre,pom.xml中引入的jar包。
2、打包思路
可以将jre和第三方jar包抽取出来,放到文件夹后。不将这些jar包打包到可运行项目的jar包里面。 在执行可执行jar包时,可以指定存放jre和第三方jar包的文件夹。
这些打包出来的可运行jar包就不会非常大了,上传到服务器就方便多了。
3、默认打包时的结构
结构说明:
classes:存放编译时得到的所有class文件
kwms-uams-core-1.0-SNAPSHOT.jar 的大小为131 MB。可想而知有多大了。
3.1、看看jar包里的结构(kwms-uams-core-1.0-SNAPSHOT.jar)
- BOOT-INF:存放了SpringBoot中java类在编译时所产生的class文件和一些配置文件等,以及项目中导入的所有jar包(包含了jre,第三方jar包等等)
- META-INF:相当于一个信息包,目录中的文件和目录获得Java 2平台的认可与解释,用来配置应用程序、扩展程序、类加载器和服务manifest.mf文件。(不太清楚)
- org:SpringBoot项目在系统编译时,产生的SpringBoot相关的class文件
3.2、BOOT-INF的结构
- classes: 存放了编译时所产生的class文件和一些其他的文件(例如:mybatis的mapper.xml, 配置文件 yml等等)
- lib:存放了项目中导入的所有jar包
4、改变了打包时的结构
- classes:存放了项目中所有的类在编译时产生的class文件。
- lib:如果配置了条件,将会只打包满足条件的jar包。
- kwms-uams-core-1.0-SNAPSHOT.jar:发现只有1M多了
4.1、看看jar包的结构
- BOOT-INF:如果配置了,将只导入你想要的jar包
- META-INF:相当于一个信息包,目录中的文件和目录获得Java 2平台的认可与解释,用来配置应用程序、扩展程序、类加载器和服务manifest.mf文件。(不太清楚)
- org:SpringBoot项目在系统编译时,产生的SpringBoot相关的class文件
4.2、BOOT-INF的结构
- classes: 存放了编译时所产生的class文件和一些其他的文件(例如:mybatis的mapper.xml, 配置文件 yml等等)
- lib:默认情况下存放所有jar包,如果配置了条件,将只会导入相应的jar包
5、步骤
5.1、修改pom.xml文件
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<!-- spring boot thin jar configuration -->
<configuration>
<executable>true</executable>
<fork>true</fork>
<!-- 解决乱码 -->
<jvmArguments>-Dfile.encoding=UTF-8</jvmArguments>
<!-- main启动入口 -->
<mainClass>com.xkd.uams.UamsApplication</mainClass>
<!-- 设置为ZIP,此模式下spring-boot-maven-plugin会将Manifest.MF文件中的Main-Class设置为org.springframework.boot.loader.PropertiesLauncher -->
<layout>ZIP</layout>
<!-- 这些是需要包含的jar包 这些jar包将会被打包到可执行jar包中,如果没有添加includes标签将会使用默认情况(默认情况:所有jar包都导入) -->
<includes>
<!-- common -->
<include>
<groupId>common.service</groupId>
<artifactId>common-service</artifactId>
</include>
<!-- uams-api -->
<include>
<groupId>com.xkd</groupId>
<artifactId>kwms-uams-api</artifactId>
</include>
<!-- bus-wechat-api -->
<include>
<groupId>com.xkd</groupId>
<artifactId>kwms-bus-wechat-api</artifactId>
</include>
<!-- custom-api -->
<include>
<groupId>com.xkd</groupId>
<artifactId>kwms-custom-api</artifactId>
</include>
</includes>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- third-party jar into lib directory -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<!-- 如果没有添加executions标签,将会使用默认方式,(默认方式:将不会生成lib文件),如果配置了executions标签,将会生成lib文件夹,里面存放了满足条件的jar包-->
<executions>
<execution>
<id>copy-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<!-- 指定jar包生成的位置 -->
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<!-- 需要排除的jar的 groupId -->
<excludeGroupIds>
com.xkd,
common.service
</excludeGroupIds>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
<include>**/*.yml</include>
</includes>
</resource>
</resources>
</build>
- 需要在 标签中添加标签,如果没有添加,将会使用默认方式(既:将所有jar包一起打包)
如果添加了标签,但里面没有标签,将不打包任务的jar包,如果添加了将会只打包相应的jar包。 - 需要在标签中添加 标签,如果没有添加,将会使用默认方式(既:不生成任何额外的文件夹)。如果添加了标签,但里面没有标签,将会导出所有的jar包,如果添加了标签,只打包符合条件的jar包。
<‘outputDirectory’> ${project.build.directory}/lib </’outputDirectory‘> : 指定jar包生成的位置
标签作用:包含
标签作用:除去
标签作用:存放导出的文件位置
5.2、上传,部署
打包完之后,将lib的文件夹和可执行jar包上传到服务器中。
在java -jar时,使用Dloader.path命令指定jar包存放的位置。
例如:lib文件夹存放在 /opt/下, 可执行jar包名为my.jar
执行以下命令,项目就会跑起来。
java -jar my.jar -Dloader.path=/opt/lib