一、需求

  打一个zip包,包含如下:

  

  bin为程序脚本,启动和停止

  lib为依赖包

  根目录下为配置文件和项目jar包

二、知识储备

2.1、插件了解

plugin function
maven-jar-plugin

maven 默认打包插件,用来创建 project jar,负责将应用程序打包成可执行的jar文件

可在此处设置主类,manifest,排除对应的配置文件等

maven-shade-plugin 用来打可执行包,executable(fat) jar
maven-assembly-plugin

支持定制化打包方式,负责将整个项目按照自定义的目录结构打成最终的压缩包,方便实际部署

可在此处设置打包拷贝路径,配置,以及打包好的jar文件等

三、配置

1、pom配置:

          <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>2.6</version><configuration><archive><manifest><mainClass>com.jd.bt.ZuulApplication</mainClass><!-- to create a class path to your dependecies you have to fill true in this field --><addClasspath>true</addClasspath><classpathPrefix>lib/</classpathPrefix></manifest><manifestEntries><Class-Path>./</Class-Path></manifestEntries></archive><excludes><!--注意从编译结果目录开始算目录结构--><exclude>/*.yml</exclude><exclude>/*.properties</exclude><exclude>/*.xml</exclude></excludes></configuration></plugin><plugin><artifactId>maven-assembly-plugin</artifactId><configuration><!-- not append assembly id in release file name --><appendAssemblyId>false</appendAssemblyId><descriptors><descriptor>src/main/assembly/depolyment.xml</descriptor></descriptors></configuration><executions><execution><id>dist</id><phase>package</phase><goals><goal>single</goal></goals></execution></executions></plugin>

对于maven-jar-plugin配置

  其中manifest的部分是核心,在可执行的jar文件中,打包后会在jar文件内的META-INF文件夹下,生成一个MANIFEST.MF文件,里面记录了可执行文件的一些相关配置,比如像上面一段代码中所配置的内容,这里面就配置了可执行jar文件未来读取classpath的相对目录位置在什么地方,以及引入的jar文件都有哪些,上面的配置就是classpath目录是./ 
  mainClass配置表示,哪个class作为程序的入口来执行 
  addClasspath配置表示,是否将依赖的classpath一起打包 
  classpathPrefix配置表示,依赖的classpath的前缀,也就是打包后生成的MANIFEST.MF文件里,引入的jar文件都会加上前缀,lib/,比如fastjson-1.2.7.jar,在mainfest文件里就会是lib/fastjson-1.2.7.jar 
  excludes配置表示,排除哪些文件夹不被打包进去

  注意:其实maven-jar-plugin主要就是配置了MANIFEST.MF这个文件而已,就是让可执行文件知道自己怎么执行,加载哪些文件执行的描述,剩下的工作交由maven-assembly-plugin来处理

对于maven-assembly-plugin配置

  地址:http://maven.apache.org/plugins/maven-assembly-plugin/assembly.html#class_unpackOptions

    http://liugang594.iteye.com/blog/2093607  

    https://blog.csdn.net/u011955252/article/details/78927175

  最终压缩的文件格式,为zip,fileSets中配置了需要将那些文件打包到最终压缩包中, 
    如配置文件包括了启动脚本bin文件夹,里面放着shell的启动脚本,相关的配置文件src/main/resources,里面放着整个程序提取的properties等相关的配置文件 
     最终可运行的jar文件,使用了${project.build.directory}变量,也就是通过maven-jar-plugin生成的那个jar文件 
  dependencySets里面配置了依赖库最终输出到lib文件夹下,与上面的maven-jar-plugin配置生成的manifest文件路径相对应,这样可运行jar就会按照manifest的路径来找相应的文件进行加载

  参看地址:https://blog.csdn.net/senpogml/article/details/52366518?locationNum=12

2、src/main/assembly/depolyment.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<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>dist</id><formats><format>zip</format></formats><includeBaseDirectory>true</includeBaseDirectory><fileSets><fileSet><directory>src/main/bin</directory><outputDirectory>bin/</outputDirectory></fileSet><fileSet><directory>src/main/resources</directory><outputDirectory>/</outputDirectory></fileSet><fileSet><directory>${project.build.directory}</directory><outputDirectory>/</outputDirectory><includes><include>*.jar</include></includes></fileSet></fileSets><dependencySets><dependencySet><outputDirectory>lib</outputDirectory><scope>runtime</scope><excludes><exclude>${groupId}:${artifactId}</exclude></excludes></dependencySet></dependencySets>
</assembly>

3、start.sh和stop.sh

start.sh

#!/bin/bashARTIFACT_ID=jd-bt-microservice-gateway-zuul
VERSION=0.0.1-SNAPSHOT
main_jar=${ARTIFACT_ID}-${VERSION}.jarPIDS=`ps aux|grep ${main_jar} |grep -v "grep" |awk '{print $2}'`
if [ ! -z "$PIDS" ]; thenecho "${ARTIFACT_ID} already started!"echo "PID: $PIDS"exit 0;
fiBIN_PATH="${JAVA_HOME}/bin"
LOG_PATH="/Users/lihongxu/log/${ARTIFACT_ID}/"mkdir -p $LOG_PATHecho "ready start ${main_jar}";
nohup $BIN_PATH/java -server -Xms4096m -Xmx4096m -jar ../${main_jar} >$LOG_PATH/nohup.log 2>&1 &sleep 5PIDS=`ps aux|grep ${main_jar} |grep -v "grep" |awk '{print $2}'`if [ ! -z "$PIDS" ]; thenecho " ${ARTIFACT_ID} Started Successed,pid:${PIDS}"exit 0;
elseecho " ${ARTIFACT_ID} Started Failed"exit 1;
fi

stop.sh

#!/bin/bash
ARTIFACT_ID=jd-bt-microservice-gateway-zuul
VERSION=0.0.1-SNAPSHOT
main_jar=${ARTIFACT_ID}-${VERSION}.jarPIDS=`ps aux|grep ${main_jar} |grep -v "grep" |awk '{print $2}'`if [ ! -z "$PIDS" ]; thenkill -9 "$PIDS"echo " ${ARTIFACT_ID} is stop !"echo " PID: $PIDS"exit 0;
fi

四、java启动

java -cp 和 -classpath 一样,是指定类运行所依赖其他类的路径,通常是类库,jar包之类,需要全路径到jar包,window上分号“;”,linux使用“:”
4.1、格式:
  java -cp .;myClass.jar packname.mainclassname    
  表达式支持通配符,例如:
  java -cp .;c:\classes01\myClass.jar;c:\classes02\*.jar  packname.mainclassname 
4.2、运行jar
  java -jar myClass.jar
  执行该命令时,会用到目录META-INF\MANIFEST.MF文件,在该文件中,有一个叫Main-Class的参数,它说明了java -jar命令执行的类。
4.3、运行jar和cp
  用maven导出的包中,如果没有在pom文件中将依赖包打进去,是没有依赖包。
    1.打包时指定了主类,可以直接用java -jar xxx.jar。
    2.打包是没有指定主类,可以用java -cp xxx.jar 主类名称(绝对路径)。
    3.要引用其他的jar包,可以用java -classpath $CLASSPATH:xxxx.jar 主类名称(绝对路径)。其中 -classpath 指定需要引入的类。
4.4、实例
  下面基于pom和META-INF\MANIFEST.MF两个文件的配置,进行了三种情况的测试:

  pom.xml的build配置: 

<build><!--<finalName>test-1.0-SNAPSHOT</finalName>--><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin><plugin><artifactId>maven-assembly-plugin</artifactId><configuration><archive><manifest><mainClass>test.core.Core</mainClass></manifest></archive><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs></configuration><!--下面是为了使用 mvn package命令,如果不加则使用mvn assembly--><executions><execution><id>make-assemble</id><phase>package</phase><goals><goal>single</goal></goals></execution></executions></plugin></plugins></build>

View Code

META-INF\MANIFEST.MF的内容:
Manifest-Version: 1.0
Main-Class: test.core.Core

1.pom中build指定mainClass 但是 META-INF\MANIFEST.MF文件中没有指定Main-Class: test.core.Core
java -jar test-jar-with-dependencies.jar //执行成功
java -cp test-jar-with-dependencies.jar  test.core.Core  //执行失败,提示jar中没有主清单属性

2.pom中build没有指定mainClass 但是 META-INF\MANIFEST.MF文件中指定了Main-Class: test.core.Core
java -jar test-jar-with-dependencies.jar //执行失败,提示jar中没有主清单属性
java -cp test-jar-with-dependencies.jar  test.core.Core  //执行成功

3.pom中build指定mainClass && META-INF\MANIFEST.MF文件中增加了Main-Class: test.core.Core
java -cp test-jar-with-dependencies.jar  test.core.Core  //执行成功
java -jar test-jar-with-dependencies.jar  //执行成功

 

转载于:https://www.cnblogs.com/bjlhx/p/9037541.html

007-aven-assembly-plugin和maven-jar-plugin打包,java启动命令相关推荐

  1. maven环境下使用java、scala混合开发spark应用

    熟悉java的开发者在开发spark应用时,常常会遇到spark对java的接口文档不完善或者不提供对应的java接口的问题.这个时候,如果在java项目中能直接使用scala来开发spark应用,同 ...

  2. no main manifest attribute maven package 运行打包后的jar包报错:xxx.jar中没有主清单属性 通过配置 maven plugin 解决

    文章目录 命令行运行生成的jar包,报错 解决 手动修复 修改打包规则 一劳永逸 MANIFEST.MF demo Others IDEA 中关于 main class 的配置 命令行运行生成的jar ...

  3. [Apache Maven Shade Plugin] [example] [001] 官方例子:includes-excludes

    链接地址:[Selecting Contents for Uber JAR](http://maven.apache.org/plugins/maven-shade-plugin/examples/i ...

  4. 用Maven Archetype Plugin快速创建项目

    还在用mvn archetype:create -DarchetypeArtifactId=maven-archetype-quickstart -DgroupId=com.ryanote -Dart ...

  5. 学习Maven之Maven Enforcer Plugin

    1.Maven Enforcer plugin是什么鬼? 在说这个插件是什么前我们先思考这么一个问题:当我们开发人员进入项目组进行开发前,要准备开发环境,而领导总是会强调工具的统一,编译环境的统一.比 ...

  6. Jenkins安装maven integration plugin失败解决方法

    Jenkins安装maven integration plugin失败解决方法 参考文章: (1)Jenkins安装maven integration plugin失败解决方法 (2)https:// ...

  7. 天生一对Maven2+Jetty -- Maven2创建并管理WebApp,并使用Maven Jetty Plugin在Eclipse中调试...

    天生一对"Maven2+Jetty" -- Maven2创建并管理WebApp,并使用Maven Jetty Plugin在Eclipse中调试 Maven2代比1代改进很多,其中 ...

  8. 解决Maven报Plugin execution not covered by lifecycle configuration

    解决Maven报Plugin execution not covered by lifecycle configuration http://blog.csdn.net/xxd851116/artic ...

  9. 将一个普通 JAR 文件打包为 plugin 的一个问题

    最近一直在使用 commons-httpclient-3.1.jar 模拟 HTTP client 端,但是该 jar 只是一个普通 jar 文件,不是一个 plugin, 而我们的需求是既要能在 E ...

  10. maven docker plugin 常见问题解决

    maven docker plugin 常见问题解决 参考文章: (1)maven docker plugin 常见问题解决 (2)https://www.cnblogs.com/rongfengli ...

最新文章

  1. 低功耗蓝牙系统结构流程图
  2. mysql网页后台_MySQL(PHP网站后台数据库)
  3. 乙肝疫苗该怎么打(转)
  4. 如何获取网站icon
  5. 解决IE6下,给图片加上line-height属性不起作用的方法
  6. 线性表:顺序栈算法实现
  7. 【报告分享】中美人工智能之比较分析报告.pdf(附下载链接)
  8. python excel转xml
  9. docker for windows pull镜像文件的安装位置改变方法
  10. 金融项目app业务及测试策略
  11. Java学习基础(三):Eclispe的简单安装及使用
  12. 分享400个微信小程序模板和小程序设计模板
  13. php用do while实现斐波那契数列,php实现斐波那契数列
  14. 【柒穆雨】平面设计好不好学?设计小白该如何学习平面设计
  15. 记录下微信小程使用websokce的Bug
  16. Linux驱动设计——硬件基础
  17. CASdatasets
  18. 反脆弱性对产业生态的启发
  19. 论文对图片与什么要求呢?
  20. appium python自动测试 百度网盘_S35 移动App Appium自动化测试教程Appium+Python 百度云...

热门文章

  1. YiGo学习(一)YiGo介绍
  2. Building IKEv1 and IKEv2 on CentOS 7
  3. Latex语法学习02:文本悬挂缩进
  4. 最小生成树(Minimum Spanning Tree)的原理及实现(Java)
  5. 离散数学实验二——逻辑联结词的运算
  6. 接近开关常开开关和常闭长闭的区别?
  7. android开发split的方法在String中的特殊使用
  8. CobaltStrike服务端自身隐匿技巧
  9. windows计算机锁屏的快捷键是什么,win7的锁屏快捷键是什么 win7锁屏快捷键介绍【图文】...
  10. 【Python全栈测试开发实战1】搭建测试开发环境