疑问:Spring Boot已经有了 spring-boot-maven-plugin 的打包方式,为什么还要自己重新实现打包方式呢?

答:都各有优势吧,不过本文的方式更加强大。不过SpringBoot打包出来jar文件,没办法进行修改,如果遇到需要简单修改一些系统配置或参数时(一些非配置中心的参数,如日志配置文件中的某个系统参数等),那就必须要重新编译打包才能生效。同时,本文的方式会自动生成各种操作系统(MAC/AIX/Linux/Windows等)的脚本文件,以及一些相关的运维命令(console|start|stop|restart|status|dump),同时可以依赖版本检查、GIT历史记录、远程DEBUG、配置JVM参数、GC参数和JMX参数等。

1 背景

每个JAVA项目开发完成后都会考虑部署至各个环境(DEV、TEST、PRO等)中,选择一种好的打包方式,将会在使用中无形的减少不少工作量,同时也会带来很多方便之处。反之,没有选择好打包方式,则会带来诸多不变之处。 下面我将介绍几种JAVA工厂常见的打包方式,先上效果图:

整体目录结构和物料包

自动生成的脚本目录

自动拷贝的配置目录

2 spring-boot-maven-plugin

spring-boot-maven-plugin是Springboot提供的打包插件,直接在POM中添加一下Plugin即可:

org.springframework.boot

spring-boot-maven-plugin

cn.micro.demo.DemoApplication

3 自定义打包脚本

如果你的脚本编写能力很高,那完全可以考虑自己编写一套适合自己的打包脚本出来,不过因为难度和复杂度都较大所以不建议自己编写,等常用的方式解决不了你的需求时再考虑。

4 IDEA手动打包

常用的IDEA开发工具都是可以可视化界面打包部署包的,不过这种方式不利于CI/CD流程,所以也不推荐。

5 JSW+Assembly

JSW+Assembly是JAVA工程MAVEN通用打包方式。精简方式则直接使用:appassembler-maven-plugin和maven-assembly-plugin即可完成打包。但为了更好的效果,我将引入几个好用的插件来配合完成打包。

5.1 maven-compiler-plugin

maven-compiler-plugin插件主要用于指定编译时的JDK版本。

org.apache.maven.plugins

maven-compiler-plugin

3.7.0

1.8

1.8

5.2 maven-jar-plugin

maven-jar-plugin插件主要用于项目打包时,排除配置文件不打包进jar包中(如果配置打入了jar,则每次变更配置,都需要重新打包,很不方便)。

org.apache.maven.plugins

maven-jar-plugin

2.6

*.yml

*.xml

*.properties

static/**

*.conf

tools/**

package

jar

5.3 maven-enforcer-plugin

maven-enforcer-plugin插件主要用于打包时检测各种规范要求,如:检查JDK版本、MAVEN版本、不能依赖快照等功能。

org.apache.maven.plugins

maven-enforcer-plugin

3.0.0-M2

default-cli

enforce

validate

[3.3.3,)

[1.8.0,)

No Snapshots Allowed!

5.4 git-commit-id-plugin

git-commit-id-plugin用于将当前GIT项目的Commit日志记录打包成一个文件,便于查看当前物料包的历史GIT日志(如使用场景:线上跑的代码,想看看是否提交了某个BUG的修复记录)。

pl.project13.maven

git-commit-id-plugin

revision

true

yyyy-MM-dd'T'HH:mm:ssZ

true

${project.build.directory}/dist/jsw/app/conf/git.properties

5.5 appassembler-maven-plugin

appassembler-maven-plugin用于将当前项目打包成个性化的目录框架,并同时使用JSW(Java Service Wrapper)生成各种操作系统的运维脚本(启动、停止、查看状态、重启等等命令),并且赋予可执行的权限等操作。同时也可以指定JMX端口、远程DEBUG端口、GC配置、GC日志、JVM配置和内存溢出Dump等信息。

org.codehaus.mojo

appassembler-maven-plugin

2.0.0

UTF-8

bin

tmp

logs

lib

flat

${project.build.directory}/dist

conf

true

src/main/resources

app

cn.micro.demo.Main

jsw

jsw

aix-ppc-32

aix-ppc-64

linux-ppc-64

linux-x86-32

linux-x86-64

windows-x86-32

windows-x86-64

hpux-parisc-64

solaris-x86-32

solaris-sparc-32

solaris-sparc-64

macosx-ppc-32

macosx-universal-32

macosx-universal-64

configuration.directory.in.classpath.first

conf

wrapper.ping.timeout

120

set.default.REPO_DIR

lib

wrapper.logfile

logs/wrapper.log

java.security.policy=conf/policy.all

com.sun.management.jmxremote

com.sun.management.jmxremote.port=8777

com.sun.management.jmxremote.authenticate=false

com.sun.management.jmxremote.ssl=false

-server

-Xdebug

-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5010

-XX:+HeapDumpOnOutOfMemoryError

-XX:HeapDumpPath=logs/heap-dump.hprof

-XX:+UseG1GC

-XX:MaxGCPauseMillis=200

-XX:InitiatingHeapOccupancyPercent=45

-XX:G1ReservePercent=10

-XX:NewRatio=2

-XX:SurvivorRatio=8

-XX:MaxTenuringThreshold=15

-Xloggc:logs/gc.log

-XX:GCLogFileSize=10M

-XX:NumberOfGCLogFiles=10

-XX:+UseGCLogFileRotation

-XX:+PrintGCDateStamps

-XX:+PrintGCTimeStamps

-XX:+PrintGCDetails

-XX:+PrintHeapAtGC

-XX:+PrintGCApplicationStoppedTime

-XX:+DisableExplicitGC

-verbose:gc

generate-jsw-scripts

package

generate-daemons

5.6 maven-assembly-plugin

maven-assembly-plugin插件用于将上述appassembler-maven-plugin插件打包后的目录框架,再次打包为压缩包,便于在不同环境中进行拷贝操作。

org.apache.maven.plugins

maven-assembly-plugin

3.1.0

src/main/resources/tools/assembly.xml

make-assembly

package

single

完整Plugin如下:

src/main/resources

true

org.apache.maven.plugins

maven-compiler-plugin

3.7.0

${java.version}

${java.version}

org.apache.maven.plugins

maven-jar-plugin

2.6

*.yml

*.xml

*.properties

static/**

*.conf

tools/**

package

jar

org.apache.maven.plugins

maven-enforcer-plugin

3.0.0-M2

default-cli

enforce

validate

[${maven.version},)

[${java.version}.0,)

pl.project13.maven

git-commit-id-plugin

revision

true

yyyy-MM-dd'T'HH:mm:ssZ

true

${project.build.directory}/dist/jsw/app/conf/git.properties

org.codehaus.mojo

appassembler-maven-plugin

2.0.0

UTF-8

bin

tmp

logs

lib

flat

${project.build.directory}/dist

conf

true

src/main/resources

app

cn.micro.biz.Main

jsw

jsw

aix-ppc-32

aix-ppc-64

linux-ppc-64

linux-x86-32

linux-x86-64

windows-x86-32

windows-x86-64

hpux-parisc-64

solaris-x86-32

solaris-sparc-32

solaris-sparc-64

macosx-ppc-32

macosx-universal-32

macosx-universal-64

configuration.directory.in.classpath.first

conf

wrapper.ping.timeout

120

set.default.REPO_DIR

lib

wrapper.logfile

logs/wrapper.log

-server

-Xdebug

-XX:+HeapDumpOnOutOfMemoryError

-XX:HeapDumpPath=logs/heap-dump.hprof

-XX:+UseG1GC

-XX:MaxGCPauseMillis=200

-XX:InitiatingHeapOccupancyPercent=45

-XX:G1ReservePercent=10

-XX:NewRatio=2

-XX:SurvivorRatio=8

-XX:MaxTenuringThreshold=15

-Xloggc:logs/gc.log

-XX:GCLogFileSize=10M

-XX:NumberOfGCLogFiles=10

-XX:+UseGCLogFileRotation

-XX:+PrintGCDateStamps

-XX:+PrintGCTimeStamps

-XX:+PrintGCDetails

-XX:+PrintHeapAtGC

-XX:+PrintGCApplicationStoppedTime

-XX:+DisableExplicitGC

-verbose:gc

generate-jsw-scripts

package

generate-daemons

org.apache.maven.plugins

maven-assembly-plugin

3.1.0

src/main/resources/tools/assembly.xml

make-assembly

package

single

assembly.xml文件内容为:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0

http://maven.apache.org/xsd/assembly-2.0.0.xsd">

dist

tar.gz

true

target/dist/jsw/app/bin

bin

0755

0755

target/dist/jsw/app/conf/tools

bin

0755

0755

**.sh

**.bat

target/dist/jsw/app/conf

conf

*.yml

*.xml

*.properties

static/**

*.conf

tools/**

0644

0744

target/dist/jsw/app/lib

lib

0644

0744

target/dist/jsw/app/logs

logs

0644

0744

target/dist/jsw/app/tmp

tmp

0644

0744

5.7 打包命令

mvn clean package appassembler:generate-daemons -Dmaven.test.skip=true

打包之后的目录结构为:

整体目录结构和物料包

自动生成的脚本目录

自动拷贝的配置目录

JSW Java_微服务架构—JAVA打包黑科技相关推荐

  1. 视频教程-docker及微服务架构-Java

    docker及微服务架构 使用android语言开发过物联网项目进行灯具控制:使用前端语言开发页面及小程序:使用java语言开发过医院.房产.政务等业务系统 刘浪 ¥128.00 立即订阅 扫码下载「 ...

  2. 视频教程-Java微服务架构-Java

    Java微服务架构 十余年计算机技术领域从业经验,在中国电信.盛大游戏等多家五百强企业任职技术开发指导顾问,国内IT技术发展奠基人之一. 杨千锋 ¥208.00 立即订阅 扫码下载「CSDN程序员学院 ...

  3. 构建高性能微服务架构(网易)

    随着移动互联网时代的兴起,提供高性能.高可用性.高扩展性的服务已经不仅仅是大公司的专利,而逐渐成为所有互联网+公司的标配需求.本文介绍网易如何利用多年的互联网架构经验和网易蜂巢的平台,帮助客户进行架构 ...

  4. 构建高性能微服务架构 【摘自刘超】

    随着移动互联网时代的兴起,提供高性能.高可用性.高扩展性的服务已经不仅仅是大公司的专利,而逐渐成为所有互联网+公司的标配需求.本文介绍网易如何利用多年的互联网架构经验和网易蜂巢的平台,帮助客户进行架构 ...

  5. Java生鲜电商平台-微服务架构概述

    Java生鲜电商平台-微服务架构概述 单体架构存在的问题 在传统的软件技术架构系统中,基本上将业务功能集中在单一应用内,或者是单一进程中.尽管现代化的软件架构理论以及设计原则已推广多年,但实际技术衍化 ...

  6. java调用webservice_笃学私教:Java开发网站架构演变过程-从单体应用到微服务架构详解...

    原标题:笃学私教:Java开发网站架构演变过程-从单体应用到微服务架构详解 Java开发网站架构演变过程,到目前为止,大致分为5个阶段,分别为单体架构.集群架构.分布式架构.SOA架构和微服务架构.下 ...

  7. 广告系统设计 java_《基于SpringCloud微服务架构广告系统设计与实现》笔记

    1-1 课程导学 什么是广告系统? 2-1 广告系统概览 2-2 广告系统架构 2-3 准备工作与系统目录结构 2-3 准备工作与系统目录结构 第3章 广告系统骨架开发 3-1 Maven基础知识 3 ...

  8. 2022年我认为最好的JAVA微服务架构

    找了好多的资料和源码项目,经过我的筛选和确认,我今天整理了一份我认为目前是最好的可以满足我的学习体系和架构框架的一套微服务架构,起码在我的考虑范围,应该是这样的.不说废话直接上图 当然这个图是网上找的 ...

  9. Java微服务学习笔记(一):微服务架构的概念理解

    Java微服务学习笔记 Tips:入门学习时粗略整理,仅供参考 (一):架构的基础理解 文章目录 Java微服务学习笔记 前言 一.微服务是什么? 二.常用开源微服务框架演化 1. Dubbo 2. ...

最新文章

  1. C# Socket编程(5)使用TCP Socket
  2. Python使用matplotlib可视化散点图、可视化两个数值变量之间的关系(Scatter plot)
  3. 怎样才能让一段代码每隔一段时间执行一次?
  4. ubuntu下修改中文字体
  5. BitcoinCore JSONRPC Java使用,创建账号,获取余额,转账等等...
  6. C语言程序读写文件(文件内存一个十进制数,每读一次数值加一)
  7. iMac 是什么?苹果2021新款 iMac 购买建议
  8. 【致青春】致成长路上的那些琐事
  9. 聚能聊每周精选 第十一期
  10. VB小技巧:字符变量中双引号的输入
  11. 图像处理神经网络python_深度学习使用Python进行卷积神经网络的图像分类教程
  12. 深度学习多种模型评估指标介绍 - 附sklearn实现
  13. 《大数据技术原理与应用》(第三章 HDFS 课后答案)
  14. Chrome插件分享—不定期更新
  15. 中文版orgin图像数字化工具_Engauge Digitizer官方版-图形数字化处理软件下载 v10.8 官方版 - 安下载...
  16. ssh: connect to host github.com port 22: Connection refused
  17. 网络打印机 这台计算机上没有安装,Win7添加网络打印机时提示打印处理器不存在怎么办?...
  18. 【Lintcode】507. Wiggle Sort II
  19. 移动互联网时代的创业机会
  20. 模板编码方法(template method)

热门文章

  1. 盲盒商城APP有哪些,
  2. 1028万!重庆统计局招标大数据平台,开建统计数据中台
  3. 安装软件时,提示更新设备解决办法
  4. useHooks~小窍门
  5. 07-hooks基本使用-useState-useEffect-自定义hooks
  6. python寻找n以内的素数算法
  7. 海湾gst5000主机消防广播_海湾消防主机JB-QG-GST5000技术参数
  8. 第03课:观察者模式
  9. react-native 绝对定位元素设置zIndex层级无效 仍旧被遮盖 如何设置层级
  10. Cocos实战案例:高手解析《捕鱼达人3》怎样玩3D VR