一、需求

  打一个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/bash

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

stop.sh

#!/bin/bash
ARTIFACT_ID=jd-bt-microservice-gateway-zuul
VERSION=0.0.-SNAPSHOT
main_jar=${ARTIFACT_ID}-${VERSION}.jar PIDS=`ps aux|grep ${main_jar} |grep -v "grep" |awk '{print $2}'` if [ ! -z "$PIDS" ]; then
kill - "$PIDS"
echo " ${ARTIFACT_ID} is stop !"
echo " PID: $PIDS"
exit ;
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>

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  //执行成功

 

007-aven-assembly-plugin和maven-jar-plugin打包,java启动命令的更多相关文章

  1. Java启动命令与Maven打包设置

    一.Java启动命令 java程序的启动方式有三种: 1.java -jar 生成的jar包中,manifest文件定义了Main Class,可使用该命令 java -jar test.jar 2. ...

  2. Ubuntu环境下使用Maven编译并打包Java项目

    一.安装Maven 打开终端输入以下指令: $ mvn -v Apache Maven Maven home: /usr/share/maven Java version: 1.8.0_181, ve ...

  3. 【Maven jar】打包单个或多个文件,有依赖jar包的将架包一起打包成一个jar包供别的项目引用

    之前有一片文章,是打包单个java文件的.这次想要将http://www.cnblogs.com/sxdcgaq8080/p/8398780.html  打包成jar包,发现这个java文件中引用了多 ...

  4. [Maven] - Eclipse "maven compiler plugin" 冲突解决

    刚安装最新的Maven 3.2.5,在eclipse中使用maven的Run As->Maven Install,总会提示: Failed to execute goal org.apache. ...

  5. 施用 maven shade plugin 解决 jar 或类的多版本冲突

    施用 maven shade plugin 解决 jar 或类的多版本冲突   使用 maven shade plugin 解决 jar 或类的多版本冲突java 应用经常会碰到的依赖的三方库出现版本 ...

  6. 使用assembly将maven项目pom.xml中的jar包打包

    参考官方网站:http://maven.apache.org/plugins/maven-assembly-plugin/usage.html 方法一:将pom.xml引入的jar包打到zip文件夹中 ...

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

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

  8. maven jetty plugin

    转载:http://blog.163.com/xueling1231989@126/blog/static/1026408072013101311395492/ 前言: 在 maven 下测试调试时, ...

  9. maven surefire plugin介绍

    示例 <!-- 测试运行器,生成测试报告 --> <plugin> <groupId>org.apache.maven.plugins</groupId> ...

  10. maven 的plugin 的使用

    mvn [plugin-name]:[goal-name] mvn compiler:compile 这里写的十分详细: https://www.tutorialspoint.com/maven/ma ...

随机推荐

  1. 【BZOJ】1634: [Usaco2007 Jan]Protecting the Flowers 护花(贪心)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1634 贪心.. 我们发现,两个相邻的牛(a和b)哪个先走对其它的牛无影响,但是可以通过 a的破坏花× ...

  2. 利用QtGraphicalEffects来使得自己的图像显示更加生动

    有兴趣的开发人员能够參阅连接http://doc.qt.io/qt-5/qtgraphicaleffects-qmlmodule.html来深度学习Qt对Graphics方面的处理. 在今天的这篇文章 ...

  3. Excel随机生成数据2

    200万耗时大约 10秒以内,输出结果到txt文件. Sub GetPassword() 'by kagawa Dim i&, j&, k&, l&, m&, ...

  4. MySQL [Err]1449 : The user specified as a definer ('root'@'%') does not exist

    权限问题:授权 给 root 所有sql 权限 mysql> grant all privileges on *.* to root@"%" identified by &q ...

  5. C语言条件运算符

    如果希望获得两个数中最大的一个,可以使用 if 语句,例如: if(a>b){ max = a; }else{ max = b; } 不过,C语言提供了一种更加简单的方法,叫做条件运算符,语法格 ...

  6. box-sizing在什么情况下会失效

    众所周知,box-sizing是将w3c盒模型与IE盒模型相互转换的利器,但是有时候也会失效,那么在什么情况下回失效呢,MD在没设置高度的时候回失效的透透的,所以一定记得需要转换的时候设置个高度!!!

  7. 在scrollview中双击定点放大的代码

    双击放大是 iPhone 的一个基本操作,第三方程序里引入这一功能的话,主要是在 scrollview 呈现一张图片或者 PDF 页面时,双击可以放大,主要代码如下 - (void)scrollVie ...

  8. 《C++ Primer Plus》第4章 学习笔记

    数组.结构和指针是C++的3中符合类型.数组可以在一个数据对象中存储多个同种类型的值.通过使用索引或下标,可以访问数组中各个元素.结构可以将多个不同类型的值存储在同一个数据对象中,可以使用成员关系运算 ...

  9. Servlet与JSP九大内置对象的对应关系

    JSP对象 Servlet中怎样获得 out resp.getWriter request service方法中的req参数 response service方法中的resp参数 session re ...

  10. centos中调整tmpfs分区的大小

    tmpfs是Linux/Unix系统上的一种基于内存的文件系统.tmpfs可以使用系统的内存或swap分区来存储文件.由此可见,tmpfs主要存储暂存的文件. tmpfs默认的大小是RM的一半,假如你 ...