前提概要

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

maven-assembly-plugin打包插件

配置步骤及其他事项

首先我们需要在pom.xml中配置maven的assembly插件

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<!-- 配置执行器 -->
<execution>
<id>make-assembly</id>
<!-- 绑定到package生命周期阶段上 -->
<phase>package</phase>
<goals>
<!-- 只运行一次 -->
<goal>single</goal>
</goals>
<configuration>
<!--生成包的末尾添加assembly id,一般关闭 -->
<appendAssemblyId>false</appendAssemblyId>
<finalName>${project.artifactId}-${project.version}</finalName>
<!--加载指定的配置文件-->
<descriptors>
<descriptor>src/main/assembly/assembly.xml</descriptor>
</descriptors>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>

配置参数介绍说明

  • execution:配置执行器

    • phase:绑定到package生命周期阶段上
    • goal:{single}:只运行一次
    • configuration->appendAssemblyId:生成包的末尾添加assembly id,一般关闭
    • descriptor:src/main/assembly/assembly.xml:后续会讲解,主要用于描述如何进行打包的规则。

自定义格式包assembly.xml

接着我们在src/main/assembly文件中配置assembly.xml文件

  <assembly>
<id>唯一编号</id>
<formats>
<!--打包的文件格式,也可以有:war zip-->
<format>tar.gz</format>
</formats>
<!--tar.gz压缩包下是否生成和项目名相同的根目录-->
<includeBaseDirectory>true</includeBaseDirectory>
<fileSets>
<fileSet>
<directory>src/main/bin</directory>
<outputDirectory>/</outputDirectory>
<!-- Linux权限 -->
<fileMode>0644</fileMode>
</fileSet>
<fileSet>
<directory>target/classes/META-INF/conf</directory>
<outputDirectory>conf/META-INF/conf</outputDirectory>
<!-- Linux权限 -->
<fileMode>0644</fileMode>
</fileSet>
<fileSet>
<directory>target/classes</directory>
<outputDirectory>conf</outputDirectory>
<fileMode>0644</fileMode>
<includes><!-- 只负责这些目标文件-->
<include>*.properties</include>
<include>*.xml</include>
</includes>
</fileSet>
</fileSets>
<!-- 输出到lib路径 -->
<dependencySets>
<dependencySet>
<!--是否在最外层套一个本项目的名称的文件目录-->
<useProjectArtifact>true</useProjectArtifact>
<!-- 输出到这个路径下 -->
<outputDirectory>lib</outputDirectory>
<!--将scope为runtime的依赖包打包-->
<scope>runtime</scope>
</dependencySet>
</dependencySets>
</assembly>
  • 生成的lib文件夹下放该项目的所有依赖以及该服务jar包,src/main/bin文件夹下我们一般放start.sh和stop.sh两个脚本文件用来开启和关闭该服务,打包后直接放到根目录下

  • 生成的tar.gz文件的名字为:[maven-assembly-plugin插件中配置的finalName]-[assembly.xml配置的id(若assembly中没有指定id,则只有前半部分)].

assembly的具体语法,请参见官网:

  • 所以:maven-compiler-plugin是用来将代码生成jar的工具,maven-assembly-plugin是用来生成指定格式的工具。

  • 配置完成后进入标签里指定的位置建xml文件,这里是src/assembly/assembly-descriptor.xml,内容如下:

<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>my-assembly</id>
<formats>
<!--打包生成后的格式 -->
<format>zip</format>
</formats>
<!-- -->
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<!--脚本所在的文件夹,以及打包后将脚本输出到哪个文件夹中 -->
<directory>src/scripts</directory>
<outputDirectory>alarm/bin</outputDirectory>
<!-- 哪些文件会被提取 -->
<includes>
<include>*.sh</include>
</includes>
<!-- 文件权限及编码 -->
<fileMode>0755</fileMode>
<lineEnding>unix</lineEnding>
</fileSet>
<fileSet>
<!--同上,这里配置的是配置文件所在的文件夹 -->
<directory>src/main/resources</directory>
<outputDirectory>alarm/conf</outputDirectory>
<includes>
<include>*.yml</include>
</includes>
<lineEnding>unix</lineEnding>
</fileSet>
<!--artifact -->
<fileSet>
<!--这里的target是maven-compiler-plugin生成该项目的jar包的位置 -->
<directory>target</directory>
<outputDirectory>alarm/lib</outputDirectory>
<includes>
<include>*.jar</include>
</includes>
<fileMode>0755</fileMode>
</fileSet>
</fileSets>
<dependencySets>
<dependencySet>
<!--这里是将该项目依赖的所有jar包存入lib文件夹中 -->
<outputDirectory>alarm/lib</outputDirectory>
<useProjectArtifact>false</useProjectArtifact>
<useProjectAttachments>true</useProjectAttachments>
<scope>runtime</scope>
</dependencySet>
</dependencySets>
</assembly>

启动脚本

在完成以上配置后,只需在指定的位置建立scripts/start.sh和stop.sh两个脚本即可完成。具体启动脚本如下:

start.sh启动文件脚本

#!/bin/sh
basepath=$(cd `dirname $0`;cd '../'; pwd)
echo "path:"$basepath
jarHome='/my.jar'
echo "Starting my service"
ls_date=`date +%Y%m%d`
if [ ! -d "${basepath}/log" ]; then
mkdir ${basepath}/log
fi
if [ ! -d "$basepath/log/${ls_date}" ]; then
mkdir $basepath/log/${ls_date}
fi
nohup java -jar $basepath$jarHome --spring.config.location=$basepath/conf/server-attach.yml,$basepath/conf/server-shared.yml> $basepath/log/${ls_date}/${ls_date}.log &
#####

主要命令是获取当天日期,然后在log文件夹下建立指定日期的文件夹,并将日志存放进去。其中–spring.config.location用于加载指定的配置文件,多个配置文件用逗号分割。

stop.sh停止文件脚本

停止脚本通过ps -ef获取进程id然后kill,如下:

#!/bin/sh
my=`ps -ef |grep my.jar | grep -v grep | awk '{print $2}'`
kill -9 $my

结语

以上配置完成后使用mvn package命令即可自动打成一个zip压缩包,包内包含bin、conf、lib文件夹,可用启动脚本一键启动。实际上这里能修改的地方还有很多,包括启动脚本也可以用其他方式如java -classpath方式启动等等,具体的可以根据自身需求进行相应修改。

【Maven实战技巧】「插件使用专题」Maven-Assembly插件实现自定义打包的更多相关文章

  1. PS抠发丝技巧 「选择并遮住…」

    PS抠发丝技巧 「选择并遮住…」 现在的海报设计,大多数都有模特MM,然而MM的头发实用太多了,有的还飘起来…… 对于设计师(特别是淘宝美工)没有一个强大.快速.实用的抠发丝技巧真的混不去哦.而PS ...

  2. 【Maven实战技巧】「插件使用专题」Maven-Archetype插件创建自定义maven项目骨架

    技术推荐 自定义Archetype Maven骨架/以当前项目为模板创建maven骨架,可以参考http://maven.apache.org/archetype/maven-archetype-pl ...

  3. Maven实战读书笔记(一):Maven概述

    1.1 Maven是什么,能做什么 Maven是一个跨平台的项目管理工具,主要服务于Java平台的项目构建.依赖管理和项目信息管理. Maven的用途之一是项目构建,能够自动化构建过程,从清理.编译. ...

  4. Maven实战读书笔记(二):Maven坐标与仓库

    2.1 Maven坐标 Maven坐标是Maven用来表示一个组件依赖的标示. Maven通过下面几个元素定义坐标:groupId.artifactId.version.packaging.class ...

  5. ☕【Java技术指南】「并发编程专题」针对于Guava RateLimiter限流器的入门到精通(含实战开发技巧)

    并发编程的三剑客 在开发高并发系统时有三剑客:缓存.降级和限流. 缓存 缓存的目的是提升系统访问速度和增大系统处理容量. 降级 降级是当服务出现问题或者影响到核心流程时,需要暂时屏蔽掉,待高峰或者问题 ...

  6. 🏆【Java技术专区】「探针Agent专题」Java Agent探针的技术介绍(1)

    前提概要 Java调式.热部署.JVM背后的支持者Java Agent: 各个 Java IDE 的调试功能,例如 eclipse.IntelliJ : 热部署功能,例如 JRebel.XRebel. ...

  7. 「mysql优化专题」90%程序员没听过的存储过程和存储函数教学(7)

    一.MYSQL储存过程简介(技术文): 储存过程是一个可编程的函数,它在数据库中创建并保存.它可以有SQL语句和一些特殊的控制结构组成.当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时 ...

  8. Maven实战读书笔记(四):Maven生命周期与插件

    Maven的生命周期是对所有构建过程的抽象和统一.包含了项目的清理.初始化.编译.测试.打包.集成测试.验证.部署和站点生成等几乎所有构建步骤. Maven的生命周期是抽象的,其实际行为是由插件来完成 ...

  9. 🏆【Alibaba工具型技术系列】「EasyExcel技术专题」摒除OOM!让你的Excel操作变得更加优雅和安全

    前提概要 针对于后端开发者而言的,作为报表的导入和导出是一个很基础且有很棘手的问题!之前常用的工具和方案大概有这么几种: JXL(Java Excel API 工具服务),此种只支持xls的文件格式, ...

随机推荐

  1. 合宙Luat直播间即将开启,你揭开行业奥秘,让你快人一步。

    嗨~刚陪你们过儿童节 和你们一起成长的合宙Luat 又有新计划 -- 合宙Luat官方直播即将开启 - 敬请关注 - - 官方直播什么内容 - 可能是合宙研发动态 可能是新品发布资讯 可能是行业大咖分 ...

  2. match、vlookup、hlookup函数(结合index运用可以实现自动化填充)

    1.match返回查找值位置: match(lookup_value, lookup_array, match_type) Match(目标值,查找区域,0/1/-1) 使用注意:返回值是基于选择区域 ...

  3. Win10 安装msi文件报错2503/2502解决方案

    我在网上查了很多资料,试了很多次都不行 唯独这种方式管用,请往下看 最后这一种方法我用了是有效的,在电脑左下角的"Win图标"上右击,选择"命令提示符(管理员)" ...

  4. Akamai CDN刷新(通过Akamai cli 自动刷新)

    1.刷新类型选择 根据官方介绍,可使用多种途径和方式来完成快速刷新 按照简便快捷高效的要求,暂时选择Akamai cli + url 来完成刷新. 2.二进制文件下载地址 文件下载地址:https:/ ...

  5. 『动善时』JMeter基础 — 52、使用JMeter测试Dubbo接口

    目录 1.Dubbo介绍 2.准备测试Dubbo接口的环境 3.Dubbo Sample界面详解 4.Dubbo Sample组件的使用 (1)测试计划内包含的元件 (2)使用zookeeper协议请 ...

  6. CRM的职能和主要构成模块探索

    CRM客户管理系统是随着互联网的快速发展和信息技术的进步而发展起来的,是企业管理客户关系.优化业务流程的首选.客户关系管理可以存储企业获得的客户信息,方便业务人员随时查看和了解客户需求:客户关系管理可 ...

  7. mongodb主从复制(读写分离)

    1.[启动主服务器]mongod --port 1111 --dbpath D:\Program Files\Mongodb\master --logpath D:\Program Files\Mon ...

  8. Linux安装telnet(转)

      一.安装telnet 1.检测telnet-server的rpm包是否安装 [root@localhost ~]# rpm -qa telnet-server 若无输入内容,则表示没有安装.出于安 ...

  9. Linux | Shell流程控制语句

    流程控制语句 简单的Shell 脚本还不能满足我们日常工作的需要要,因为他不能批量的帮我们完成工作,所以Shell引入了 if.for.while.case 4种流程控制语句来帮助我们完成工作. if ...

  10. 史上最全的Nginx配置文档

    Nginx是一个异步框架的Web服务器,也可以用作反向代理,负载平衡器 和 HTTP缓存.该软件由Igor Sysoev 创建,并于2004年首次公开发布.同名公司成立于2011年,以提供支持.Ngi ...