众所周知,Maven是一个约定优于配置的java构建工具,通常我们只需要定义非常少的内容,就可以根据package标签属性来构建生成的jar, war包的相关内容。

如果想要对maven中依赖的内容一起打包,就需要使用maven-assembly-plugin来实现,对于该插件,其基本的配置如下:

<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>com.xxx.Main</mainClass>
</manifest>
</archive> </configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>

这样就会在执行clean package之后,构建出一个比较完整的jar包,jar包以jar-with-dependencies为后缀,带有其依赖的所有.class文件。

但是,如果我们想要在Maven中进行比较复杂的构建,就肯定不够用了,需要根据实际情况进行不同的配置了。

链接中对maven-assembly-plugin插件中的所有可选配置进行了详细说明,这里根据项目需要,我们做的一些简单配置。

我们需要指定configuration下的具体package配置文件:

<descriptors>
<descriptor>src/main/assemble/package.xml</descriptor>
</descriptors>

关于配置文件中具体元素的说明,可以参考下面的链接:

http://maven.apache.org/plugins/maven-assembly-plugin/assembly.html#class_binaries

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
<id>package</id>
<formats>
<format>jar</format>
</formats>

在package.xml中,我们首先指定其id和format,id可以在pom.xml文件中指定对应的configuration下的appendAssemblyId标签,将id附加到生成的jar包作为后缀。

<appendAssemblyId>true</appendAssemblyId>

项目中依赖比较多,而很多都是在执行时存在的,并不需要真正打包到实际环境中(比如依赖的hadoop包)。我们将整个项目用maven进行分模块构造后,依赖的模块内jar包需要打包到一起,以避免重新设置HADOOP_CLASSPATH。

这就需要使用dependencySets标签,添加includes,将具体的依赖jar包打包到具体的生成jar包中。

<dependencySets>
<dependencySet>
<unpack>true</unpack>
<scope>runtime</scope>
<includes>
<include>${groupId}:${artifactId}:${打包类型}:${version}</include>
<!--例如:-->
<include>com.sun.mail:javax.mail:jar:1.5.2</include>
</includes>
</dependencySet>
</dependencySets>

unpack属性控制依赖的jar包是否进行解压操作,还是直接放在根目录下。如果设置了outputDirectory,将这些文件都放在该目录下。例如设置outputDirectory为lib,则所有的依赖文件都放在该目录下。

如果解压后的文件放在特定的目录下,那么该jar包可能不能真正使用,需要在具体的MANIFEST.MF文件中并没有指定特定的CLASSPATH,否则就会包找不到具体的class。比如具体的格式如下:

Manifest-Version: 1.0
Main-Class: windows.VideoWindow
Class-Path: lib\org.eclipse.swt_3.3.0.v3346.jar lib\org.eclipse.swt.win32.win32.x86_3.3.0.v3346.jar

Class-Path: 后面的写法,空格分开,绝对不能有分号,且最后必须有换行。这个文件有着奇怪的分行和空格要求,在编写的时候需要注意。

如何将自定义的MANIFEST.MF文件附加到打包的jar包中,这就需要使用configuration中的archieve标签。

<archive>
<manifestFile>src/main/assemble/MANIFEST.MF</manifestFile>
</archive>

至此,项目中使用的jar包就可以正常地构建了。在jar包构造过程中,jar的两个命令非常有用:

jar –tf target/**.jar

该命令能够列出jar包内的所有文件。

jar –xf target/**.jar (指定文件)

该命令能够将jar包中所有/指定文件解压到当前文件夹中。

Maven assembly插件进行自定义构建的更多相关文章

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

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

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

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

  3. Maven Assembly插件介绍

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

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

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

  5. Maven assembly插件输出文件乱码问题

    使用Maven的<artifactId>maven-assembly-plugin</artifactId>插件导致输出的XML配置文件源文件的中文注释变成乱码,排查了多个地方 ...

  6. java server wrapper 和 maven assembly 插件

    Java Service Wrapper工具YAJSW 简介信息 YAJSW是一个开源的Java服务包装(Java Service Wrapper)工具.YAJSW允许您把任何应用程序安装为windo ...

  7. maven assembly 配置详解

    Maven Assembly插件介绍 博客分类: 项目构建   你是否想要创建一个包含脚本.配置文件以及所有运行时所依赖的元素(jar)Assembly插件能帮你构建一个完整的发布包. Assembl ...

  8. maven assembly plugin使用

    使用场景 在使用maven来管理项目时,项目除了web项目,还有可能为控制台程序,一般用于开发一些后台服务的程序.最近在工作中也遇到了这种场景,使用quartz开发一个任务调度程序.程序中依赖很多ja ...

  9. maven学习(五)插件和自定义插件

    插件是可以配置在settings.xml和pom.xml中的 插件目标: 在了解插件和生命周期的绑定关系之前,先来说一下插件目标.在实际项目构建的过程中,需要经历编译.打包等等许许多多的操作,为每个操 ...

随机推荐

  1. APUE学习笔记——3.10文件共享

    基本概念 内核使用3个数据结构描述一个打开的文件:进程表.文件表.V节点表 首先了解3种数据结构的概念     1 进程表         每一个进程有一个进程表.进程表里是一组打开的文件描述符,如标 ...

  2. Linux:finger命令详解

    finger 用于查找并显示用户信息 包括本地与远端主机的用户皆可,帐号名称没有大小写的差别. 单独执行finger指令,它会显示本地主机现在所有的用户的登陆信息,包括帐号名称,真实姓名,登入终端机, ...

  3. 制作smarty模版缓存文件

    <?php$p = 1;if(!empty($_GET["page"])){ $p = $_GET["page"];} $filename = " ...

  4. pip安装tensorflow出错怎么办

    随着人工智能的开发越来越多人参与,现在下载tensorflow 1.2版本也经常出错了,如下: 这时怎么办呢? 其实比较简单,可以通过pypi的网站来下载: https://pypi.python.o ...

  5. json XML 比较

    JSON: 这个为什么会变成“cc”而不是d.substring(dot+1);的值?    解决: var jsonsub = {}; jsonsub[cc] = e; arrnew.push(js ...

  6. Linux shell multifile content replace with sed

    #!/bin/bash # Linux shell multifile content replace with sed # 声明: # 本源代码主要是利用两份(中.英文)具有相同键值对的json数据 ...

  7. 【剑指offer】数字在排序数组中出现的次数,C++实现

    原创博文,转载请注明出处! # 题目 # 思路 利用二分查找法,查找元素k在排序数组中第一次出现的位置m及最后一次出现的位置n,m-n+1即为元素k再排序数组中出现的次数.       二分查找法在数 ...

  8. JS监听键盘事件(回车键)

    JS监听某个输入框 //回车事件绑定 $('#search_input').bind('keyup', function(event) { if (event.keyCode == "13& ...

  9. 每天一个linux命令:【转载】head命令

    head 与 tail 就像它的名字一样的浅显易懂,它是用来显示开头或结尾某个数量的文字区块,head 用来显示档案的开头至标准输出中,而 tail 想当然尔就是看档案的结尾. 1.命令格式: hea ...

  10. BZOJ4236 JOIOJI 【map】

    BZOJ4236 JOIOJI Description JOIOJI桑是JOI君的叔叔.“JOIOJI”这个名字是由“J.O.I”三个字母各两个构成的. 最近,JOIOJI桑有了一个孩子.JOIOJI ...