jar包瘦身及-参数指定加载依赖包

时间:2025-03-01 08:59:08

问题

spring-boot工程,由于有个jar打进去了很多数据库jdbc包,导致一个包体积在30M左右,考虑到后续更新及效率等,打算将这部分jar包拿出来放到单独路径,java在启动时-参数指定加载jar包的路径。

了解dependency节点的scope属性

compile、provided、runtime、system、test、import
具体说明在很多博客都有写:相关博客
本地启动及调试需要这些jdbc的驱动包,将其放置到工程lib目录,并指定scope为system,添加systempath,这样的话启动会加载这些自身提供的jar包,不去maven查找。
这样的话(没有其他配置),这些包是会在打包的时候被包含进去的。

        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>42.2.8</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/lib/postgresql-42.2.8.jar</systemPath>
        </dependency>

了解maven-jar-plugin和spring-boot-maven-plugin

这个博客是对于jar包瘦身解释的比较清楚的,关于compile和package插件等。

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <!-- 打包时排除scope为system的包 -->
                    <includeSystemScope>false</includeSystemScope>
                    <!-- jvm启动时通过-Dloader.path加载包,必须指定layout为ZIP,否则-Dloader.path无效 -->
                    <layout>ZIP</layout>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
        <finalName>idptools</finalName>
    </build>

注意

开始我只在cmd脚本中加了参数,运行时注入报错找不到ibatis相关类,才发现必须要在打包时指定layout节点为ZIP

  • JAR,即通常的可执行jar
    Main-Class:
  • WAR,即通常的可执行war,需要的servlet容器依赖位于WEB-INF/lib-provided
    Main-Class:
  • ZIP,即DIR,类似于JAR
    Main-Class:
  • MODULE,将所有的依赖库打包(scope为provided的除外),但是不打包Spring Boot的任何Launcher
  • NONE,将所有的依赖库打包,但是不打包Spring Boot的任何Launcher

在执行脚本中增加加载路径参数:

“%JAVA_HOME%\bin\java” -=runtime/3rd,runtime/libs