maven项目打包时将依赖的jar包和项目代码分离

10 篇文章 0 订阅
6 篇文章 0 订阅

有时候我们的项目依赖的jar包比较多,项目会很大,那我们每次部署更新的时候上传都会很慢,其实我们只是想更新里面的代码而已,而那众多的依赖包并不想重新上传,这时候我们就需要将依赖包和项目代码分离开来了

这是我分离之后target目录

其中lib下都是项目依赖的jar包,原本我的plat-admin.jar有70多M,现在只有1M多了

下面是pom.xml的plugin配置


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

            <plugin>
                <!--打包时去除第三方依赖-->
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <layout>ZIP</layout>
                    <includes> <!-- 不排除的依赖 -->
                        <include>
                            <groupId>non-exists</groupId>
                            <artifactId>non-exists</artifactId>
                        </include>
                        <include>
                            <groupId>com.text.aaa</groupId>
                            <artifactId>${project.parent.artifactId}-core</artifactId>
                        </include>
                        <include>
                            <groupId>com.text.aaa</groupId>
                            <artifactId>common</artifactId>
                        </include>
                    </includes>
                </configuration>
            </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>
                            <!--target/lib是依赖jar包的输出目录,根据自己喜好配置-->
                            <outputDirectory>target/lib/${project.parent.artifactId}</outputDirectory>
                            <excludeTransitive>false</excludeTransitive>
                            <stripVersion>false</stripVersion>
                            <includeScope>runtime</includeScope>
                            <!-- 不拷贝的依赖 -->
                            <excludeArtifactIds>common,${project.parent.artifactId}-core</excludeArtifactIds>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

pom.xml中加上上面的配置那么打包出来的项目代码和依赖的jar包就会分离开来了

linux运行项目的jar包就不是之前的:  nohup java -jar xxx.jar &   了

需要指定lib目录: nohup  java -Dloader.path=lib包的路径,resources,lib -Dfile.encoding=utf-8 -jar xxx.jar &

最后再补一个启动这种jar包的shell脚本

#! /bin/bash
#jar文件路径(自定义配置)
CURRENT_PATH="/usr/local/servers/"
#lib依赖路径(自定义配置)
LIB_PATH="/usr/local/servers/lib/"
#日志路径(自定义配置)
LOG_PATH="/usr/local/servers/logs/"
#服务名称(自定义配置)
SERVER_NAMES=("serverName1" "serverName2")
#运行环境(自定义配置)
SERVER_ENVIRONMENT="dev"
#堆栈内存配置
JAR_MEMORY="-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xms512m -Xmx512m -Xmn256m -Xss256k -XX:SurvivorRatio=8 -XX:+UseG1GC"
#外部配置文件
#OUT_YML_PATH=${CURRENT_PATH}application-${2}-${SERVER_ENVIRONMENT}
OUT_YML_PATH=${CURRENT_PATH}application-${SERVER_ENVIRONMENT}


COMMANDS=("start" "stop" "restart" "status")
JAR=""
PID=""
START_TIME=""
RUN_TIME=""

#判断第一个参数是否正确
if [[ ! " ${COMMANDS[@]} " =~ " ${1} " ]] || [ -z "${1}" ]; then
    echo -e "指令错误: ./outyml_servers.sh [ ${COMMANDS[@]} ] ${2}  \n" >&2
    exit 1
fi

#判断第二个参数是否正确
if [[ ! " ${SERVER_NAMES[@]} "  =~ " ${2} " ]] || [ -z "${2}" ]; then
    echo -e "服务名称错误: ./servers.sh ${1} [ ${SERVER_NAMES[@]} ]  \n" >&2
    exit 1
fi



#根据不同的服务定义项目路径和日志路径,判断第二个参数是否正确
if [[ "${SERVER_NAMES[@]}"  =~ "${2}" ]] && [ ${2} ]; then
    JAR=${2}
    #服务名称为grid需要单独判断
    if [ "${2}" = "grid" ]; then
	JAR="grid-web"
    fi

    CURRENT_PATH=${CURRENT_PATH}
    #LOG_PATH=${LOG_PATH}${2}.log
    JAR=$(find $CURRENT_PATH -maxdepth 1 -name "*${JAR}*.jar")
    PID=$(ps -ef | grep $JAR | grep -v grep | awk '{ print $2 }')

elif [ "status" = "${1}" ] && [ "all" = "${2}" ]; then
    # 遍历所有服务获取状态
    for SERVER_NAME in ${SERVER_NAMES[@]}
    do
       ${0} ${1} ${SERVER_NAME}
    done
    exit 1
else
    echo -e "Usage: ./servers.sh ${1}  [ ${SERVER_NAMES[@]} ] \n" >&2
    exit 1
fi

#指定的服务扩大堆栈内存
if [[ "("serverName1")" =~ "${2}" ]]; then
   JAR_MEMORY="-XX:MetaspaceSize=1024m -XX:MaxMetaspaceSize=1024m -Xms1024m -Xmx1024m -Xmn1024m -Xss256k -XX:SurvivorRatio=8 -XX:+UseG1GC"
fi


#打印进程详细信息
function printStatus() {

    START_TIME=$(ps -eo pid,lstart,etime | grep -v 'grep' | grep $PID | awk '{ print $2,$3,$4,$5,$6 }')
    RUN_TIME=$(ps -eo pid,lstart,etime | grep -v 'grep' | grep $PID | awk '{ print $7 }')
    echo -e " 正在运行中:$JAR \n 进程ID: $PID  \n 进程开始时间: $START_TIME \n 已运行: $RUN_TIME"
    echo -e " 运行环境: $SERVER_ENVIRONMENT \n"
}


case "${1}" in
    "start")
        if [ ! -z "$PID" ]; then
            echo  "$JAR 已经启动,进程号: $PID "
        else
            echo -e "启动 $JAR ... \n"
            cd $CURRENT_PATH
            nohup java -Dloader.path=$LIB_PATH${2}  -Dfile.encodiing=UTF-8  $JAR_MEMORY  -jar $JAR -Dconfig=${OUT_YML_PATH}   --spring.profiles.active=$SERVER_ENVIRONMENT >$LOG_PATH${2}.log 2>&1 &
            if [ "$?" = "0" ]; then
                echo -e "$JAR 启动完成,请查看日志确保成功 \n"
            else
                echo -e "$JAR 启动失败 \n"
            fi
        fi
        ;;
    "stop")
        if [ -z "$PID" ]; then
            echo -e "$JAR 没有在运行,无需关闭 \n"
        else
            echo -e "关闭 $JAR ..."
              kill -9 $PID
            if [ "$?" = "0" ]; then
                echo -e "服务已关闭 \n"
            else
                echo -e "服务关闭失败 \n"
            fi
        fi
        ;;
    "restart")
        ${0} stop ${2}
        ${0} start ${2}
        ;;
    "status")
        if [ ! -z "$PID" ]; then
            printStatus
        else
            echo -e "$JAR 未在运行 \n"
        fi
        ;;
  *)
    echo -e "Usage: ./springboot.sh {start|stop|restart|status} [ ${SERVER_NAMES[@]} ] \n" >&2
        exit 1
esac
2023-08-10补充更新,新增打包时将lib和业务jar包移动到指定的目录,然后执行clean时删除指定的文件

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

            <plugin>
                <!--打包时去除第三方依赖-->
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <layout>ZIP</layout>
                    <includes> <!-- 不排除的依赖 -->
                        <include>
                            <groupId>non-exists</groupId>
                            <artifactId>non-exists</artifactId>
                        </include>
                        <include>
                            <groupId>com.text.aaa</groupId>
                            <artifactId>${project.parent.artifactId}-core</artifactId>
                        </include>
                        <include>
                            <groupId>com.text.aaa</groupId>
                            <artifactId>common</artifactId>
                        </include>
                    </includes>
                </configuration>
            </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>
                            <!--target/lib是依赖jar包的输出目录,根据自己喜好配置-->
                            <outputDirectory>../../A-deploy/package/lib/${project.parent.artifactId}</outputDirectory>
                            <excludeTransitive>false</excludeTransitive>
                            <stripVersion>false</stripVersion>
                            <includeScope>runtime</includeScope>
                            <!-- 不拷贝的依赖 -->
                            <excludeArtifactIds>common,${project.parent.artifactId}-core</excludeArtifactIds>
                        </configuration>
                    </execution>

                    <!-- 添加额外的 execution 配置来移动 JAR 文件 -->
                    <execution>
                        <id>move-jar</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy</goal>
                        </goals>
                        <configuration>
                            <!-- 指定要移动的 JAR 文件 -->
                            <artifactItems>
                                <artifactItem>
                                    <groupId>${project.groupId}</groupId>
                                    <artifactId>${project.artifactId}</artifactId>
                                    <version>${project.version}</version>
                                    <type>jar</type>
                                    <overWrite>true</overWrite>
                                    <outputDirectory>../../A-deploy/package/jars/</outputDirectory>
                                    <destFileName>${project.artifactId}.jar</destFileName>
                                </artifactItem>
                            </artifactItems>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <artifactId>maven-clean-plugin</artifactId>
                <configuration>
                    <filesets>
                        <fileset>
                            <!-- 指定执行clean要操作的目录 -->
                            <directory>../../A-deploy/package/lib/${project.parent.artifactId}</directory>
                            <includes>
                                <!-- 目录下要删除的数据,**/*=删除目录下的文件,不删除目录,**=删除整个目录 -->
                                <include>**/*</include>
                            </includes>
                            <followSymlinks>false</followSymlinks>
                        </fileset>
                        <!-- 删除业务代码jar包 -->
                        <fileset>
                            <directory>../../A-deploy/package/jars/</directory>
                            <includes>
                                <include>${project.artifactId}.jar</include>
                            </includes>
                            <followSymlinks>false</followSymlinks>
                        </fileset>
                    </filesets>
                </configuration>
            </plugin>
        </plugins>
    </build>

  • 0
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: springbootvue前后端分离项目的设计思路和方法一般是前端和后端分离,通过RESTful接口进行数据交互。前端使用Vue框架进行开发,后端使用SpringBoot框架进行开发,前后端通过接口进行数据传输。具体的方法一般是先确定需求,然后进行接口设计,前端和后端分别开发,最后进行集成测试和上线发布。在开发过程中,需要注重接口的设计和规范,保证数据的安全性和正确性,同需要注重前后端的协作和沟通,保证项目的顺利进行。 ### 回答2: Spring Boot和Vue的前后端分离项目设计思路和方法一般如下: 1.确定项目需求:首先明确需要开发的功能和需求,详细了解业务流程,并确定前后端交互的数据格式和接口规范。 2.选择技术栈:根据项目需求选择合适的技术栈。前端可以选择Vue作为前端框架,后端可以选择Spring Boot作为后端框架。 3.前端项目搭建:使用 Vue CLI 搭建前端项目,设置好项目的目录结构和配置文件。 4.后端项目搭建:使用 Spring Initializr 或手动配置搭建 Spring Boot 项目,引入必要的依赖,并设置好项目的配置文件。 5.接口开发:后端开发人员按照需求设计和编写接口,包括接口的路径、请求参数、返回数据等。可以使用Spring Boot提供的@RestController注解编写RESTful风格的接口。 6.前后端联调:前端开发人员根据后端接口文档,使用axios等工具发送请求,获取后端返回的数据并进行处理。 7.界面设计和交互开发:前端开发人员根据需求进行界面设计和交互开发,使用Vue组件化开发,配合Element UI等UI框架实现页面效果。 8.前端打包和部署:前端代码打包为静态资源,发布到服务器或者云服务上。可以使用Vue CLI提供的命令进行打包。 9.后端打包和部署:后端代码打包jar包,发布到服务器或者云服务上。可以使用Spring Boot提供的Maven插件进行打包。 10.项目优化和测试:根据实际情况进行性能优化和功能测试,确保项目的稳定性和可靠性。 以上是Spring Boot和Vue前后端分离项目的一般设计思路和方法,具体实现过程中还需要根据项目需求进行适当的调整和优化。 ### 回答3: Spring Boot和Vue.js是目前非常流行的前后端分离的技术栈。设计思路和方法一般包括以下几个方面: 1. 前后端分离项目的前端和后端分别使用Vue.js和Spring Boot进行开发。前端负责展示页面和用户交互逻辑,后端负责处理业务逻辑和数据存储。 2. RESTful API:前后端通过RESTful API进行通信。后端提供接口供前端调用,并返回JSON格式的数据。 3. 数据交互:前端通过Axios等工具向后端发送请求,后端通过数据持久化(如数据库)存储数据,并返回处理结果给前端。 4. 跨域解决方案:由于前后端分别运行在不同的端口或者域名下,可能存在跨域访问的问题。可以通过配置后端的CORS(跨域资源共享)或者使用代理服务器解决跨域问题。 5. 登录认证:在用户登录,前端发送登录请求到后端进行验证,并采用令牌(Token)机制来保存用户的登录状态。后续的请求中,前端会携带该令牌,在后端进行验证,保证接口的安全性。 6. 前端路由:在Vue.js中使用vue-router进行前端路由管理,实现单页应用。根据URL的变化,前端可以切换到不同的页面,而不需要重新加载整个页面。后端只负责提供基础页面和接口。 7. 构建与部署:前端使用npm或yarn进行项目的构建,将生成的静态文件部署到Web服务器上。后端使用Spring Boot中的嵌入式服务器进行部署。可以将前后端打包在一起发布,或者分别打包后独立发布。 总之,Spring Boot和Vue.js的前后端分离项目设计思路和方法主要包括前后端分离、RESTful API、跨域解决方案、登录认证、前端路由和构建部署。这些方法可以使项目更加灵活、可维护和易扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值