SpringBoot工程jar包瘦身

背景

SpringBoot 为我们快速开发提供了很好的架子,使得我们只需要少量配置就能开始我们的开发工作,但是当我们需要打包上传部署时,却是很神伤的一个问题,因为打出来的 Jar 包少则十几兆,多则一百来兆,我们需要上传至公网服务器时,是非常慢的,这就引出了今天的主题,SpringBoot项目Jar包如何瘦身部署

思路

分析 jar,我们可以看出,jar 包里面分为以下三个模块
分为 BOOT-INF,META-INF,org 三个部分,打开 BOOT-INF

可以看到有 classes,lib 两个文件夹,我们编译好的代码是放在 classes 里面的,而我们所依赖的 jar 包都是放在 lib 文件夹下classes 部分是非常小的(我的是3M左右),lib部分是非常大的(我的是170M+左右),所以上传很慢。


image.png

解决方法:如果能把lib部分剥离出来,每次打包时只更新当前项目的更新即可。(如果本项目所依赖有我们当前项目所需要的其他模块,其他模块更新后也需要打一个对应的lib包更新上去即可)

瘦身
正常打包

首先,我们项目的 pom.xml 文件中的打包方式如下:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

这是 SpringBoot 中默认的打包方式,我们先按照这种方式打包出来,得到一个 jar 包,我们将 jar 包解压,如果不能直接解压,则将后缀改为 zip 再进行解压,我们只需要拿到 BOOT-INF 中的 lib 目录即可。

image.png
改变打包方式

我们对 SpringBoot 中默认的打包方式做一些配置


image.png
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <mainClass>com.xxx.XxxApplication</mainClass>
                <layout>ZIP</layout>
                <includes>
                    <include>
                        <groupId>nothing</groupId>
                        <artifactId>nothing</artifactId>
                    </include>
                </includes>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>


  • mainClass,我们指定了项目的启动类
  • layout,我们指定了打包方式为 ZIP,注意:一定是大写的
  • includes,有自己的依赖 jar,可以在此导入
  • repackage,剔除其它的依赖,只需要保留最简单的结构
再次打包

我们再次点击 maven package,得到一个 jar 包,可以看到此时的 jar 包只有几兆了


上传启动

我们将 lib 目录,以及最后打包的瘦身项目 jar 包,上传至服务器,目录如下


[root@Test tax-expand]# tree -L 1
.
├── 1-start.sh
├── 2-stop.sh
├── lib
├── your-app.jar 
└── start.sh



使用命令

nohup java -Dloader.path=./lib -jar ./your-app.jar &
  • -Dloader.path,告诉它所依赖的 maven jar 包位置
  • your-app.jar,项目 jar 包的名字
  • nohup、&,使得 jar 包在服务后台运行
[root@Test tax-expand]# cat 1-start.sh 
#!/bin/sh

# 脚本参数:
#  debug:启用 JVM 远程调试,端口设置在 JAVA_DEBUG 变量中。
#    log:打印 Java 进程标准输出内容,默认不打印,输出到 LOG_FILE 变量指定的文件中。
#    其他:带有 -D、-X、-javaagent 的参数,会添加到 JVM 参数中。

cd $(dirname $0)
./start.sh $*
[root@Test tax-expand]# cat 2-stop.sh 
#!/bin/sh

# 脚本参数:
#  debug:启用 JVM 远程调试,端口设置在 JAVA_DEBUG 变量中。
#    log:打印 Java 进程标准输出内容,默认不打印,输出到 LOG_FILE 变量指定的文件中。
#    其他:带有 -D、-X、-javaagent 的参数,会添加到 JVM 参数中。

cd $(dirname $0)
./start.sh stop

[root@Test tax-expand]# cat start.sh 
#!/bin/sh

# 脚本参数:
#  debug:启用 JVM 远程调试,端口设置在 JAVA_DEBUG 变量中。
#    log:打印 Java 进程标准输出内容,默认不打印,输出到 LOG_FILE 变量指定的文件中。
#    其他:带有 -D、-X、-javaagent 的参数,会添加到 JVM 参数中。

export JAR_NAME=your-app.jar
export APP_DIR=your-app
export DEPLOY_PATH=/home/application
export LOG_PATH=/data/logs/$APP_DIR
export LOG_FILE=$LOG_PATH/
export VM_OPTIONS=""
export GC_OPTIONS="-XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationConcurrentTime
                   -XX:+PrintHeapAtGC -XX:+UseGCLogFileRotation -XX:+HeapDumpOnOutOfMemoryError -XX:NumberOfGCLogFiles=5
                   -XX:GCLogFileSize=5M -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly
                   -XX:HeapDumpPath=${LOG_PATH}/heapdump.hprof -Xloggc:${LOG_PATH}/gc.log
                   -XX:HeapDumpPath=${LOG_PATH}/HeapDumpOnOutOfMemoryError/"
export JAVA_DEBUG="-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,address=127.0.0.1:15005,server=y,suspend=n"
export STOP_TIMEOUT=120

for arg in $*; do
    [ "$arg" = debug ] && enable_debug=true;
    [ "$arg" = log ]   && enable_log=true;
    [[ "$arg" =~ -D|-X|-javaagent ]] && export VM_OPTIONS="$VM_OPTIONS $arg"
done;

JAVA="java"
[ -n "$JAVA_HOME" ] && JAVA="$JAVA_HOME/bin/java"

app_process=$(ps -ef | grep java | grep $JAR_NAME | grep -v grep | awk '{ print $2 }')

log () {
  echo "$(date '+%Y-%m-%d %H:%M:%S') $*"
}

# Stop app instance.
stop_app() {
  [ -z "$app_process" ] && log "Application already stoped." && return
  log "Stop Application...."
  ps -fp $app_process
  kill -9 $app_process

#  start=$(date +%s)
#  while [ -n "$(ps -hp $app_process)" ]; do
#    printf STOP | nc -v 127.0.0.1 $COMMAND_PORT
#    log "Application stopping..."
#    if [ $(($(date +%s) - $start)) -gt $STOP_TIMEOUT ]; then
#      echo "[ ERROR ] Application stop timeout, kill force."
#      kill -9 $app_process
#    fi
#    sleep 3
#   done
}
[ "$1" = stop ] && stop_app && exit 0

# check app instance
[ -n "$app_process" ] && log "Application is running. ^_^" && exit 1

# Start app instance
log "Start Application."
mkdir -p $LOG_PATH; touch $LOG_FILE; cd $DEPLOY_PATH/$APP_DIR

# Set execute command line
[ ! "$enable_debug" ] && export JAVA_DEBUG=""
EXEC_CMDLINE="$JAVA -Dloader.path=./lib  $VM_OPTIONS $GC_OPTIONS $JAVA_DEBUG -jar $JAR_NAME "
echo "*********************************************"
echo "Execute with the following JAVA command line:"
echo $EXEC_CMDLINE
echo "*********************************************"

# Call command line
nohup $EXEC_CMDLINE >/dev/null 2>&1 &

# Display log
[ "$enable_log" ] && tail -0f $LOG_PATH/process.log
exit 0
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,133评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,682评论 3 390
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,784评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,508评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,603评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,607评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,604评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,359评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,805评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,121评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,280评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,959评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,588评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,206评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,193评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,144评论 2 352

推荐阅读更多精彩内容