SpringBoot便捷打包方式

1、使用原因

由于部署的时候,通过maven打包,打出的包都非常大。这是因为每次打包都会将项目中引入的所有包都打包一次。所有包中包含了java jre,pom.xml中引入的jar包。

2、打包思路

可以将jre和第三方jar包抽取出来,放到文件夹后。不将这些jar包打包到可运行项目的jar包里面。 在执行可执行jar包时,可以指定存放jre和第三方jar包的文件夹。
这些打包出来的可运行jar包就不会非常大了,上传到服务器就方便多了。

3、默认打包时的结构

springboot项目打包只有几kb springboot打包太大_jar包


结构说明:

classes:存放编译时得到的所有class文件

kwms-uams-core-1.0-SNAPSHOT.jar 的大小为131 MB。可想而知有多大了。

3.1、看看jar包里的结构(kwms-uams-core-1.0-SNAPSHOT.jar)

springboot项目打包只有几kb springboot打包太大_springboot项目打包只有几kb_02

  • BOOT-INF:存放了SpringBoot中java类在编译时所产生的class文件和一些配置文件等,以及项目中导入的所有jar包(包含了jre,第三方jar包等等)
  • META-INF:相当于一个信息包,目录中的文件和目录获得Java 2平台的认可与解释,用来配置应用程序、扩展程序、类加载器和服务manifest.mf文件。(不太清楚)
  • org:SpringBoot项目在系统编译时,产生的SpringBoot相关的class文件


3.2、BOOT-INF的结构

springboot项目打包只有几kb springboot打包太大_jar包_03

  • classes: 存放了编译时所产生的class文件和一些其他的文件(例如:mybatis的mapper.xml, 配置文件 yml等等)
  • lib:存放了项目中导入的所有jar包

4、改变了打包时的结构

springboot项目打包只有几kb springboot打包太大_springboot项目打包只有几kb_04

  • classes:存放了项目中所有的类在编译时产生的class文件。
  • lib:如果配置了条件,将会只打包满足条件的jar包。
  • kwms-uams-core-1.0-SNAPSHOT.jar:发现只有1M多了
4.1、看看jar包的结构

springboot项目打包只有几kb springboot打包太大_spring boot_05

  • BOOT-INF:如果配置了,将只导入你想要的jar包
  • META-INF:相当于一个信息包,目录中的文件和目录获得Java 2平台的认可与解释,用来配置应用程序、扩展程序、类加载器和服务manifest.mf文件。(不太清楚)
  • org:SpringBoot项目在系统编译时,产生的SpringBoot相关的class文件
4.2、BOOT-INF的结构

springboot项目打包只有几kb springboot打包太大_java_06

  • 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