1、背景介绍

当网络不是很给力的时候,一个大的jar包传输是费时的,往往存在修改1分钟,传包10分钟的尴尬时刻。

1)正常打包出来的jar

springboot解压缩文件 springboot 压缩文件_springboot解压缩文件

2)解压出来后的包大小98M

springboot解压缩文件 springboot 压缩文件_springboot解压缩文件_02

3)lib的jar包大小

springboot解压缩文件 springboot 压缩文件_jar_03


综上我们能看出来,一个普通项目,打包出来有进90M,里面的项目依赖就85.7M,这就触发了瘦身打包的念头

2、开始减肥行动

在启动类所在的pom文件中,添加以下的插件,即可打包出一个无依赖的jar包

1) pom配置图

springboot解压缩文件 springboot 压缩文件_spring_04


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就行了

springboot解压缩文件 springboot 压缩文件_springboot解压缩文件_05

3、启动方式

问题来了,jar和lib分离了,之前的java -jar能不能直接启动呢?答案是不能的,会直接说找不到类

springboot解压缩文件 springboot 压缩文件_springboot解压缩文件_06


那,正确的操作是什么?

这里的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放到该目录下

springboot解压缩文件 springboot 压缩文件_springboot解压缩文件_07


springboot解压缩文件 springboot 压缩文件_jar_08

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