前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Assembly 打包和部署 Spring Boot

Assembly 打包和部署 Spring Boot

原创
作者头像
花落花相惜
发布2021-12-16 22:37:26
1.5K0
发布2021-12-16 22:37:26
举报

Assembly 的优势

上面介绍的 Fatjar 部署方案存在一些缺陷。因为我们如果直接构建一个 Spring Boot 的 FatJar

交由运维人员部署的话,整个配置文件都被隐藏到 jar

中,想要针对不同的环境修改配置文件就变成了一件很困难的事情。如果存在环境不确定,或者需要启动脚本启动项目的时候,这种直接通过 jar

的方式后续会需要处理很多工作。

而通过 assembly 将 Spring Boot 服务化打包,便能解决上面提到的 2 个问题

  • 使得 Spring Boot 能够加载 jar 外的配置文件。
  • 提供一个服务化的启动脚本,这个脚本一般是 shell 或者 windows 下的 bat ,有了 Spring Boot 的应用服务脚本后,就可以很容易的去启动和停止 Spring Boot 的应用了。

项目配置

添加插件

(1) 编辑项目的 pom.xml 文件,加入 assembly 打包插件。

代码语言:txt
复制
<build>
代码语言:txt
复制
    <plugins>
代码语言:txt
复制
        <plugin>
代码语言:txt
复制
            <groupId>org.springframework.boot</groupId>
代码语言:txt
复制
            <artifactId>spring-boot-maven-plugin</artifactId>
代码语言:txt
复制
        </plugin>
代码语言:txt
复制
        <plugin>
代码语言:txt
复制
            <!--主要使用的是maven提供的assembly插件完成-->
代码语言:txt
复制
            <artifactId>maven-assembly-plugin</artifactId>
代码语言:txt
复制
            <version>3.1.1</version>
代码语言:txt
复制
            <configuration>
代码语言:txt
复制
                <descriptors>
代码语言:txt
复制
                    <!--具体的配置文件-->
代码语言:txt
复制
                    <descriptor>src/main/assembly/assembly.xml</descriptor>
代码语言:txt
复制
                </descriptors>
代码语言:txt
复制
            </configuration>
代码语言:txt
复制
            <executions>
代码语言:txt
复制
                <execution>
代码语言:txt
复制
                    <id>make-assembly</id>
代码语言:txt
复制
                    <!--绑定到maven操作类型上-->
代码语言:txt
复制
                    <phase>package</phase>
代码语言:txt
复制
                    <!--运行一次-->
代码语言:txt
复制
                    <goals>
代码语言:txt
复制
                        <goal>single</goal>
代码语言:txt
复制
                    </goals>
代码语言:txt
复制
                </execution>
代码语言:txt
复制
            </executions>
代码语言:txt
复制
        </plugin>
代码语言:txt
复制
    </plugins>
代码语言:txt
复制
</build>

(2) 从上面代码可以看出,把 assembly 的配置都放在 main/assembly 目录下(具体目录里面的文件接下来会创建)。

使用Assembly打包和部署Spring Boot工程

编写服务启动/停止脚本

首先在 assembly 目录下创建一个 bin 文件夹,然后在该文件夹下创建一个 start.sh 文件,这个是 linux

环境下的启动脚本,具体内容如下。

Tip:开头的项目名称、jar 包名称不用我们手动设置,这里使用参数变量,在项目打包后这些参数自动会替换为 pom 的 profiles 中 properties 的值(assembly 配置文件需要开启属性替换功能),下面另外两个配置文件也同理。

代码语言:txt
复制
#!/bin/bash
代码语言:txt
复制
# 项目名称
代码语言:txt
复制
SERVER_NAME="${project.artifactId}"
代码语言:txt
复制
# jar名称
代码语言:txt
复制
JAR_NAME="${project.build.finalName}.jar"
代码语言:txt
复制
# 进入bin目录
代码语言:txt
复制
cd `dirname $0`
代码语言:txt
复制
# bin目录绝对路径
代码语言:txt
复制
BIN_DIR=`pwd`
代码语言:txt
复制
# 返回到上一级项目根目录路径
代码语言:txt
复制
cd ..
代码语言:txt
复制
# 打印项目根目录绝对路径
代码语言:txt
复制
# `pwd` 执行系统命令并获得结果
代码语言:txt
复制
DEPLOY_DIR=`pwd`
代码语言:txt
复制
# 外部配置文件绝对目录,如果是目录需要/结尾,也可以直接指定文件
代码语言:txt
复制
# 如果指定的是目录,spring则会读取目录中的所有配置文件
代码语言:txt
复制
CONF_DIR=$DEPLOY_DIR/config
代码语言:txt
复制
# SERVER_PORT=`sed '/server.port/!d;s/.*=//' config/application.properties | tr -d '\r'`
代码语言:txt
复制
# 获取应用的端口号
代码语言:txt
复制
SERVER_PORT=`sed -nr '/port: [0-9]+/ s/.*port: +([0-9]+).*/\1/p' config/application.yml`
代码语言:txt
复制
PIDS=`ps -f | grep java | grep "$CONF_DIR" |awk '{print $2}'`
代码语言:txt
复制
if [ "$1" = "status" ]; then
代码语言:txt
复制
    if [ -n "$PIDS" ]; then
代码语言:txt
复制
        echo "The $SERVER_NAME is running...!"
代码语言:txt
复制
        echo "PID: $PIDS"
代码语言:txt
复制
        exit 0
代码语言:txt
复制
    else
代码语言:txt
复制
        echo "The $SERVER_NAME is stopped"
代码语言:txt
复制
        exit 0
代码语言:txt
复制
    fi
代码语言:txt
复制
fi
代码语言:txt
复制
if [ -n "$PIDS" ]; then
代码语言:txt
复制
    echo "ERROR: The $SERVER_NAME already started!"
代码语言:txt
复制
    echo "PID: $PIDS"
代码语言:txt
复制
    exit 1
代码语言:txt
复制
fi
代码语言:txt
复制
if [ -n "$SERVER_PORT" ]; then
代码语言:txt
复制
    SERVER_PORT_COUNT=`netstat -tln | grep $SERVER_PORT | wc -l`
代码语言:txt
复制
    if [ $SERVER_PORT_COUNT -gt 0 ]; then
代码语言:txt
复制
        echo "ERROR: The $SERVER_NAME port $SERVER_PORT already used!"
代码语言:txt
复制
        exit 1
代码语言:txt
复制
    fi
代码语言:txt
复制
fi
代码语言:txt
复制
# 项目日志输出绝对路径
代码语言:txt
复制
LOGS_DIR=$DEPLOY_DIR/logs
代码语言:txt
复制
# 如果logs文件夹不存在,则创建文件夹
代码语言:txt
复制
if [ ! -d $LOGS_DIR ]; then
代码语言:txt
复制
    mkdir $LOGS_DIR
代码语言:txt
复制
fi
代码语言:txt
复制
STDOUT_FILE=$LOGS_DIR/catalina.log
代码语言:txt
复制
# JVM Configuration
代码语言:txt
复制
JAVA_OPTS=" -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true "
代码语言:txt
复制
JAVA_DEBUG_OPTS=""
代码语言:txt
复制
if [ "$1" = "debug" ]; then
代码语言:txt
复制
    JAVA_DEBUG_OPTS=" -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n "
代码语言:txt
复制
fi
代码语言:txt
复制
JAVA_JMX_OPTS=""
代码语言:txt
复制
if [ "$1" = "jmx" ]; then
代码语言:txt
复制
    JAVA_JMX_OPTS=" -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false "
代码语言:txt
复制
fi
代码语言:txt
复制
JAVA_MEM_OPTS=""
代码语言:txt
复制
BITS=`java -version 2>&1 | grep -i 64-bit`
代码语言:txt
复制
if [ -n "$BITS" ]; then
代码语言:txt
复制
    JAVA_MEM_OPTS=" -server -Xmx512m -Xms512m -Xmn256m -XX:PermSize=128m -Xss256k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 "
代码语言:txt
复制
else
代码语言:txt
复制
    JAVA_MEM_OPTS=" -server -Xms512m -Xmx512m -XX:PermSize=128m -XX:SurvivorRatio=2 -XX:+UseParallelGC "
代码语言:txt
复制
fi
代码语言:txt
复制
# 加载外部log4j2文件的配置
代码语言:txt
复制
LOG_IMPL_FILE=log4j2.xml
代码语言:txt
复制
LOGGING_CONFIG=""
代码语言:txt
复制
if [ -f "$CONF_DIR/$LOG_IMPL_FILE" ]
代码语言:txt
复制
then
代码语言:txt
复制
    LOGGING_CONFIG="-Dlogging.config=$CONF_DIR/$LOG_IMPL_FILE"
代码语言:txt
复制
fi
代码语言:txt
复制
CONFIG_FILES=" -Dlogging.path=$LOGS_DIR $LOGGING_CONFIG -Dspring.config.location=$CONF_DIR/ "
代码语言:txt
复制
echo -e "Starting the $SERVER_NAME ..."
代码语言:txt
复制
nohup java $JAVA_OPTS $JAVA_MEM_OPTS $JAVA_DEBUG_OPTS $JAVA_JMX_OPTS $CONFIG_FILES -jar $DEPLOY_DIR/lib/$JAR_NAME > $STDOUT_FILE 2>&1 &
代码语言:txt
复制
COUNT=0
代码语言:txt
复制
while [ $COUNT -lt 1 ]; do
代码语言:txt
复制
    echo -e ".\c"
代码语言:txt
复制
    sleep 1
代码语言:txt
复制
    if [ -n "$SERVER_PORT" ]; then
代码语言:txt
复制
        COUNT=`netstat -an | grep $SERVER_PORT | wc -l`
代码语言:txt
复制
    else
代码语言:txt
复制
       COUNT=`ps -f | grep java | grep "$DEPLOY_DIR" | awk '{print $2}' | wc -l`
代码语言:txt
复制
    fi
代码语言:txt
复制
    if [ $COUNT -gt 0 ]; then
代码语言:txt
复制
        break
代码语言:txt
复制
    fi
代码语言:txt
复制
done
代码语言:txt
复制
echo "OK!"
代码语言:txt
复制
PIDS=`ps -f | grep java | grep "$DEPLOY_DIR" | awk '{print $2}'`
代码语言:txt
复制
echo "PID: $PIDS"
代码语言:txt
复制
echo "STDOUT: $STDOUT_FILE"

然后创建一个 stop.sh 文件,这个是 linux 环境下的停止脚本,具体内容如下。

代码语言:txt
复制
#!/bin/bash
代码语言:txt
复制
# 项目名称
代码语言:txt
复制
APPLICATION="${project.artifactId}"
代码语言:txt
复制
# 项目启动jar包名称
代码语言:txt
复制
APPLICATION_JAR="${project.build.finalName}.jar"
代码语言:txt
复制
# 通过项目名称查找到PI,然后kill -9 pid
代码语言:txt
复制
PID=$(ps -ef | grep "${APPLICATION_JAR}" | grep -v grep | awk '{ print $2 }')
代码语言:txt
复制
if [[ -z "$PID" ]]
代码语言:txt
复制
then
代码语言:txt
复制
    echo ${APPLICATION} is already stopped
代码语言:txt
复制
else
代码语言:txt
复制
    echo kill  ${PID}
代码语言:txt
复制
    kill -9 ${PID}
代码语言:txt
复制
    echo ${APPLICATION} stopped successfully
代码语言:txt
复制
fi

最后创建一个 start.bat 文件,这个是 Windows 环境下的启动脚本,具体内容如下。

代码语言:txt
复制
echo off
代码语言:txt
复制
set APP_NAME=${project.build.finalName}.jar
代码语言:txt
复制
set LOG_IMPL_FILE=log4j2.xml
代码语言:txt
复制
set LOGGING_CONFIG=
代码语言:txt
复制
if exist ../config/%LOG_IMPL_FILE% (
代码语言:txt
复制
    set LOGGING_CONFIG=-Dlogging.config=../config/%LOGGING_CONFIG%
代码语言:txt
复制
)
代码语言:txt
复制
set CONFIG= -Dlogging.path=../logs %LOGGING_CONFIG% -Dspring.config.location=../config/
代码语言:txt
复制
set DEBUG_OPTS=
代码语言:txt
复制
if ""%1"" == ""debug"" (
代码语言:txt
复制
   set DEBUG_OPTS= -Xloggc:../logs/gc.log -verbose:gc -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=../logs
代码语言:txt
复制
   goto debug
代码语言:txt
复制
)
代码语言:txt
复制
set JMX_OPTS=
代码语言:txt
复制
if ""%1"" == ""jmx"" (
代码语言:txt
复制
   set JMX_OPTS= -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9888 -Dcom.sun.management.jmxremote.ssl=FALSE -Dcom.sun.management.jmxremote.authenticate=FALSE
代码语言:txt
复制
   goto jmx
代码语言:txt
复制
)
代码语言:txt
复制
echo "Starting the %APP_NAME%"
代码语言:txt
复制
java -Xms512m -Xmx512m -server %DEBUG_OPTS% %JMX_OPTS% %CONFIG% -jar ../lib/%APP_NAME%
代码语言:txt
复制
echo "java -Xms512m -Xmx512m -server %DEBUG_OPTS% %JMX_OPTS% %CONFIG% -jar ../lib/%APP_NAME%"
代码语言:txt
复制
goto end
代码语言:txt
复制
:debug
代码语言:txt
复制
echo "debug"
代码语言:txt
复制
java -Xms512m -Xmx512m -server %DEBUG_OPTS% %CONFIG% -jar ../lib/%APP_NAME%
代码语言:txt
复制
goto end
代码语言:txt
复制
:jmx
代码语言:txt
复制
java -Xms512m -Xmx512m -server %JMX_OPTS% %CONFIG% -jar ../lib/%APP_NAME%
代码语言:txt
复制
goto end
代码语言:txt
复制
:end
代码语言:txt
复制
pause

创建打包配置文件

最后,我们在 assembly 文件夹下创建一个 assembly.xml 配置文件,具体内容如下。

代码语言:txt
复制
<assembly>
代码语言:txt
复制
    <!--
代码语言:txt
复制
        必须写,否则打包时会有 assembly ID must be present and non-empty 错误
代码语言:txt
复制
        这个名字最终会追加到打包的名字的末尾,如项目的名字为 hangge-test-0.0.1-SNAPSHOT,
代码语言:txt
复制
        则最终生成的包名为 hangge-test-0.0.1-SNAPSHOT-bin.tar.gz
代码语言:txt
复制
     -->
代码语言:txt
复制
    <id>bin</id>
代码语言:txt
复制
    <!-- 打包的类型,如果有N个,将会打N个类型的包 -->
代码语言:txt
复制
    <formats>
代码语言:txt
复制
        <format>tar.gz</format>
代码语言:txt
复制
        <!--<format>zip</format>-->
代码语言:txt
复制
    </formats>
代码语言:txt
复制
    <includeBaseDirectory>true</includeBaseDirectory>
代码语言:txt
复制
    <!--文件设置-->
代码语言:txt
复制
    <fileSets>
代码语言:txt
复制
        <!--
代码语言:txt
复制
            0755->即用户具有读/写/执行权限,组用户和其它用户具有读写权限;
代码语言:txt
复制
            0644->即用户具有读写权限,组用户和其它用户具有只读权限;
代码语言:txt
复制
        -->
代码语言:txt
复制
        <!-- 将src/main/assembly/bin目录下的所有文件输出到打包后的bin目录中 -->
代码语言:txt
复制
        <fileSet>
代码语言:txt
复制
            <directory>src/main/assembly/bin</directory>
代码语言:txt
复制
            <outputDirectory>bin</outputDirectory>
代码语言:txt
复制
            <fileMode>0755</fileMode>
代码语言:txt
复制
            <!--如果是脚本,一定要改为unix.如果是在windows上面编码,会出现dos编写问题-->
代码语言:txt
复制
            <lineEnding>unix</lineEnding>
代码语言:txt
复制
            <filtered>true</filtered><!-- 是否进行属性替换 -->
代码语言:txt
复制
        </fileSet>
代码语言:txt
复制
        <!-- 将src/main/assembly/config目录下的所有文件输出到打包后的config目录中 -->
代码语言:txt
复制
        <fileSet>
代码语言:txt
复制
            <directory>src/main/assembly/config</directory>
代码语言:txt
复制
            <outputDirectory>config</outputDirectory>
代码语言:txt
复制
            <fileMode>0644</fileMode>
代码语言:txt
复制
        </fileSet>
代码语言:txt
复制
        <!-- 将src/main/resources下配置文件打包到config目录 -->
代码语言:txt
复制
        <fileSet>
代码语言:txt
复制
            <directory>src/main/resources</directory>
代码语言:txt
复制
            <outputDirectory>/config</outputDirectory>
代码语言:txt
复制
            <includes>
代码语言:txt
复制
                <include>**/*.xml</include>
代码语言:txt
复制
                <include>**/*.properties</include>
代码语言:txt
复制
                <include>**/*.yml</include>
代码语言:txt
复制
            </includes>
代码语言:txt
复制
            <filtered>true</filtered><!-- 是否进行属性替换 -->
代码语言:txt
复制
        </fileSet>
代码语言:txt
复制
        <!-- 将项目启动jar打包到lib目录中 -->
代码语言:txt
复制
        <fileSet>
代码语言:txt
复制
            <directory>target</directory>
代码语言:txt
复制
            <outputDirectory>lib</outputDirectory>
代码语言:txt
复制
            <includes>
代码语言:txt
复制
                <include>*.jar</include>
代码语言:txt
复制
            </includes>
代码语言:txt
复制
        </fileSet>
代码语言:txt
复制
        <!-- 将项目说明文档打包到docs目录中 -->
代码语言:txt
复制
        <fileSet>
代码语言:txt
复制
            <directory>.</directory>
代码语言:txt
复制
            <outputDirectory>docs</outputDirectory>
代码语言:txt
复制
            <includes>
代码语言:txt
复制
                <include>*.md</include>
代码语言:txt
复制
            </includes>
代码语言:txt
复制
            <fileMode>0644</fileMode>
代码语言:txt
复制
        </fileSet>
代码语言:txt
复制
        <fileSet>
代码语言:txt
复制
            <directory>docs</directory>
代码语言:txt
复制
            <outputDirectory>docs</outputDirectory>
代码语言:txt
复制
            <fileMode>0644</fileMode>
代码语言:txt
复制
        </fileSet>
代码语言:txt
复制
        <fileSet>
代码语言:txt
复制
            <directory>src/main/assembly/docs</directory>
代码语言:txt
复制
            <outputDirectory>docs</outputDirectory>
代码语言:txt
复制
            <fileMode>0644</fileMode>
代码语言:txt
复制
        </fileSet>
代码语言:txt
复制
      </fileSets>
代码语言:txt
复制
  </assembly>

打包测试

打包项目

  1. 我们使用 mvn package 命令对项目进行打包。
  2. 打包后在 target 下便会生成一个名为 xxx.tar.gz 的压缩文件。
  3. 将这个压缩包解压后可以看到内部包含的目录如下。

启动服务

  1. 上述打包文件解压后,在 bin 目录有如下几个启动文件
  • Linux、macOS 系统:执行 start.sh 启动服务,执行 stop.sh 停止服务。
  • Windows 系统:双击 start.bat 即可启动服务
  1. 服务启动后,相应的日志文件会生成到 logs 目录下(logs 目录会自动创建)

修改配置

  1. 修改 config 文件夹下面的配置文件,此处的配置文件是 application.properties。
  2. 这里我们将服务端口改成 9090。
代码语言:txt
复制
server.port=9090
  1. 重启服务,可以看到端口确实发生了变化,说明外部配置文件加载成功。

将项目与依赖分开打包

至此,上文中介绍的使用 assembly 对项目打包时,项目代码和项目所有的依赖文件会一起打成一个可执行的 jar 包。

如果项目的依赖包很多,那么这个文件就会非常大。每次发布版本如果都要上传这个整个的 jar 包,既浪费带宽也浪费时间。

下面介绍如何将项目的外部依赖跟自己的代码包分开打包,这样当项目修改后,只需要上传覆盖修改后的包即可。

修改配置

  1. 首先我们编辑 assembly.xml 配置文件。在前文的基础上新增第三方依赖设置,实现将第三方的 jar 包添加到压缩包里的 lib 目录。
代码语言:txt
复制
<assembly>
代码语言:txt
复制
    <!--
代码语言:txt
复制
        必须写,否则打包时会有 assembly ID must be present and non-empty 错误
代码语言:txt
复制
        这个名字最终会追加到打包的名字的末尾,如项目的名字为 hangge-test-0.0.1-SNAPSHOT,
代码语言:txt
复制
        则最终生成的包名为 hangge-test-0.0.1-SNAPSHOT-bin.tar.gz
代码语言:txt
复制
     -->
代码语言:txt
复制
    <id>bin</id>
代码语言:txt
复制
    <!-- 打包的类型,如果有N个,将会打N个类型的包 -->
代码语言:txt
复制
    <formats>
代码语言:txt
复制
        <format>tar.gz</format>
代码语言:txt
复制
        <!--<format>zip</format>-->
代码语言:txt
复制
    </formats>
代码语言:txt
复制
    <includeBaseDirectory>true</includeBaseDirectory>
代码语言:txt
复制
    <!--第三方依赖设置-->
代码语言:txt
复制
    <dependencySets>
代码语言:txt
复制
        <dependencySet>
代码语言:txt
复制
            <!-- 不使用项目的artifact,第三方jar不要解压,打包进zip文件的lib目录 -->
代码语言:txt
复制
            <useProjectArtifact>false</useProjectArtifact>
代码语言:txt
复制
            <outputDirectory>lib</outputDirectory>
代码语言:txt
复制
            <unpack>false</unpack>
代码语言:txt
复制
        </dependencySet>
代码语言:txt
复制
    </dependencySets>
代码语言:txt
复制
    <!--文件设置-->
代码语言:txt
复制
    <fileSets>
代码语言:txt
复制
        <!--
代码语言:txt
复制
            0755->即用户具有读/写/执行权限,组用户和其它用户具有读写权限;
代码语言:txt
复制
            0644->即用户具有读写权限,组用户和其它用户具有只读权限;
代码语言:txt
复制
        -->
代码语言:txt
复制
        <!-- 将src/main/assembly/bin目录下的所有文件输出到打包后的bin目录中 -->
代码语言:txt
复制
        <fileSet>
代码语言:txt
复制
            <directory>src/main/assembly/bin</directory>
代码语言:txt
复制
            <outputDirectory>bin</outputDirectory>
代码语言:txt
复制
            <fileMode>0755</fileMode>
代码语言:txt
复制
            <!--如果是脚本,一定要改为unix.如果是在windows上面编码,会出现dos编写问题-->
代码语言:txt
复制
            <lineEnding>unix</lineEnding>
代码语言:txt
复制
            <filtered>true</filtered><!-- 是否进行属性替换 -->
代码语言:txt
复制
        </fileSet>
代码语言:txt
复制
        <!-- 将src/main/assembly/config目录下的所有文件输出到打包后的config目录中 -->
代码语言:txt
复制
        <fileSet>
代码语言:txt
复制
            <directory>src/main/assembly/config</directory>
代码语言:txt
复制
            <outputDirectory>config</outputDirectory>
代码语言:txt
复制
            <fileMode>0644</fileMode>
代码语言:txt
复制
        </fileSet>
代码语言:txt
复制
        <!-- 将src/main/resources下配置文件打包到config目录 -->
代码语言:txt
复制
        <fileSet>
代码语言:txt
复制
            <directory>src/main/resources</directory>
代码语言:txt
复制
            <outputDirectory>/config</outputDirectory>
代码语言:txt
复制
            <includes>
代码语言:txt
复制
                <include>**/*.xml</include>
代码语言:txt
复制
                <include>**/*.properties</include>
代码语言:txt
复制
                <include>**/*.yml</include>
代码语言:txt
复制
            </includes>
代码语言:txt
复制
            <filtered>true</filtered><!-- 是否进行属性替换 -->
代码语言:txt
复制
        </fileSet>
代码语言:txt
复制
        <!-- 将项目启动jar打包到lib目录中 -->
代码语言:txt
复制
        <fileSet>
代码语言:txt
复制
            <directory>target</directory>
代码语言:txt
复制
            <outputDirectory>lib</outputDirectory>
代码语言:txt
复制
            <includes>
代码语言:txt
复制
                <include>*.jar</include>
代码语言:txt
复制
            </includes>
代码语言:txt
复制
        </fileSet>
代码语言:txt
复制
        <!-- 将项目说明文档打包到docs目录中 -->
代码语言:txt
复制
        <fileSet>
代码语言:txt
复制
            <directory>.</directory>
代码语言:txt
复制
            <outputDirectory>docs</outputDirectory>
代码语言:txt
复制
            <includes>
代码语言:txt
复制
                <include>*.md</include>
代码语言:txt
复制
            </includes>
代码语言:txt
复制
            <fileMode>0644</fileMode>
代码语言:txt
复制
        </fileSet>
代码语言:txt
复制
        <fileSet>
代码语言:txt
复制
            <directory>docs</directory>
代码语言:txt
复制
            <outputDirectory>docs</outputDirectory>
代码语言:txt
复制
            <fileMode>0644</fileMode>
代码语言:txt
复制
        </fileSet>
代码语言:txt
复制
        <fileSet>
代码语言:txt
复制
            <directory>src/main/assembly/docs</directory>
代码语言:txt
复制
            <outputDirectory>docs</outputDirectory>
代码语言:txt
复制
            <fileMode>0644</fileMode>
代码语言:txt
复制
        </fileSet>
代码语言:txt
复制
      </fileSets>
代码语言:txt
复制
  </assembly>
  1. 接着编辑项目的 pom.xml 文件,先前使用的是 spring-boot-maven-plugin 来打包,这个插件会将项目所有的依赖打入项目 jar 包里面。我们将其替换为 maven-jar-plugin,并进行相关设置。
代码语言:txt
复制
<build>
代码语言:txt
复制
    <plugins>
代码语言:txt
复制
        <!-- 指定启动类,将依赖打成外部jar包 -->
代码语言:txt
复制
        <plugin>
代码语言:txt
复制
            <groupId>org.apache.maven.plugins</groupId>
代码语言:txt
复制
            <artifactId>maven-jar-plugin</artifactId>
代码语言:txt
复制
            <configuration>
代码语言:txt
复制
                <archive>
代码语言:txt
复制
                    <!-- 生成的jar中,不要包含pom.xml和pom.properties这两个文件 -->
代码语言:txt
复制
                    <addMavenDescriptor>false</addMavenDescriptor>
代码语言:txt
复制
                    <manifest>
代码语言:txt
复制
                        <!-- 是否要把第三方jar加入到类构建路径 -->
代码语言:txt
复制
                        <addClasspath>true</addClasspath>
代码语言:txt
复制
                        <!-- 外部依赖jar包的最终位置 -->
代码语言:txt
复制
                        <!-- 因为我们将第三方jar和本项目jar放在同一个目录下,这里就使用./ -->
代码语言:txt
复制
                        <classpathPrefix>./</classpathPrefix>
代码语言:txt
复制
                        <!-- 项目启动类 -->
代码语言:txt
复制
                        <mainClass>com.example.hanggetest.HanggeTestApplication</mainClass>
代码语言:txt
复制
                    </manifest>
代码语言:txt
复制
                </archive>
代码语言:txt
复制
            </configuration>
代码语言:txt
复制
        </plugin>
代码语言:txt
复制
        <plugin>
代码语言:txt
复制
            <!--主要使用的是maven提供的assembly插件完成-->
代码语言:txt
复制
            <artifactId>maven-assembly-plugin</artifactId>
代码语言:txt
复制
            <version>3.1.1</version>
代码语言:txt
复制
            <configuration>
代码语言:txt
复制
                <descriptors>
代码语言:txt
复制
                    <!--具体的配置文件-->
代码语言:txt
复制
                    <descriptor>src/main/assembly/assembly.xml</descriptor>
代码语言:txt
复制
                </descriptors>
代码语言:txt
复制
            </configuration>
代码语言:txt
复制
            <executions>
代码语言:txt
复制
                <execution>
代码语言:txt
复制
                    <id>make-assembly</id>
代码语言:txt
复制
                    <!--绑定到maven操作类型上-->
代码语言:txt
复制
                    <phase>package</phase>
代码语言:txt
复制
                    <!--运行一次-->
代码语言:txt
复制
                    <goals>
代码语言:txt
复制
                        <goal>single</goal>
代码语言:txt
复制
                    </goals>
代码语言:txt
复制
                </execution>
代码语言:txt
复制
            </executions>
代码语言:txt
复制
        </plugin>
代码语言:txt
复制
    </plugins>
代码语言:txt
复制
</build>

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
0 条评论
热度
最新
推荐阅读
目录
  • Assembly 的优势
  • 项目配置
    • 添加插件
      • 编写服务启动/停止脚本
        • 创建打包配置文件
        • 打包测试
          • 打包项目
            • 启动服务
              • 修改配置
              • 将项目与依赖分开打包
                • 修改配置
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档