Spring Boot 使用 loader.path 精简包
2023-05-07 23:09 youxin 阅读(4063) 评论(1) 收藏 举报lasspath
可以使用 classpath 指定类加载的路径,但 classpath 的生效是有条件的:
| 命令 | classpath 生效 | 说明 |
|---|---|---|
| java -cp .;lib/x.jar Test | ✔ | 运行 class |
| java -cp lib/x.jar -jar app.jar | ✖ | 运行 jar |
Loader.path
Spring Boot 程序大多是打成 jar 包,使用 java -jar boot.jar 的方式启动 (此时 -cp 无效),可以使用 loader.path 指定类加载路径加载其他 jar,但 loader.path 生效是有条件的:
| 命令 | MANIFEST.MF 的 Main-Class | loader.path 生效 | 打包配置 |
|---|---|---|---|
| java -Dloader.path=./lib -jar app.jar | JarLauncher | ✖ | 默认配置 |
| java -Dloader.path=./lib -jar app.jar | PropertiesLauncher | ✔ | 额外配置 |
loader.path 实现了 classpath 的功能。
spring boot 我们只需要把常用的依赖包单独抽取出来即可。
我们只需要在pom.xml文件配置一下即可。
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <!-- 此处省略多余信息.....--> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <!-- 关键点:指定layout = ZIP;打包的时候就不会把依赖的jar一起当进去 --> <layout>ZIP</layout> <!-- 如果打包时需要指定保留某些依赖,可以使用includes --> <includes> <!-- 例如本次打包我希望保留alya-common这个依赖 --> <include> <groupId>com.alya</groupId> <artifactId>alya-common</artifactId> </include> </includes> </configuration> </plugin> </plugins> </build> </project>
这里的lib指依赖所在的路径,这里我就不给图了,项目正常启动就是成功!
java -jar -Dloader.path=lib web.jar
如果lib分散存放在不同路径,可以用逗号隔开,例如:
java –Dloader.path=/v1/lib,/v2/lib -jar handover-demo.jar
关于lib包。我们可以手动解压最初的包得到
找到生成的jar包解压出lib部分并保存
BOOT-INF\lib
或者使用maven插件生成:
此插件用于将依赖包抽出-->
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!--项目的启动类-->
<mainClass>com.xxx.WebApplication</mainClass>
<!--解决windows命令行窗口中文乱码-->
<jvmArguments>-Dfile.encoding=UTF-8</jvmArguments>
<layout>ZIP</layout>
<!--配置需要打包进项目的jar-->
<includes>
<!--这里是填写需要包含进去的jar,
必须项目中的某些模块,会经常变动,那么就应该将其坐标写进来
如果没有则non-exists ,表示不打包依赖
-->
<include>
<groupId>non-exists</groupId>
<artifactId>non-exists</artifactId>
</include>
</includes>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<!--此插件用于将依赖包抽出-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<excludeTransitive>false</excludeTransitive>
<stripVersion>false</stripVersion>
<includeScope>runtime</includeScope>
</configuration>
</execution>
</executions>
</plugin>
#!/bin/sh #应用名称 APP_NAME=web.jar #当前执行的profiles PROFILES=pro #基础地址 BASE_NAME=`pwd` #web执行地址 WEB_NAME=$BASE_NAME/$APP_NAME # lib地址 LIB_NAME=$BASE_NAME/lib # log日志地址 LOG_PATH=../logs/xx.log if [ "$1" = "" ]; then echo -e "\033[0;31m 未输入操作名 \033[0m \033[0;34m {start|stop|restart|status} \033[0m" exit 1 fi #启动项目 function start() { PID=`ps -ef |grep java|grep $WEB_NAME|grep -v grep|awk '{print $2}'` if [ x"$PID" != x"" ]; then echo "$WEB_NAME is running..." else nohup java -Dloader.path=$LIB_NAME -jar $WEB_NAME --spring.profiles.active=$PROFILES >/dev/null 2>&1 & sleep 3 status fi } # 停止项目 function stop() { echo "Stop $WEB_NAME" PID="" query(){ PID=`ps -ef |grep java|grep $WEB_NAME|grep -v grep|awk '{print $2}'` } query if [ x"$PID" != x"" ]; then kill -9 $PID echo "$WEB_NAME (pid:$PID) exiting..." while [ x"$PID" != x"" ] do sleep 1 query done echo "$WEB_NAME exited." else echo "$WEB_NAME already stopped." fi } #重起项目 function restart() { stop echo "$WEB_NAME is starting..." sleep 3 start } #查看项目状态 function status() { PID=`ps -ef |grep java|grep $WEB_NAME|grep -v grep|wc -l` if [ $PID != 0 ];then echo "$WEB_NAME is running..." else echo "$WEB_NAME is not running..." fi } #实施监控日志 function log() { tail -n 20 -f $LOG_PATH } #查看日志 less命令 function less() { less -i -N $LOG_PATH } case $1 in start) start;; stop) stop;; restart) restart;; status) status;; log) log;; less) less;; *) esac
浙公网安备 33010602011771号