1、背景介绍
当网络不是很给力的时候,一个大的jar包传输是费时的,往往存在修改1分钟,传包10分钟的尴尬时刻。
1)正常打包出来的jar
2)解压出来后的包大小98M
3)lib的jar包大小
综上我们能看出来,一个普通项目,打包出来有进90M,里面的项目依赖就85.7M,这就触发了瘦身打包的念头
2、开始减肥行动
在启动类所在的pom文件中,添加以下的插件,即可打包出一个无依赖的jar包
1) pom配置图
2)pom 配置代码
<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>
在弄好上面的配置后,剩下的就跟平时打包一样的,点击idea的package
3)瘦身打包结果
这个jar就很人性了,3.99M!lib包我们就可以放在服务器上,更新只要更新web.jar就行了
3、启动方式
问题来了,jar和lib分离了,之前的java -jar能不能直接启动呢?答案是不能的,会直接说找不到类
那,正确的操作是什么?
这里的lib指依赖所在的路径,这里我就不给图了,项目正常启动就是成功!
java -jar -Dloader.path=lib web.jar
4、一点知识的小补充
spring官方有这样的一句话
Spring Boot also supports wildcard locations when loading configuration files. By default, a wildcard location of config/*/ outside of your jar is supported. Wildcard locations are also supported when specifying spring.config.additional-location and spring.config.location.
在加载配置文件时,Spring Boot还支持通配路径。
默认情况下,其支持的路径是在 jar 的config/*下。
还可以通过指定 spring.config.additional-location 和spring.config.location 进行指定
这里我常用的是,第一种,在jar所在的目录,新建config目录,将项目需要的application.xml放到该目录下
4、最后补充一个自用的linux shell
#!/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