代码改变世界

Spring Boot 使用 loader.path 精简包

  youxin  阅读(3258)  评论(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-Classloader.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
复制代码

 

相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2016-05-07 在windows下配置pthread
2013-05-07 urllib2使用
点击右上角即可分享
微信分享提示