使用 Maven 构建一个 JAR 文件比较容易:只要定义项目包装为 “jar”,然后执行包装生命周期阶段即可。但是定义一个可执行 JAR 文件却比较麻烦。采取以下步骤可以更高效:
- 在您定义可执行类的 JAR 的 MANIFEST.MF 文件中定义一个
main
类。(MANIFEST.MF 是包装您的应用程序时 Maven 生成的。) - 找到您项目依赖的所有库。
- 在您的 MANIFEST.MF 文件中包含那些库,便于您的应用程序找到它们。
您可以手工进行这些操作,或者要想更高效,您可以使用两个 Maven 插件帮助您完成:maven-jar-plugin
和 maven-dependency-plugin
。
maven-jar-plugin
可以做很多事情,但在这里,我们只对使用它来修改默认 MANIFEST.MF 文件的内容感兴趣。在您的 POM 文件的插件部分添加清单 1 所示代码:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> <mainClass>com.mypackage.MyClass</mainClass> </manifest> </archive> </configuration> </plugin> |
所有 Maven 插件通过一个 <configuration>
元素公布了其配置,在本例中,maven-jar-plugin
修改它的 archive
属性,特别是存档文件的 manifest
属性,它控制 MANIFEST.MF 文件的内容。包括 3 个元素:
addClassPath
:将该元素设置为 true 告知maven-jar-plugin
添加一个Class-Path
元素到 MANIFEST.MF 文件,以及在Class-Path
元素中包括所有依赖项。classpathPrefix
:如果您计划在同一目录下包含有您的所有依赖项,作为您将构建的 JAR,那么您可以忽略它;否则使用classpathPrefix
来指定所有依赖 JAR 文件的前缀。在清单 1 中,classpathPrefix
指出,相对存档文件,所有的依赖项应该位于 “lib
” 文件夹。mainClass
:当用户使用lib
命令执行 JAR 文件时,使用该元素定义将要执行的类名。
当您使用这 3 个元素配置好了 MANIFEST.MF 文件之后,下一步是将所有的依赖项复制到 lib
文件夹。为此,使用 maven-dependency-plugin
,如清单 2 所示:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy</id> <phase>install</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory> ${project.build.directory}/lib </outputDirectory> </configuration> </execution> </executions> </plugin> |
maven-dependency-plugin
有一个 copy-dependencies
,目标是将您的依赖项复制到您所选择的目录。本例中,我将依赖项复制到build
目录下的 lib
目录(project-home/target/lib
)。
将您的依赖项和修改的 MANIFEST.MF 放在适当的位置后,您就可以用一个简单的命令启动应用程序:
java -jar jarfilename.jar maven 插件tip 在pom中配置maven的作用是可以做一个预先的配置,并且可以配置这个插件在生命周期的某个阶段运行这个插件.每个插件都是AbstractMojo 类的实现,一个Mojo对应了插件的一个goal,goal和接收参数的名称可以在实现中用javadoc指定,如: /** * @goal greeting */ public class GreetingMojo extends AbstractMojo 插件工程的package形式是maven-plugin,install之后会在插件的jar目录META-INF/maven下形成一个插件描述文件,这个描述文件指定了 插件的基本信息,支持的goal和每个goal需要的参数等以及插件的maven依赖。 maven使用plexus作为IoC框架管理插件。 |