众所周知,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包中所有/指定文件解压到当前文件夹中。

最新文章

  1. SQL优化技术分析-4:其他
  2. SVM(支持向量机)的一点理解
  3. 基于OpenCV 的iOS开发
  4. java-android推送
  5. Pathoto项目:AWS+golang+beego搭建
  6. [Android Pro] root用户删除文件提示:Operation not permitted
  7. 反射中使用 BindingFlags.IgnoreCase
  8. sql 主外键
  9. Asp.Net MVC 路由 - Asp.Net 编程 - 张子阳
  10. PHP imdb类多个跨站脚本漏洞
  11. css属性pointer-events
  12. Qt mac QMYSQL(动态加载插件QPluginLoader的用法)
  13. Android_多媒体_SoundPool声音池使用
  14. 基于 WebRTC 技术的实时通信服务开发实践
  15. 为Android添加JNI支持
  16. Ambari REST API 使用介绍 - How To: Use Swagger with Ambari (Explore Ambari REST)
  17. python json.dumps(output) ^ SyntaxError: invalid syntax
  18. Android自定义组件——四个方向滑动的菜单实现
  19. hbuilder在android手机里用chrome调试,只显示了设备名称,却没有inspect按钮
  20. 08: Django使用haystack借助Whoosh实现全文搜索功能

热门文章

  1. Python中的数据结构 --- 集合(set)
  2. TotoiseSVN的使用方法
  3. I2S音频总线学习(二)I2S总线协议
  4. Java API访问ZK的权限控制
  5. [置顶] 完美解决Android Studio 运行时出现的警告信息?
  6. js检测三角形是否包含一个点
  7. MySQL 5.6.30 升级到5.7.10
  8. 21天学通C++_Day5
  9. Mysql 分组查询最高分
  10. HDU - 1142:A Walk Through the Forest (拓扑排序)