springboot如何使用assembly打包项目和启动脚本
作者:向日葵的种籽
这篇文章主要介绍了springboot如何使用assembly打包项目和启动脚本问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
使用assembly打包项目和启动脚本
图为项目的具体布局

其中bin 是 启动脚本目录
assembly 是打包配置
pom.xml关键配置
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>2.6</version> <executions> <execution> <id>bundle</id> <phase>package</phase> <goals> <goal>single</goal> </goals> <configuration> <descriptors> <descriptor>src/main/assembly/repository.xml</descriptor> </descriptors> </configuration> </execution> </executions> </plugin>
repository.xml配置
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
<id>project</id>
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>false
</includeBaseDirectory> <!-- disable the creation of root's distribution dir in the archive -->
<fileSets>
<!-- config files -->
<fileSet>
<directory>${basedir}/src/main/resources</directory>
<excludes></excludes>
<includes>
<include>*.properties</include>
<include>*.docx</include>
<include>*.xml</include>
</includes>
<fileMode>0644</fileMode>
<outputDirectory>config</outputDirectory>
</fileSet>
<fileSet>
<directory>${basedir}/src/main/resources/doc</directory>
<excludes></excludes>
<includes>
<include>*.docx</include>
</includes>
<fileMode>0644</fileMode>
<outputDirectory>config/doc</outputDirectory>
</fileSet>
<!-- scripts -->
<fileSet>
<directory>bin</directory>
<includes>
<include>*.sh</include>
</includes>
<fileMode>0755</fileMode>
<outputDirectory>/bin</outputDirectory>
</fileSet>
<!-- executable jar -->
<fileSet>
<directory>target</directory>
<outputDirectory>lib</outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
</fileSets>
</assembly>start.sh
#!/bin/sh
#功能简介:启动上层目录下的jar文件
#参数简介:
# $1:jar文件名(包含后缀名)
# 注意:jar文件必须位于startup.sh目录的上一层目录。
#启动参数
#JAVA_OPTS="-server -Xms400m -Xmx400m -Xmn300m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xverify:none -XX:+DisableExplicitGC -Djava.awt.headless=true"
#JAR_NAME=`ls -lt ${parent_dir}/lib | head -2 | tail -1 | awk '{print $NF}'`
this_dir="$( cd "$( dirname "$0" )" && pwd )"
parent_dir=`dirname "${this_dir}"`
JAR_NAME=`ls -lt ${parent_dir}/lib | head -2 | tail -1 | awk '{print $NF}'`
log_dir="${parent_dir}/logs"
log_file="${log_dir}/catalina.out"
jar_file="${parent_dir}/lib/${JAR_NAME}"
echo -e "${jar_file}"
#参数个数<1或者参数空值时,中断执行
#if [ $# -lt 1 ] || [ -z $1 ]; then
# echo -e "\033[31m请输入要部署的jar包名称!\033[0m"
# exit 1
#fi
#日志文件夹不存在,则创建
if [ ! -d "${log_dir}" ]; then
mkdir "${log_dir}"
fi
#父目录下jar文件存在
if [ -f "${jar_file}" ]; then
#启动jar包;重定向标准错误输出到文件,丢掉标准输出
#java $JAVA_OPTS -jar ${jar_file} 1>/dev/null 2>"${log_file}" &
java -jar ${jar_file} --spring.config.location=${parent_dir}/config/application.properties 1>/dev/null 2>"${log_file}" &
exit 0
else
echo -e "\033[31m${jar_file}文件不存在!\033[0m"
exit 1
fispringboot assembly打包及windows执行脚本
在使用assembly来打包springboot项目前,说一说springboot项目传统方式打包部署时的几个痛点:
- 1.springboot的jar包中不包含项目依赖的jar包,无法直接java运行,需要把依赖的jar包同时拷贝过去,并且在java中的-classpath参数中指定这些jar包;
- 2.配置文件application.yml也打包到jar包中了,修改参数时很麻烦,先解压出来,修改,然后再放回jar包,部署一般都得改参数,很繁琐;
本文提供的打包方式,使得springboot项目的部署、执行更加方便、简单。
本文采用assembly打包方式,生成zip包,部署时直接解压zip包,执行bin目录的start文件就可以运行。
1、pom.xml文件添加plugin
先修改pom文件的plugins,如下
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>xxx.xxx.xxx</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-lib</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
<includeScope>compile</includeScope>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<descriptors>
<descriptor>src/main/resources/assembly.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>2、创建assembly.xml文件
在resource目录下创建assembly.xml文件,配置文件放到/config目录,执行批处理文件放到/bin目录,依赖jar包放到/lib目录,执行的jar包放到zip根目录
内容如下:
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
<id>package</id>
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>true</includeBaseDirectory>
<fileSets>
<fileSet>
<directory>${basedir}/src/main/resources</directory>
<includes>
<include>*.yml</include>
</includes>
<filtered>true</filtered>
<outputDirectory>${file.separator}config</outputDirectory>
</fileSet>
<fileSet>
<directory>src/main/resources/runScript</directory>
<outputDirectory>${file.separator}bin</outputDirectory>
</fileSet>
<fileSet>
<directory>${project.build.directory}/lib</directory>
<outputDirectory>${file.separator}lib</outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
<fileSet>
<directory>${project.build.directory}</directory>
<outputDirectory>${file.separator}</outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
</fileSets>
</assembly>3、编写执行的批处理文件(或shell脚本)
在resource下建立runScript目录,在runScript目录建立Start.bat文件,脚本如下:
@echo on set LIB_JARS="" cd …\lib for %%i in (*) do ( set LIB_JARS=!LIB_JARS!;…\lib%%i ) echo !LIB_JARS! cd … set START_JARS="" for %%i in (*.jar) do ( set START_JARS=%%i ) echo !START_JARS! java -Xms64m -Xmx1024m -XX:MaxPermSize=64M -classpath …\config;%LIB_JARS% -jar %START_JARS% pause
到这步打包的zip包就可以直接解压执行了,不过springboot的jar还不干净,配置文件、assembly.xml、resource下的runScript目录都打包到jar包里了,这些文件都需要排除,需要配置pom.xml的resources
4、springboot打包的jar包中排除不必要的文件及目录
配置pom.xml的resources,如下:
<resources> <resource> <directory>src/main/resources</directory> <excludes> <exclude>**/application.yml</exclude> <exclude>**/assembly.xml</exclude> <exclude>runScript/**</exclude> </excludes> </resource> </resources>
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
