首先,简单介绍Maven。Maven是管理Java项目开发的工具,不是IDE,不是编译工具。它只是提供了一套规则和插件,说明如何对Java项目进行开发和管理。
它的规则通过POM文件说明。对于POM文件,这里不详细介绍,只做大致介绍。我认为,POM文件大致有两个作用,静态描述和动态描述。第一个作用,静态描述,即对POM文件所在的文件夹的(子)项目的介绍,比如该(子)项目的唯一标识(坐标),该子项目的依赖,该子项目的打包方式等;第二个作用,动态描述,即如何对该(子)项目进行编译、测试、打包等,用生命周期表示。Maven提供三个生命周期以及各个生命周期阶段所需的插件,可以不改直接用,也可以根据自己的需要修改。编译、测试、打包等不是Maven实现,而是它的仓库中提供的插件。仓库是用来存放插件和依赖的地方。仓库有本地、远程仓库。远程仓库又分为:2中央仓库、 私服 和其它公共库。这里不做详细介绍。
这里的任务是如何将第三包依赖包加入到最终的jar可执行文件中。
对于第三方依赖(external dependency) ,有四种方式可以使用。第一种方式,在本地仓库中添加该依赖;第二种方式:将该仓库deploy,放在远程仓库,最好大家都能访问;第三种方式:将该依赖的scope描述为system并说明绝对路径;第四种方式:将该依赖放在程序的自建仓库(static project repository),并在打包的时候将其将入到最终的jar。
本文主要是说明第四种方法,也比较推荐第四种方法。因为前三种方法,要么不利于最终jar文件的分发,要么比较麻烦。第四种方法,在运行的时候不需要修改或者添加java lib path。
很多时候,当某个项目需要的依赖是第三方提供的,我这类遇到的是Jcuda。由于当时在远程仓库还没有Jcuda 7.5 的依赖,就需要将其作为第三方依赖来处理。在编译的时候使用的是第三种方法,但是因为需要再另一台机器上运行,就出现问题了。网上找了很久,有两个说的很好。
http://blog.dub.podval.org/2010/01/maven-in-project-repository.html
http://stackoverflow.com/questions/364114/can-i-add-jars-to-maven-2-build-classpath-without-installing-them
这两个链接说明了,如何将该依赖包放在程序的lib中,该文件夹如何组织才不会出错,路径如何。
至于如何将该依赖的jar文件打包到最终的文件中。
第一步: 将依赖文件放到程序的repository中;
第二步:在pom.xml中指明依赖;
<dependency> <groupId>jcuda</groupId> <artifactId>jcuda</artifactId> <version>0.7.5</version> </dependency>
第三步:打包
首先需要明白,maven打包有两种,生成一个jar包或者生成一个zip包。用maven-jar-plugin来生成jar包。使用maven-jar-plugin和maven-assembly-plugin来生成zip包。
这里,我们第二种方式。即:将应用打成一个jar包,依赖的第三方包放到lib目录下。
首先使用maven-jar-plugin,将自己的代码编译为jar文件;
需要注意到是这段
<archive> <manifest> ... <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix>
... </manifest> </archive>
再使用maven-assembly-plugin,将整个项目打包为一个发布包
关于 maven-jar-plugin 和 maven-assembly-plugin 怎么写,见 http://blog.csdn.net/cdmamata/article/details/51547033
也可以见:强烈推荐这个:
http://xxgblog.com/2015/08/07/maven-create-executable-jar/
其实,一团迷糊,说明对每个插件还不是很了解。如果对每个插件了解后,就不会有怎么多问题了。因为我只是在一个项目中多增减一个第三方依赖,因为它本来就需要对其他第三方依赖进行打包,所以我只需要完成前两步就可以了。后面两步,关键是对于几个插件的使用说明。