日期:2014-05-17  浏览次数:20855 次

关于Apache Maven您不知道的5件事-5个技巧
Maven 是为Java开发人员提供的一个极为优秀的构建工具,您也可以使用它来管理您的项目生命周期。作为一个生命周期管理工具,Maven是基于阶段操作的,而不像Ant是基于“任务”构建的。Maven 完成项目生命周期的所有阶段,包括验证、代码生成、编译、测试、打包、集成测试、安装、部署、以及项目网站创建和部署。

  为了更好地理解Maven和传统构建工具的不同,我们来看看构建一个JAR文件和一个EAR文件的过程。使用Ant,您可能需要定义专有任务来组装每个工件。另一方面,Maven 可以为您完成大部分工作:您只需要告诉它是一个 JAR 文件还是一个 EAR 文件,然后指示它来完成 “打包” 过程。Maven 将会找到所需的资源,然后构建文件。

  本文的5个技巧目的是帮助您解决即将出现的一些问题:使用Maven管理您的应用程序的生命周期时,将会出现的编程场景。

  1. 可执行的JAR文件

  使用 Maven 构建一个 JAR 文件比较容易:只要定义项目包装为 “jar”,然后执行包装生命周期阶段即可。但是定义一个可执行 JAR 文件却比较麻烦。采取以下步骤可以更高效:

  在您定义可执行类的 JAR 的 MANIFEST.MF 文件中定义一个 main 类。(MANIFEST.MF 是包装您的应用程序时 Maven 生成的。)

  找到您项目依赖的所有库。

  在您的 MANIFEST.MF 文件中包含那些库,便于您的应用程序找到它们。

  您可以手工进行这些操作,或者要想更高效,您可以使用两个 Maven 插件帮助您完成:maven-jar-plugin 和 maven-dependency-plugin。

  maven-jar-plugin

  maven-jar-plugin 可以做很多事情,但在这里,我们只对使用它来修改默认 MANIFEST.MF 文件的内容感兴趣。在您的 POM 文件的插件部分添加清单 1 所示代码:

  清单 1. 使用 maven-jar-plugin 修改 MANIFEST.MF

  
<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 插件通过一个 元素公布了其配置,在本例中,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 文件时,使用该元素定义将要执行的类名。

  maven-dependency-plugin

  当您使用这 3 个元素配置好了 MANIFEST.MF 文件之后,下一步是将所有的依赖项复制到 lib 文件夹。为此,使用 maven-dependency-plugin,如清单 2 所示:

  清单 2. 使用 maven-dependency-plugin 将依赖项复制到库

  
<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

2. 定制 MANIFEST.MF

  虽然 maven-jar-plugin 允许您修改 MANIFEST.MF 文件的共有部分,但有时候您需要一个更个性化的 MANIFEST.MF。解决方案是双重的:

  在一个 “模板” MANIFEST.MF 文件中定义您的所有定制配置。

  配置 maven-jar-plugin 来使用您的 MANIFEST.MF 文件,然后使用一些 Maven 配置增强。

  例如,考虑一个包含 Java 代理的 JAR 文件。要运行一个 Java 代理,需要定义 Premain-Class 和设置许可。清单 3 展示了这样一个 MANIFEST.MF 文件的内容:

  清单 3. 在一个定制的 MANIFEST.MF 文件中定义 Premain-Class

  
Manifest-Version: 1.0

  Can-Redefine-Classes: true

  Can-Retransform-Classes: true

  清单 4. 包含 Premain-Class

  
<plugin>

  <groupId>org.apache.maven.plugins</groupId>

  <artifactId>maven-jar-plugin</artifactId>

  <configuration>

  <archive>

  <manifestFile>

  src/main/resources/META-INF/MANIFEST.MF

  </manifestFile>

  <manifest>

  <addClasspath>true</addClasspath>

  &l