springboot如何使用assembly打包项目和启动脚本

 更新时间:2023年06月20日 14:39:57   作者:向日葵的种籽  
这篇文章主要介绍了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
fi

springboot 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>

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。 

相关文章

  • SpringBoot中验证用户上传的图片资源的方法

    SpringBoot中验证用户上传的图片资源的方法

    这篇文章主要介绍了在SpringBoot中验证用户上传的图片资源,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • 解决FastJson中

    解决FastJson中"$ref重复引用"的问题方法

    这篇文章主要介绍了解决FastJson中"$ref重复引用"的问题方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • [Java]详解Socket和ServerSocket学习笔记

    [Java]详解Socket和ServerSocket学习笔记

    即时类应用或者即时类的游戏,HTTP协议很多时候无法满足于我们的需求,这会,Socket对于我们来说就非常实用了。本篇文章主要介绍了Socket和ServerSocket,有兴趣的可以了解一下。
    2016-12-12
  • java之static关键字用法实例解析

    java之static关键字用法实例解析

    这篇文章主要介绍了java之static关键字用法实例解析,包括了static关键字的原理讲解及用法分析,并附带了实例说明,需要的朋友可以参考下
    2014-09-09
  • Java中的Lambda表达式详解

    Java中的Lambda表达式详解

    这篇文章主要介绍了Java中的Lambda表达式详解,Lambda 表达式是 JDK8 的一个新特性,可以取代大部分的匿名内部类,写出更优雅的 Java 代码,尤其在集合的遍历和其他集合操作中,可以极大地优化代码结构,需要的朋友可以参考下
    2024-01-01
  • springboot整合freemarker代码自动生成器

    springboot整合freemarker代码自动生成器

    最近做了一个工具,可以实现代码自动生成,今天整理出来分享给大家,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • Java微信公众平台之群发接口(高级群发)

    Java微信公众平台之群发接口(高级群发)

    这篇文章主要为大家详细介绍了Java微信公众平台之群发接口,高级群发功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • @Value设置默认值后,获取不到配置值的原因分析

    @Value设置默认值后,获取不到配置值的原因分析

    这篇文章主要介绍了@Value设置默认值后,获取不到配置值的原因,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • java中的Arrays这个工具类你真的会用吗(一文秒懂)

    java中的Arrays这个工具类你真的会用吗(一文秒懂)

    这篇文章主要介绍了java中的Arrays这个工具类你真的会用吗,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • java冷知识:javac AbstractProcessor详解

    java冷知识:javac AbstractProcessor详解

    这篇文章主要介绍了java冷知识:javac AbstractProcessor详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11

最新评论