前言

  1. 本文主要记录在SpringBoot项目中使用Apache Maven Assembly插件进行打包的相关内容;
  2. 官网说明:https://maven.apache.org/plugins/maven-assembly-plugin/

概述

  • 是什么:Apache Maven Assembly是Maven的程序集插件使开发人员能够将项目输出合并到单个可分发的存档中,该存档还包含依赖项、模块、站点文档和其他文件。
  • 作用:可以实现自定义打包,从而实现打包项目可以外挂yml配置文件,提供shell运维脚本,大大降低运维成本,比较适用于小规模的SpringBoot项目(大规模的项目推荐docker容器部署)

配置说明

  1. 引入插件(pom文件中)

    <?xml version="1.0" encoding="UTF-8"?>
    <project>
    ...
    <build>
    <plugins>
    <!--springboot项目打包插件-->
    <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>2.3.7.RELEASE</version>
    <configuration>
    <mainClass>com.alan.SpringBootMain</mainClass>
    </configuration>
    <executions>
    <execution>
    <goals>
    <goal>repackage</goal>
    </goals>
    </execution>
    </executions>
    </plugin>
    <!--maven自定义打包插件-->
    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>3.5.0</version>
    <configuration>
    <descriptors>
    <!--具体的配置文件-->
    <descriptor>src/main/assembly/assembly.xml</descriptor>
    </descriptors>
    </configuration>
    <executions>
    <execution>
    <id>make-assembly</id>
    <!--绑定到maven操作类型上-->
    <phase>package</phase>
    <!--运行一次-->
    <goals>
    <goal>single</goal>
    </goals>
    </execution>
    </executions>
    </plugin>
    </plugins>
    </build>
    </project>
  2. 配置assembly文件(在pom中设定的位置下创建,我这里是src/main/assembly/assembly.xml)

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

    1. start.sh
      #!/bin/bash
      # 项目名称
      SERVER_NAME="${project.artifactId}" # jar名称
      JAR_NAME="${project.build.finalName}.jar" # 进入bin目录
      cd `dirname $0`
      # bin目录绝对路径
      BIN_DIR=`pwd`
      # 返回到上一级项目根目录路径
      cd ..
      # 打印项目根目录绝对路径
      # `pwd` 执行系统命令并获得结果
      DEPLOY_DIR=`pwd` # 外部配置文件绝对目录,如果是目录需要/结尾,也可以直接指定文件
      # 如果指定的是目录,spring则会读取目录中的所有配置文件
      CONF_DIR=$DEPLOY_DIR/config
      # SERVER_PORT=`sed '/server.port/!d;s/.*=//' config/application.properties | tr -d '\r'`
      # 获取应用的端口号
      SERVER_PORT=`sed -nr '/port: [0-9]+/ s/.*port: +([0-9]+).*/\1/p' config/application.yml` PIDS=`ps -f | grep java | grep "$CONF_DIR" |awk '{print $2}'`
      if [ "$1" = "status" ]; then
      if [ -n "$PIDS" ]; then
      echo "The $SERVER_NAME is running...!"
      echo "PID: $PIDS"
      exit 0
      else
      echo "The $SERVER_NAME is stopped"
      exit 0
      fi
      fi if [ -n "$PIDS" ]; then
      echo "ERROR: The $SERVER_NAME already started!"
      echo "PID: $PIDS"
      exit 1
      fi if [ -n "$SERVER_PORT" ]; then
      SERVER_PORT_COUNT=`netstat -tln | grep $SERVER_PORT | wc -l`
      if [ $SERVER_PORT_COUNT -gt 0 ]; then
      echo "ERROR: The $SERVER_NAME port $SERVER_PORT already used!"
      exit 1
      fi
      fi # 项目日志输出绝对路径
      LOGS_DIR=$DEPLOY_DIR/logs
      # 如果logs文件夹不存在,则创建文件夹
      if [ ! -d $LOGS_DIR ]; then
      mkdir $LOGS_DIR
      fi
      STDOUT_FILE=$LOGS_DIR/catalina.log # JVM Configuration
      JAVA_OPTS=" -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true "
      JAVA_DEBUG_OPTS=""
      if [ "$1" = "debug" ]; then
      JAVA_DEBUG_OPTS=" -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n "
      fi JAVA_JMX_OPTS=""
      if [ "$1" = "jmx" ]; then
      JAVA_JMX_OPTS=" -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false "
      fi JAVA_MEM_OPTS=""
      BITS=`java -version 2>&1 | grep -i 64-bit`
      if [ -n "$BITS" ]; then
      JAVA_MEM_OPTS=" -server -Xmx512m -Xms512m -XX:PermSize=128m -XX:+UseG1GC "
      else
      JAVA_MEM_OPTS=" -server -Xms512m -Xmx512m -XX:PermSize=128m -XX:+UseParallelGC "
      fi # 加载外部log4j2文件的配置
      LOG_IMPL_FILE=log4j2.xml
      LOGGING_CONFIG=""
      if [ -f "$CONF_DIR/$LOG_IMPL_FILE" ]
      then
      LOGGING_CONFIG="-Dlogging.config=$CONF_DIR/$LOG_IMPL_FILE"
      fi
      CONFIG_FILES=" -Dlogging.path=$LOGS_DIR $LOGGING_CONFIG -Dspring.config.location=$CONF_DIR/ "
      echo -e "Starting the $SERVER_NAME ..."
      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 & echo "OK!"
      PIDS=`ps -f | grep java | grep "$DEPLOY_DIR" | awk '{print $2}'`
      echo "PID: $PIDS"
      echo "STDOUT: $STDOUT_FILE"
    2. stop.sh
      #!/bin/bash
      # 项目名称
      APPLICATION="${project.artifactId}"
      # 项目启动jar包名称
      APPLICATION_JAR="${project.build.finalName}.jar"
      # 通过项目名称查找到PI,然后kill -9 pid
      PID=$(ps -ef | grep "${APPLICATION_JAR}" | grep -v grep | awk '{ print $2 }')
      if [[ -z "$PID" ]]
      then
      echo ${APPLICATION} is already stopped
      else
      echo kill ${PID}
      kill -9 ${PID}
      echo ${APPLICATION} stopped successfully
      fi
  4. 打包项目

    1. 项目下执行mvn clean package命令进行打包,打包后的压缩包路径/project_url/target/test01-1.0-SNAPSHOT-bin.tar.gz;
    2. 打包后的项目文件如下:

  5. 运行项目

    1. 解压文件:tar -zxvf /project_url/target/test01-1.0-SNAPSHOT-bin.tar.gz
    2. 进入bin目录下:cd /project_url/target/test01-1.0-SNAPSHOT/bin
    3. 运行项目:sh start.sh,运行日志在/project_url/target/test01-1.0-SNAPSHOT/logs路径下
    4. 关闭项目:sh stop.sh

Apache Maven Assembly自定义打包插件的使用的更多相关文章

  1. maven-使用assembly自定义打包

    用maven管理项目引用依赖很方便,但是打包的时候如果是web包还好,会直接把依赖的jar包打到lib目录中,如果是jar包的话,依赖默认是不打入进去的 这样如果运行环境中没有依赖的jar包,就麻烦了 ...

  2. Maven学习总结(27)——Maven自定义打包插件maven-assembly-plugin详解

    Assembly插件会生成 "assemblies", 此特性等同于的Maven 1 distribution plug-in..该插件不仅支持创建二进制归档文件,也支持创建源码归 ...

  3. 05 Maven 生命周期和插件

    Maven 生命周期和插件 除了坐标.依赖以及仓库之外, Maven 另外两个核心概念是生命周期和插件.在有关 Maven 的日常使用中,命令行的输入往往就对应了生命周期,如 mvn package ...

  4. 使用Maven的assembly插件实现自定义打包

    一.背景 最近我们项目越来越多了,然后我就在想如何才能把基础服务的打包方式统一起来,并且可以实现按照我们的要求来生成,通过研究,我们通过使用maven的assembly插件完美的实现了该需求,爽爆了有 ...

  5. Maven的assembly插件实现自定义打包部署(包含依赖jar包)

    微服务必备 优点: 1.可以直接导入依赖jar包 2.可以添加插件启动 .sh 文件 3.插件的配置以及微服务的统一打包方式 1.首先我们需要在pom.xml中配置maven的assembly插件 & ...

  6. 【Maven实战技巧】「插件使用专题」Maven-Assembly插件实现自定义打包

    前提概要 最近我们项目越来越多了,然后我就在想如何才能把基础服务的打包方式统一起来,并且可以实现按照我们的要求来生成,通过研究,我们通过使用maven的assembly插件完美的实现了该需求,爽爆了有 ...

  7. Maven打包插件Assembly(七)

    1. 在 dubbo 的 provider 项目(实现类项目dubbo-service-impl)中 pom.xml 配置 assembly插件信息 <!-- 指定项目的打包插件信息 --> ...

  8. java工程打成jar包 - 使用maven assembly插件打包及手动打包

    在java工程打包的过程中遇到过不少问题,现在总结一下.一种是典型的maven工程打包,依赖的jar包全都在pom.xml中指定,这种方式打包很方便:另一种是依赖了本机jar包(不能通过pom.xml ...

  9. assembly打包插件引发的自定义spring标签找不到声明的错误

    异常信息:通配符的匹配很全面, 但无法找到元素 的声明. 报的异常信息是关于我们使用的一个自定义的spring标签,这个异常通常的原因可能是读取不到自定义标签的映射. 到META-INF目录下找一下是 ...

  10. Maven Assembly插件介绍

    转自:http://blueram.iteye.com/blog/1684070 已经写得挺好的,就不用重写了. 你是否想要创建一个包含脚本.配置文件以及所有运行时所依赖的元素(jar)Assembl ...

随机推荐

  1. SAP程序发布流程

    更改程序名称 如果你想要更改程序名称的话,首先进入程序,关闭编辑,只显示代码 点击重命名就可以了 或者直接输入事务代码se38进入APAP编辑器,输入程序名称,重命名 为程序创建事务代码 事务代码为s ...

  2. 关于Mybatis-Plus中update()、updateById()方法的使用及null值的判断

    使用场景说明: 在 Mybatis-Plus 的使用过程中,经常会遇对数据库更新的情况 更新常用方法:update().updateById() 问题:经常会遇见对 null 值的处理,对传入的实体参 ...

  3. SpringBoot中搭配AOP实现自定义注解

    1 springBoot的依赖 确定项目中包含可以注解的依赖 <dependency> <groupId>org.springframework.boot</groupI ...

  4. [python] 基于wordcloud库绘制词云图

    词云Wordcloud是文本数据的一种可视化表示方式.它通过设置不同的字体大小或颜色来表现每个术语的重要性.词云在社交媒体中被广泛使用,因为它能够让读者快速感知最突出的术语.然而,词云的输出结果没有统 ...

  5. Python从0到1丨细说图像增强及运算

    摘要:本文主要讲解常见的图像锐化和边缘检测方法,即Roberts算子和Prewitt算子. 本文分享自华为云社区<[Python从零到壹] 五十七.图像增强及运算篇之图像锐化Roberts.Pr ...

  6. 1_使用swiper数组对象循环图片遇到的问题

    今天在练习微信小程序的swiper组件时,想用列表循环出图片,发现图片一直没出来,控制台也没有报错,后来仔细一看,原来是语法格式写错了. 以下是我列表循环踩过的坑: 一:微信小程序的列表循环和vue的 ...

  7. Raft一致性共识算法论文学习

    论文地址:https://pdos.csail.mit.edu/6.824/papers/raft-extended.pdf 看完raft共识算法,脑袋非常懵,所以写一篇学习笔记,记录一下. raft ...

  8. python之路42 JavaScript 基础语法

    JavaScript简介 1996年11月,JavaScript的创造者--Netscape公司,决定将JavaScript提交给国际标准化组织ECMA,希望这门语言能够成为国际标准.次年,ECMA发 ...

  9. [C++]模版特例化和模版偏特化

    函数模版特例化 例子: //第一个版本;可以比较任意两个类型 template<typename T> int compare(const &T,const T&); // ...

  10. [cocos2d-x]捕鱼达人炮台射击角度的旋转实现

    话不多说,先上图,下面是实现代码(在后面会具体讲解实现过程): //第一步:将炮台的坐标转换为世界坐标下的坐标点 CCPoint location = this->getParent()-> ...