Apache Maven 插件

访问原文:https://www.ibm.com/developerworks/cn/java/j-5things16/index.htmlhtml

掌握现代 Maven 插件的技巧java





您是否知道 Maven?

Maven 是一个面向 Java™开发人员的领先的依赖管理和构建工具,并且名副其实!它经过阐述项目的构造来标准化软件构建流程,将它部署为应用程序,而后与其余项目共享它。git

Maven 采用了一组可靠的插件来提供它的全部功能。在 Maven 中,插件拥有目标,在幕后,该目标就是 Java 方法。目标执行构建任务,好比编译项目,打包它,并将它部署到本地或远程服务器。这些活动可完美地映射到构建生命周期的各个阶段。apache

Maven 提供了本身的构建插件,这些插件已打包且可当即使用,并且预先配置了默认值。经过“约定高于配置”原则,能够确保可以针对给定任务的复杂性来扩展配置。大部分构建任务都只需极少的配置。编程

您还能够自定义 Maven 插件的行为。使用 Maven 的 <configuration> 元素,很容易重写插件默认值并定义新值。毫无疑问,大部分重写的默认值是 compiler 插件的 <source> 和<target> 值。windows

须要证据?您有多少次将清单 1 中的 XML 添加到 POM 中,以设置正确的 JVM 版本?api

清单 1. compiler 插件中的 Java 版本配置
1
2
3
4
5
6
7
8
9
< plugin >
    < groupId >org.apache.maven.plugins</ groupId >
    < artifactId >maven-compiler-plugin</ artifactId >
    < version >3.6.1</ version >
    < configuration >
        < source >1.8</ source >
        < target >1.8</ target >
    </ configuration >
</ plugin >

执行 Maven 生命周期

每一个插件目标都映射到一个 Maven 生命周期阶段。发出 mvn compile 命令会告诉 mvn 实用程序调用绑定到 compile 生命周期阶段的全部目标。compiler 插件的 compile 目标被绑定到这个生命周期阶段。安全

阶段与目标之间是一对多的关系。多个插件目标能够绑定到同一个阶段,以造成相关任务集合。阶段也是分层的,这意味着执行一个阶段会致使执行它前面的全部阶段

在本例中,发出 mvn compile 命令会启动 validate 阶段(Maven 的默认构建生命周期的第一个阶段),并调用绑定到该阶段的全部目标。

Maven 和 Google Code 网站维护着一个 Maven 插件列表。这些插件提供了各类各样有用且省时的功能,您能够将它们整合到构建流程中。我将介绍我发现的一些最有用的插件,并展现如何最充分地利用它们。

1.对 JAR 或 WAR 执行数字签名

单击下面的按钮,下载本示例的代码。它包含一个简单的应用程序和一个包含已配置好的 Jarsigner 插件的 POM 文件。

对 JAR 或 WAR 执行数字签名是一项重要任务,尤为是在您想分发您的应用程序的时候。幸运的是,Java 平台提供了一个名为 jarsigner 的存档签名实用程序。它是一个命令行工具,可经过向它传递存档文件的位置和各类参数(好比包含您的加密密钥的密钥库)对存档文件执行签名。

能够在 JDK 安装的 <%JAVA_HOME%>/bin 目录中找到 jarsigner。清单 2 展现了如何使用此实用程序对 JAR 执行签名。

清单 2. 使用 jarsigner 实用程序对存档文件执行签名
1
2
3
4
5
6
jarsigner
     -keystore /path/to/keystore.jks
     -storepass < password >
     -keypass < key password>
     YourArchive.jar
     alias

jarsigner 是一个易于使用的命令行工具,并且开箱即用。 若是能自动化签名流程,在构建周期的 package 阶段对存档文件执行签名岂不是更好? 得益于包含 jarsigner 实用程序的 Maven Jarsigner 插件,您能够实现此目标。您只须要将该插件的 sign 目标绑定到您的构建周期的 package 阶段。

首先须要一个密钥库。若是没有,可使用 Java 平台的 keytool 实用程序建立它,该实用程序可在 JDK 安装的<%JAVA_HOME%>/bin 目录中找到。

建立一个密钥库

要建立一个密钥库,请导航到您想要放置它的位置并执行清单 3 中的命令。必定要将 KeyAlias 替换为合适的值,好比您的域名。官方 Oracle 文档详细介绍了该工具接受的更多配置选项。

清单 3. 为 jarsigner 实用程序建立一个密钥库
1
keytool -genkey -alias < KeyAlias > -keyalg RSA -keystore keystore.jks -keysize 2048

建立密钥库的过程要求您回答一系列有关您本身和您的组织的问题,并提供一个安全密码。配置 Maven Jarsigner 插件时(接下来就会这么作)将须要此密码。

将 Jarsigner 添加到您的构建流程中

如今将 Maven Jarsigner 插件添加到您的构建生命周期中,而后配置它来对 package 阶段中生成的 JAR 执行数字签名。关联到此阶段是合理的,由于已构造 JAR 并将它存储在您项目的默认输出目录中,该目录一般是 target 目录。在 POM 文件的 <plugins> 部分,添加清单 4 中所示的代码。

清单 4. 添加 Jarsigner 插件
1
2
3
4
5
< plugin >
    < groupId >org.apache.maven.plugins</ groupId >
    < artifactId >maven-jarsigner-plugin</ artifactId >
    < version >1.4</ version >
</ plugin >

您想要在构建 JAR 后对它执行签名,因此须要将签名过程(包装在 sign 目标中)链接到 package 生命周期阶段。为此,请将清单 5 中的代码添加到该插件中。

清单 5. 将 sign 目标链接到 package 阶段
1
2
3
4
5
6
7
8
9
< executions >
     < execution >
         < id >sign</ id >
         < phase >package</ phase >
         < goals >
             < goal >sign</ goal >
         </ goals >
     </ execution >
</ executions >

sign 目标须要一些配置细节才能对 JAR 执行数字签名。因此应该在 <configuration> 元素之间添加密钥库位置、您想要使用的凭证的别名、密钥库密码和凭证的密码,如清单 6 所示。

清单 6. 指定安全凭证
1
2
3
4
5
6
< configuration >
    < keystore >/location/of/keystore.jks</ keystore >
    < alias >KeyAlias</ alias >
    < storepass >password</ storepass >
    < keypass >password</ keypass >
</ configuration >

这是实现 JAR 签名特性所需的最低配置。请注意,该插件提供了大量额外的配置选项供选择。

最后一步是构建 JAR 并验证已对它正确执行签名。从命令行执行 package 目标,以下所示:mvn clean package。在控制台输出中,会看到 JAR 正在构建,而后被签名。图 1 展现了您可能看到的结果

图 1. 输出显示已对存档执行签名
输出显示已对存档执行签名

将 JAR 构建到 target 输出目录中,这是 Jarsigner 插件指望找到它的位置。该插件将使用您提供的凭证对 JAR 执行签名,而后向 META-INF 目录添加两个额外的文件:一个具备 .SF 扩展名的签名文件,以及一个具备 .RSA 扩展名的签名块文件。

如今已有一个通过数字签名的 JAR 可供分类。

验证数字签名

在分类 JAR 以前,让咱们验证已对它进行正确签名。可使用 Maven Jarsigner 的 verify 目标,或者使用 jarsigner 工具经过命令行来实现此操做。在清单 7 中,我使用了命令行工具并向它传递我想要验证的存档文件。

清单 7. 使用 jarsigner 实用程序验证已签名的 JAR
1
jarsigner -verify target/YourJavaArchive.jar

若是成功,则会收到如下消息:jar verified

对 WAR 文件执行签名

对 JAR 执行签名不是 Jarsigner 的惟一功能。该插件可对任何 Java 存档文件执行签名,包括 WAR 文件。要查看此操做是如何实现的,能够将 POM 的打包类型从 JAR 更改成 WAR,添加 Maven WAR 插件(如清单 8 所示)并执行命令:mvn clean package

清单 8. 添加 Maven WAR 插件
1
2
3
4
5
< plugin >
    < groupId >org.apache.maven.plugins</ groupId >
    < artifactId >maven-war-plugin</ artifactId >
    < version >3.1.0</ version >
</ plugin >

检查 target 目录,您会找到已签名的 WAR 文件。

对多个存档文件执行签名

若是有多个存档文件要签名,Jarsigner 也能应对这种状况。清单 9 中的代码将 JAR 的签名位置指定为 target/all,而且将对此目录中的全部 JAR 执行签名。

清单 9. 指定一个存档目录
1
< archiveDirectory >target/all</ archiveDirectory >

若是须要更精确地控制要签名的存档文件,可使用通配符来显式包含和排除文件,如清单 10 所示。

清单 10. 包含和排除选定的存档文件
1
2
3
4
5
6
< includes >
    < include >*1.0.jar</ include >
</ includes >
< excludes >
    < exclude >*SNAPSHOT.jar</ exclude >
</ excludes >

2.使用 Maven Cargo 部署一个受保护的 Web 应用程序

单击下面的按钮,下载本示例的代码。它包含一个简单的 Web 应用程序和一个包含已配置好的 Cargo 插件的 POM 文件。

来自 Codehaus 的 Cargo 插件 是 Cargo API 的一个包装器。该 API 旨在配置、启动、中止应用程序并将它部署到各类受支持的容器中,并解析、建立和合并 Java EE 模块。

一个特别重要的特性是,Cargo 可以采用容器不可知的方式来指定服务器属性。这些属性包括端口、远程安全凭证、JVM 参数,以及(咱们最感兴趣的)您想部署的应用程序的用户登陆细节。该插件支持 14 种最流行的服务器的最新版本。

Cargo 插件最好关联到 Maven 生命周期的 package 阶段中。也能够直接引用 run 目标来独立执行它:mvn cargo:run。独立执行会假设该项目已打包且准备好部署。

咱们首先将 Cargo 的 run 目标关联到 package 阶段中,如清单 11 所示。

清单 11. 将 Cargo 的 run 目标关联到 package 阶段
1
2
3
4
5
6
7
8
9
10
11
12
13
< plugin >
    < groupId >org.codehaus.cargo</ groupId >
    < artifactId >cargo-maven2-plugin</ artifactId >
    < version >1.6.4</ version >
    < executions >
        < execution >
            < phase >package</ phase >
            < goals >
                < goal >run</ goal >
            </ goals >
        </ execution >
    </ executions >
</ plugin >

完成 Maven 集成后,如今须要对您但愿 Cargo 部署应用程序的目标容器进行配置。Cargo 支持各类各样的容器场景,包括部署到已在运行的本地或远程服务器(这包括在须要时启动该服务器)。或者,能够配置 Cargo 来下载、安装、部署并启动它支持的 14 种服务器中的任意一种。

对于本示例,我将使用 IBM® WebSphere® Liberty,我已下载它并解压到一个名为 servers 的目录中。

容器配置至少须要容器 ID 和所安装服务器的主目录位置。清单 12 给出了位于个人 servers/wlp 目录中的 Liberty 服务器的配置。

清单 12. 容器配置
1
2
3
4
5
6
< configuration >
    < container >
        < containerId >liberty</ containerId >
        < home >\path\to\servers\wlp</ home >
    </ container >
</ configuration >

下载容器 ZIP 文件

另外一个选项是指定 IBM 网站上的 Liberty ZIP 文件的 URL,在这种状况下,Cargo 插件会下载并安装该服务器。清单 13 显示了执行此操做的代码。

清单 13. 从网络安装容器
1
2
3
4
5
6
7
8
9
10
11
12
< container >
    < containerId >liberty</ containerId >
    < zipUrlInstaller >
        < url >
               https://public.dhe.ibm.com/ibmdl/export/pub/
               software/websphere/wasdev/downloads/wlp/17.0.0.2/
               wlp-webProfile7-17.0.0.2.zip
        </ url >
        < downloadDir >/path/to/downloadDir</ downloadDir >
        < extractDir >/path/to/extractDir</ extractDir >
    </ zipUrlInstaller >
</ container >

第一次执行 run 目标时,会下载和解压 ZIP 文件。在后续执行时,Maven 会检测到该文件已下载和安装,并跳过该任务。

您如今拥有最少的配置,能够将该应用程序部署到您的服务器中来测试该配置。经过调用 package 阶段 (mvn package) 来启动该流程。将应用程序编译、打包并部署到服务器中,并且可经过如下 URL 访问它:http://localhost:8080/{artifactid}/index.html

自定义上下文根目录

默认状况下,使用 artifactid 来命名 Web 应用程序的上下文根目录。在某些状况下,您须要指定一个自定义上下文根目录。在清单 14 中,我将上下文根目录定义为 home

清单 14. 自定义上下文根目录
1
2
3
4
5
6
7
< deployables >
    < deployable >
        < properties >
            < context >home</ context >
        </ properties >
    </ deployable >
</ deployables >

部署应用程序后,可经过如下地址访问该 Web 应用程序: localhost:8080/home/index.html

指定用户登陆信息

您如今已有一个很是可靠的部署流程,它会下载并安装一个服务器,将您的应用程序部署到一个自定义上下文根目录中。对于 Cargo 插件的功能而言,这才刚刚开始。

在咱们开始定义配置属性时,Cargo 才真正发挥出它的实力。正如我以前提到的,这些配置属性是容器的属性,好比端口、协议,最重要的是用户登陆细节。

让咱们向示例应用程序添加一个用户,并强制登陆到该站点。为了保持简单,咱们将使用基自己份验证方法,只须要应用程序的 web.xml 文件中的极少配置。清单 15 显示了 user-role 的规范和对 WelcomeServlet Web 资源的限制。

清单 15. 声明用户角色
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
< web-app version = "3.1" ...>
 
    < security-constraint >
        < web-resource-collection >
            < web-resource-name >Welcome Servlet</ web-resource-name >
            < url-pattern >/WelcomeServlet/*</ url-pattern >
            < http-method >GET</ http-method >
        </ web-resource-collection >
 
        < auth-constraint >
            < role-name >user-role</ role-name >
        </ auth-constraint >
    </ security-constraint >
 
    < login-config >
        < auth-method >BASIC</ auth-method >
        < realm-name >file</ realm-name >
    </ login-config >
 
    < security-role >
        < role-name >user-role</ role-name >
    </ security-role >
 
</ web-app >

能够配置 Cargo 插件来为 user-role 建立一个用户,这能够在部署时动态完成。 清单 16 给出了为 user-role 定义的用户名和密码。用户名为 user,密码为 user123!

清单 16. 定义用户名和密码
1
2
3
4
5
6
7
< configuration >
    < properties >
       < cargo.servlet.users >
          user:user1234!:user-role
       </ cargo.servlet.users >
    </ properties >
</ configuration >

<cargo.servlet.users> 属性的格式为 username:password:role。经过使用竖线符号分隔属性集合,能够在一个属性中为同一个和不一样的角色声明多个用户:

1
username1:password1:role11,...,role1N|username2:password2:role21,...,role2N|...

将用户名和密码分配给用户角色后,如今能够打包和部署应用程序了。只需使用一个命令 (mvn clean package),就会将您的 Web 应用程序编译、打包并部署到 Liberty 容器。该服务器也会启动。

若是导航到 URL http://localhost:8080/home/WelcomeServlet,将会看到一个登陆框,如图 2 所示。输入在 Cargo 插件中配置的用户名和密码,单击 Log In 进入该应用程序。

图 2. 登陆框
登陆框

3.将一个自定义 JAR 安装到您的本地存储库中

将 JAR 包含在项目中的传统方式是,在项目中建立一个目录并确保它位于类路径上。借助 Maven,您不须要这样作。不须要将 JAR 和项目放在一块儿,Maven 将它们存储在一个隔离的本地存储库中。而后,您的项目必须指定对这些 JAR 的依赖关系。

该本地存储库中填充了从中央 Maven 存储库下载的依赖项。这就像一艘 Maven 航母,包含数千个流行和通用的 JAR。可是若是您想要使用的 JAR 不在 Maven 中央存储库中,该怎么办?固然,您能够依靠传统解决方案,将 JAR 直接包含在项目中,但您将没法从 Maven 的依赖管理中获益。

可使用 maven install plugin 将 JAR 安装到本地 Maven 存储库中。首先,您须要下载该插件,而后能够执行它的 install-file 目标。这个示例与前面的示例稍有不一样,由于您不会将该目标与一个 Maven 生命周期阶段关联。您会在 Maven 命令行工具中指定该目标。

install-file 目标须要 5 个参数来指定 JAR 文件的位置、groupartifactid、它的版本号和包类型。清单 17 给出了该 Maven 命令的结构。

清单 17. 将 JAR 安装在本地 Maven 存储库中
1
2
3
4
5
6
mvn install:install-file
     -Dfile=PATH/TO/YOUR-JAR.jar
     -DgroupId=GROUP-ID
     -DartifactId=ARTIFACT-ID
     -Dversion=VERSION
     -Dpackaging=jar

对于您但愿安装的 JAR,须要指定上面所显示参数的值。您能够将它们指定为您想要的任何值。执行该操做后,您能够亲眼看到新文件存储在本地 Maven 存储库中。导航到存储库目录 /.m2/repository,找到名为 GROUP-ID 的文件夹。若是 groupId值是一个反向域名,好比 com.readlearncode,能够搜索 com 目录,而后导航到 readlearncode 目录。您能够在这里找到一个文件夹,其中包含已安装在该文件夹中的工件和 JAR 的版本号。JAR 的位置可能相似于:/.m2/repository/com/readlearncode/4.0/MyJar.jar

您的 JAR 如今可供您的全部项目使用。您能够像日常同样将它做为依赖项添加到您的 POM 中,如清单 18 所示。

清单 18. 将您的 JAR 指定为依赖项
1
2
3
4
5
< dependency >
    < groupId >GROUP-ID</ groupId >
    < artifactId >ARTIFACT-ID</ artifactId >
    < version >VERSION</ version >
</ dependency >

4.建立基于 GitHub 的 Maven 存储库

单击下面的按钮,下载本示例的代码。它包含一个简单的应用程序和一个已配置好 site-maven-plugin 的 POM 文件。

将 Maven 存储库托管在 GitHub 上有许多理由,包括许可问题、隐私和商业托管成本。不管您为何选择托管基于 GitHub 的 Maven 存储库,设置一个存储库都很容易。

首先,在现有 GitHub 存储库中建立一个分支,将项目的工件直接安装到该分支中。这将绑定到 Maven 生命周期的 deploy 阶段,以便在部署项目时,能够自动刷新远程存储库。

添加 GitHub 凭证

在 GitHub 存储库中建立 Maven 分支后,须要将您的 GitHub 存储库凭证添加到 Maven 的 settings.xml 文件中。此文件一般可在 .m2 目录中找到。在 settings.xml 的 <servers> 元素之间,须要定义一个新服务器并指定您的用户名和密码。清单 19 演示了此过程(请注意,我将个人新服务器命名为 github)。

清单 19. 将一个 github 存储库配置为服务器
1
2
3
4
5
6
7
< servers >
    < server >
        < id >github</ id >
        < username >USERNAME_OR_EMAIL</ username >
        < password >PASSWORD</ password >
    </ server >
</ servers >

双因素身份验证

若是启用了双因素身份验证,则须要经过 GitHub Settings 建立一个 Personal Access Token。将该令牌直接复制并粘贴到 <password> 元素中。要实现额外的安全保护,可按照 Maven 网站上的说明来加密密码。

Maven site 插件

在 Maven POM 中,您将使用 GitHub 的 site-maven-plugin。您须要作的第一件事是设置一个从中提交文件的基本目录。首先建立一个临时目录,并将它放在项目的 target 目录中,如清单 20 所示。对于本示例,我将该目录命名为 repo-stage

接下来,由于您想将此插件关联到 deploy 阶段,因此必须在 maven-deploy-plugin 的 <altDeploymentRepository> 中指定存储库位置。清单 20 中的代码片断展现了如何指定存储库位置。

清单 20. 指定备选的本地存储库
1
2
3
4
5
6
7
8
9
10
< plugin >
    < artifactId >maven-deploy-plugin</ artifactId >
    < version >2.8.2</ version >
    < configuration >
        < altDeploymentRepository >
               Repo.stage::default::file://
               ${project.build.directory}/repo-stage
        </ altDeploymentRepository >
    </ configuration >
</ plugin >

最后,须要配置 site-maven-plugin 并将它关联到 deploy 阶段。为此,请向该插件传递以前建立的 GitHub 服务器的 id。还须要向它传递存储库名称和全部者、您将项目工件提交到的分支,以及针对该提交的注释。您还须要关闭 Jekyll,让它不会认为本身须要生成 GitHub 页面。

清单 21 给出了 site-maven-plugin 的完整配置。请注意,存储库名称是 dependency(若是该分支不存在,GitHub 将建立它)。

清单 21. 配置 site 插件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
< plugin >
    < groupId >com.github.github</ groupId >
    < artifactId >site-maven-plugin</ artifactId >
    < version >0.12</ version >
    < configuration >
        <!-- Github settings -->
        < server >github</ server >
        < repositoryName >MavenSampler</ repositoryName >
        < repositoryOwner >atheedom</ repositoryOwner >
        < branch >refs/heads/dependency</ branch >
        < message >
          Artifacts for
          ${project.name}/${project.artifactId}/${project.version}
        </ message >
        < noJekyll >true</ noJekyll >
        <!-- Deployment values -->
        < outputDirectory >
               ${project.build.directory}/repo-stage
        </ outputDirectory >
        < includes >
            < include >**/*</ include >
        </ includes >
    </ configuration >
    < executions >
        < execution >
            < phase >deploy</ phase >
            < goals >
                < goal >site</ goal >
            </ goals >
        </ execution >
    </ executions >
</ plugin >

如今只剩下运行命令 mvn clean deploy 了。在控制台中,您会看到该插件将存储库文件上传到您的 GitHub 账户,建立提交,并将该提交推送到依赖项分支。控制台输出应相似于图 3。

图 3. 一次成功提交的控制台输出
成功提交的控制台输出

要验证全部步骤都按预期进行,请访问您的 GitHub 存储库并选择 dependency 分支。您会看到项目的全部工件,如图 4 所示。

图 4. GitHub 中的 Maven 存储库的屏幕截图
GitHub 中的 Maven 存储库的屏幕截图

确认您的工件已安全提交到您的 GitHub Maven 存储库后,您可能想与但愿依靠您项目的其余人共享新的存储库。

添加 GitHub 做为存储库

要将 GitHub Maven 存储库指定为他们本身的项目的远程存储库,订阅者须要在他们的 POM 中声明该存储库,如清单 22 所示。而后,将按正常方式指定您的项目的工件,如清单 23 所示。

清单 22. 将 GitHub 指定为远程存储库
1
2
3
4
5
6
7
8
9
10
11
12
13
< repositories >
    < repository >
        < id >PROJECT_NAME-dependency</ id >
        < url >
               https://raw.github.com/
               GITHUB_USERNAME/PROJECT_NAME/dependency
        </ url >
        < snapshots >
            < enabled >true</ enabled >
            < updatePolicy >always</ updatePolicy >
        </ snapshots >
    </ repository >
</ repositories >
清单 23. 项目依赖项
1
2
3
4
5
< dependency >
    < groupId >com.readlearncode</ groupId >
    < artifactId >maven-sampler</ artifactId >
    < version >1.0</ version >
</ dependency >

如今,您拥有一个简单的公共 Maven 存储库,用于部署您的依赖项并与全世界共享它们。

5.更多省时技巧和诀窍

Apache Maven 的应用如此普遍,以致于查找未知的技巧和诀窍就像勘探金矿同样。因此我决定最后提供一些我发现很是有用的消息。在其中,您能找到一些节省时间和避免受挫的宝贵技巧。

未使用依赖项的“Roomba”

开发工做既有趣又使人兴奋,尤为是在您使用新 API 和技术时。Maven 也能快速、轻松地引入新技术:您只须要将依赖项复制并粘贴到您的 POM 文件中,而后就大功告成了。可是,做为开发人员,咱们有时会被激情冲昏了头脑,忘记删除未使用的依赖项;或者咱们懒得这么作。随着时间的推移,这种坏习惯可能让您的 POM 不断变大并减缓您的部署。

因此个人第一条技巧是,Maven 就像机器人真空吸尘器 Roomba。只需运行清单 24 中的命令,Maven 就会分析您的项目代码,查找未使用的依赖项并确认它们。

清单 24. 确认未使用的依赖项
1
dependency:analyze

清洁本地存储库

您须要时常清洁您的 Maven 存储库—也许是由于误用,或者由于您的 IDE 索引速度很是慢。不管何种缘由,均可以执行清单 25 中的代码来删除全部污染物。

清单 25. 清洁本地存储库
1
mvn dependency:purge-local-repository

这将清洁当前项目,而后自动下载其全部依赖项。您的项目将得到重生,并准备好再次超越自我。

添加时间戳!

向构建周期添加时间戳可能很是有用。Maven 2 引入了构建变量 maven.build.timestamp,它表示构建的开始时间。可经过变量 ${maven.build.timestamp},在 POM 中的任何地方使用此变量。

可使用 Java SimpleDateFormat 类来格式化时间戳,并使用属性 <maven.build.timestamp.format> 来声明它。清单 26 给出了一个实现此过程的示例。

清单 26. 时间戳格式
1
2
3
4
5
< properties >
     < maven.build.timestamp.format >
         yyyy-MM-dd'T'HH:mm:ss'Z'
     </ maven.build.timestamp.format >
</ properties >

回显属性

您是否曾经想知道某个 Maven 属性值?不用猜想,您可使用 maven-antrun-plugin 得到明确的答案。这个小巧的工具会将您传递给它的任何属性回显到控制台。

在清单 27 中,将 antrun 的 run 目标关联到 Maven 的 validate 阶段中(第一个默认生命周期阶段),使用 configuration 部分的 <echo> 元素来输出属性值。

清单 27. 将属性回显到控制台
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
< plugin >
    < groupId >org.apache.maven.plugins</ groupId >
    < artifactId >maven-antrun-plugin</ artifactId >
    < version >1.1</ version >
    <
相关文章
相关标签/搜索