首页 > 其他分享 >Spring Boot 使用 loader.path 精简包

Spring Boot 使用 loader.path 精简包

时间:2023-05-07 23:22:50浏览次数:33  
标签:WEB grep NAME lib Spring jar loader Boot path

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

 

标签:WEB,grep,NAME,lib,Spring,jar,loader,Boot,path
From: https://www.cnblogs.com/youxin/p/17380438.html

相关文章

  • swagger3.0集成 (springboot2.6.7)
    springboot2.6.7+swagger3.0导入依赖<dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version></dependency>s......
  • Springboot 自定义Web容器
    Springboot自定义Web容器如果你的项目并发量比较高,想要修改最大线程数、最大连接数等配置信息,可以通过自定义Web容器的方式,代码如下所示。@SpringBootApplication(proxyBeanMethods=false)publicclassAppimplementsWebServerFactoryCustomizer<ConfigurableServletWebSer......
  • Rockchip RK3399 - uboot移植
    ----------------------------------------------------------------------------------------------------------------------------开发板 :NanoPC-T4开发板eMMC  :16GBLPDDR3:4GB显示屏 :15.6英寸HDMI接口显示屏u-boot  :2014.10---------------------------------------......
  • boot-admin开源项目中有关后端参数校验的最佳实践
    我们在项目开发中,经常会对一些参数进行校验,比如非空校验、长度校验,以及定制的业务校验规则等,如果使用if/else语句来对请求的每一个参数一一校验,就会出现大量与业务逻辑无关的代码,繁重不堪且繁琐的校验,会大大降低我们的工作效率,而且准确性也无法保证。为保证数据的正确性、完整性,前......
  • Spring中@Bean注解的作用以及如何使用
    Spring中@Bean注解的作用以及如何使用一、Bean是啥1、Java面向对象,对象有方法和属性,那么就需要对象实例来调用方法和属性(即实例化); 2、凡是有方法或属性的类都需要实例化,这样才能具象化去使用这些方法和属性; 3、规律:凡是子类及带有方法或属性的类都要加上注册Bean到SpringIo......
  • HelloSpring
    别提了,学了一会儿黑马的SSM框架,很懵听了女朋友的建议,改换遇见狂神说的Spring的讲解课程了跟着狂神说,编写了最初的程序HelloSpring程序第一步,Maven导入Spring和junit的依赖第二步,创建pojo文件夹,导入一个实体类作为练习记得需要鼠标右键,选择ptgJavaBean(可以自动创建下面那一......
  • Spring复习笔记
    Spring架构核心概念IOC&DIIOCDIbeanbean的实例化......
  • springmvc知识梳理 一篇就能让你的项目按照springmvc框架跑起来
    springmvc目录1.创建基本框架步骤2.@RequestMapping()2.1value属性2.1.1路径支持ant风格2.1.2restful风格2.2method属性2.2.1form表单问题:2.2.2get和post相关问题(涉及面试题):2.3param属性书写格式:thymeleaf语法:2.4headers属性3.获取请求参数......
  • Spring
    SpringFramework1.Spring介绍官网:https://spring.ioSpring能做什么:用以开发web、微服务以及分布式系统等,光这三块就已经占了JavaEE开发的九成多。Spring并不是单一的一个技术,而是一个大家族,可以从官网的Projects中查看其包含的所有技术。SpringFramework:Spring框......
  • SpringMvc
    SpringMVC1SpringMVC概述问题导入SpringMVC框架有什么优点?1.1SpringMVC概述SpringMVC是一种基于Java实现MVC模型的轻量级Web框架优点使用简单,开发便捷(相比于Servlet)灵活性强2入门案例【重点】问题导入在Controller中如何定义访问路径,如何响应数据?2.1实现步骤......