问题
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