• springboot 打包插件去除jar包瘦身


    1、pom文件配置

    1.1 添加maven-dependency-plugin插件用于将引用的jar包拷贝到指定的路径,便于后续tomcat启动指定依赖包路径

    <!--拷贝依赖到jar外面的lib目录-->
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <executions>
            <execution>
                <id>copy</id>
                <phase>package</phase>
                <goals>
                    <goal>copy-dependencies</goal>
                </goals>
                <configuration>
    <!--指定的依赖路径--> <outputDirectory> ${project.build.directory}/lib </outputDirectory> </configuration> </execution> </executions> </plugin>

    使用这个插件构建完之后的目录结构多了一个lib目录(即上述配置的outputDirectory指定的路径),里面是依赖的jar包:

    1.2 springboot项目使用spring-boot-maven-plugin打包插件

    <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
            <executable>true</executable>
         <layout>ZIP</layout>
            <mainClass>
                com.iasp.BasicStarter
            </mainClass>
            <!--只包含自己-->
            <includes>
                <include>
                    <groupId>${groupId}</groupId>
                    <artifactId>${artifactId}</artifactId>
                </include>
             <!--或者-->
               <!--依赖jar不打进项目jar包中-->
                 <!--<include>
                      <groupId>nothing</groupId>
                      <artifactId>nothing</artifactId>
                 </include>-->
            </includes>
            <!--不包含哪些-->
            <!--<excludeGroupIds>-->
                <!--com.hundsun.jrescloud,-->
                <!--org.springframework.boot,-->
                <!--org.springframework-->
            <!--</excludeGroupIds>-->
        </configuration>
    
        <executions>
            <execution>
                <goals>
                    <goal>repackage</goal>
                </goals>
            </execution>
        </executions>
    </plugin>

    配置上述打包之后就会排除相应的jar包,使得由插件打成的Flat jar包大小变小,便于上传服务器发布,效果如下,BOOT-INF目录下的lib目录没有了:

    原先打成的jar包里的结构为

    然后在启动项目时指定jar包路径-Dloader.path="../lib",这样就可以达到瘦身效果了,其中依赖放在D:develop/shared/fjar目录下,执行运行命令

    java -Dloader.path="D:develop/shared/fjar" -jar mytest.jar

    附注:另外一种启动方案是可以不加-Dloader.path="D:develop/shared/fjar"来指定路径,直接使用如下指令启动

    java -jar mytest.jar

    使用上述启动的话需要添加maven-jar-plugin插件,配置<classpathPrefix>属性,另外在处理一些读取可执行jar中的文件时,可以使用maven-jar-plugin插件替换spring-boot-maven-plugin进行打包操作

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <configuration>
            <archive>
                <manifest>
                    <!--addClasspath表示需要加入到类构建路径-->
                    <addClasspath>true</addClasspath>
                    <!--classpathPrefix指定生成的Manifest文件中Class-Path依赖lib前面都加上路径,构建出lib/xx.jar-->
                    <classpathPrefix>lib/</classpathPrefix>
                    <mainClass>com.common.util.CommonUtilsApplication</mainClass>
                </manifest>
            </archive>
        </configuration>
    </plugin>

    上述插件效果就是在打成的包里META_INF目录下的MANIFEST.MF文件里增加Class-path对应jar,这样在后面应用刚启动时就会根据Class-Path的只去加载需要的版本依赖(解决在共享目录里存在多版本加载引用冲突问题),这个效果就等效加参数-classpath xxx(具体的jar)。此时就是将需要的jar目录lib放在和要运行的xxx.jar同级目录即可,启动时就可以不加-Dloader.path参数了,如果lib目录和要运行的xxx.jar不在同级目录的话,则需要使用-Dloader.path来启动

    如下:在同一级目录启动

    不在同一级目录启动:

    其中-Dloader.path可以指定多个目录,这样在存在多个微服务情况下可将一些公共用到的jar放在一个共享目录中,每个微服务独有的jar可以放在微服务私有的目录下(解决jar版本冲突问题),示例如下:

    注意:

    1、使用-Dloader.path需要在打包的时候增加<layout>ZIP</layout>,不指定的话-Dloader.path不生效。对于多个微服务瘦身打包建议使用maven-jar-plugin打包,避免因为spring-boot-maven-plugin打包机制导致的一些应用启动问题(已踩坑)

    2、若存在不同版本依赖:比如项目A依赖Y库的1.0版本,项目B依赖Y库的2.0版本,那么可能会出现版本依赖冲突(两个版本不兼容的情况下),解决方案:

      2.1、能做到版本一致就保持使用同一个版本,保证版本一致。可以使用maven的版本依赖管理进行处理,即在父pom文件使用<dependencyManagement>统一管理依赖版本

      2.2、让项目各自依赖所需的版本并打进war包中,把其他同版本的jar包放在同一个共享包下

    测试发现依赖在查找时从上往下找,匹配到就用第一个,如下图会使用comm-0.0.1.jar版本的

    附注:

    使用spring-boot-maven-plugin插件,会将依赖的jar包全部打包进去,这样就可以直接运行生成的 JAR 包,简化了我们开发操作。

    使用spring-boot-maven-plugin插件如果不指定程序主运行入口类的话默认为Main-Class: org.springframework.boot.loader.JarLauncher

    这个可以自定义执行主入口类,有以下几种方式:

    1.POM继承spring-boot-starter-parent

    <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.9.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
    <properties>
            <!-- The main class to start by executing java -jar -->
            <start-class>ccom.notes.JavaNotesApplication</start-class>
    </properties>

    2.POM不是继承spring-boot-starter-parent时需指定

    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
      <version>2.1.9.RELEASE</version>
      <configuration>
        <mainClass>com.notes.JavaNotesApplication</mainClass>
        <layout>ZIP</layout>
      </configuration>
      <executions>
        <execution>
          <goals>
            <goal>repackage</goal>
          </goals>
        </execution>
      </executions>
    </plugin>

    3.POM不是继承spring-boot-starter-paren,且使用maven-jar-plugin插件来指定执行的类

    <plugin>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-maven-plugin</artifactId>
    </plugin>
    <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-jar-plugin</artifactId>
       <configuration>
          <archive>
             <manifest>
                <addClasspath>true</addClasspath>
                <useUniqueVersions>false</useUniqueVersions>
                <classpathPrefix>lib/</classpathPrefix>
                <mainClass>com.notes.JavaNotesApplication</mainClass>
             </manifest>
             <manifestEntries>
                <version>${project.version}</version>
             </manifestEntries>
          </archive>
       </configuration>
    </plugin>

    war包打包去除jar包瘦身

      

  • 相关阅读:
    CTS2019 题解
    CTS2019 & APIO2019 游记
    WF 2019
    BZOJ 2560 及其加强
    UOJ 191
    SCOI2019 退役记
    HTML5 本地存储
    js数据类型
    解析json成javascript对象
    http状态码;
  • 原文地址:https://www.cnblogs.com/kingsonfu/p/11431743.html
Copyright © 2020-2023  润新知