本部分内容介绍了Maven核心Plugin。
本文内容全部翻译自Apache Software Foundation,如有转载,请声明!
Clean插件
Clean插件用于移除在构建时产生的文件。
Clean插件只有一个goal。
clean:clean 用于移除工程工作空间中在构建时生成的文件。默认情况下,该goal找到并删除project.build.directory,project.build.outputDirectory,project.build.testOutputDirectory和project.reporting.outputDirectory目录中的内容。
可以通过在命令行使用如下的命令运行clean插件:
mvn clean:clean
mvn clean
或者和其他的phase/goals一起运行
mvn clean package site
也可以在构建过程中自动的运行clean插件,同时可以指定删除其他的文件(对Maven透明的文件)
<project>
[...]
<build>
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<executions>
<execution>
<id>auto-clean</id>
<phase>validate</phase>
<goals>
<goal>clean</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
[...]
</project>
<build>
[...]
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<configuration>
<filesets>
<fileset>
<directory>some/relative/path</directory>
//equals to ${basedir}/some/relative/path
<includes>
<include>**/*.tmp</include>
<include>**/*.log</include>
</includes>
<excludes>
<exclude>**/important.log</exclude>
<exclude>**/another-important.log</exclude>
</excludes>
<followSymlinks>false</followSymlinks>
</fileset>
</filesets>
</configuration>
</plugin>
[...]
</build>
默认情况下在clean失败时,构建过程也是失败的,如果不希望这样的话,那么可以使用下面的配置来忽略失败:
<artifactId>maven-clean-plugin</artifactId>
<configuration>
<failOnError>false</failOnError>
...
在某些情况下,可能需要跳过clean的过程,可以使用下面的配置来实现:
<artifactId>maven-clean-plugin</artifactId>
<configuration>
<skip>true</skip>
Compiler插件
Compiler插件用来编译工程的源代码或者测试源代码。默认的编译器是javac,用来编译Java源代码。默认的source属性设置为1.3,默认的target设置为1.1,和运行Maven时的JDK版本无关。如果需要修改这个默认值的话,可以通过如下方法:
<project>
[...]
<build>
[...]
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.4</source>
<target>1.4</target>
</configuration>
</plugin>
</plugins>
[...]
</build>
[...]
</project>
除了javac编译器之外,maven还开始支持AspectJ、.NET和C#。
Compiler插件是Maven1.x中Java插件的Maven2版本。
编译Java源代码
Compiler插件的goal被绑定到构建周期中各自独立的phases。当需要编译源代码的时候,只需要指定需要执行哪个构建周期,下面是编译源代码的命令:
mvn compile
如果要编译测试源代码,那么需要使用
mvn test-compile
上述两个命令分别执行compiler:compile和compiler:test-compile命令。
下面的pom片段演示了如何在pom中配置Compiler插件:
<project>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<!-- put your configurations here -->
</configuration>
</plugin>
</plugins>
</build>
...
</project>
可以使用不同的JDK来编译源代码,只是通过compilerVersion来指定的。同时必须将fork属性设置为true,以便使其工作:
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<verbose>true</verbose>
<fork>true</fork>
<executable><!-- path-to-javac --></executable>
<compilerVersion>1.3</compilerVersion>
</configuration>
</plugin>
为了避免javac编译器的硬编码,可以使用一个属性来指定javac的路径:
<executable>${JAVA_1_4_HOME}/bin/javac</executable>
这样的话,不同的开发人员可以在自己的settings.xml文件中或者系统环境变量中指定${JAVA_1_4_HOME}变量,以便使构建成为可移植的。
<settings>
[...]
<profiles>
[...]
<profile>
<id>compiler</id>
<properties>
<JAVA_1_4_HOME>C:\j2sdk1.4.2_09</JAVA_1_4_HOME>
</properties>
</profile>
</profiles>
[...]
<activeProfiles>
<activeProfile>compiler</activeProfile>
</activeProfiles>
</settings>
当使用不同的JDK版本时,可能需要进行自定义Manifest文件的格式。默认的Manifest的格式如下:
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: ${user.name}
Build-Jdk: ${java.version}
可以以通过使用archive配置元素来自定义manifest信息。下面是一些样例的配置选项:
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
...
<configuration>
<archive>
<index>true</index>
<manifest>
<addClasspath>true</addClasspath>
</manifest>
<manifestEntries>
<mode>development</mode>
<url>${pom.url}</url>
<key>value</key>
</manifestEntries>
</archive>
</configuration>
...
在编译时可以指定编译器占用的内存的大小,例如下面的pom片段中将初始的内存大小设置为128MB,并将最大的内容使用设置为512MB:
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<fork>true</fork>
<meminitial>128m</meminitial>
<maxmem>512m</maxmem>
</configuration>
</plugin>
</plugins>
在编译过程中可以将编译参数插入到构建过程中,例如:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<compilerArgument>-verbose -bootclasspath ${java.home}\lib\rt.jar</compilerArgument>
</configuration>
</plugin>
或者使用Map格式的参数:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<compilerArguments>
<verbose />
<bootclasspath>${java.home}\lib\rt.jar</bootclasspath>
</compilerArguments>
</configuration>
</plugin>
Deploy插件
deploy插件最初是在deploy phase中使用,以便将产品添加到远程存储库以便对其他开发人员和项目共享。这通常在集成测试或者释放环境中来完成。同时,deploy还是可以将一个特定的产品(第三方jar文件,例如Sun的非发布的引用实现javax.*)。
由于存储库不仅仅包含了产品(POMs,metadata,MD5和SHA1哈希文件...),所以发布不仅仅意味着拷贝文件,并且需要确保所有的信息都被正确的更新了。这就是deploy插件的功能。
在部署时需要以下条件:
¨ 存储库的信息:位置、传输协议(FTP,SCP,SFTP...)以及用户指定的帐户信息
¨ 产品的信息:group、artiface、version、packaging、classifier...
¨ 部署器:执行实际部署功能的方法。这可以作为一个wagon传输(跨平台)实现或者使用系统指定的方法
信息会通过隐含的POM或者命令行来使用。settings.xml文件也有可能用来获取用户的信息。
deploy插件包含了两个目标:
deploy:deploy用来自动的安装产品,pom以及由特定项目指定的附加产品。大多数部署相关的信息都是保存在工程的POM中。
可选参数:
altDeploymentRepository:指定产品被发布到的存储库,格式为: id::layout::url
updateReleaseInfo:用来更新产品是否更新的标志,默认为false
deploy:deploy-file用来安装单个的产品及其pom。
必要参数和可选参数请参考
Install插件
本地存储库是用来存储构建过程所需的所有的产品。默认情况下,本地存储库的路径为用户的主目录(~/.m2/repository),但是可以通过在~/.m2/settings.xml文件中来使用<localRepository>元素来进行自定义配置。
Install插件在install phase中使用,将产品添加到本地存储库。install插件使用POM中的信息(groupId,artifcaeId,version)来决定将产品安装在本地存储库中的什么位置。
install插件包含了两个goals:
install:intall用来自动的安装工程的产品(jar,war或者ear)、pom以及任何其他的附属产品(sources,javadoc,etc)。
这个goal包含了如下的可选参数:
createChecksum:是否生成checksums,默认为false。
md5Digester:MD5摘要
sha1Digester:SHA-1摘要
updateReleaseInfo:是否更新metadata来将产品发布,默认值为false。
install:install-file多数用来安装外部生成的产品以及它的pom到本地的存储库。
可以在命令行上运行maven install插件,install:install goal不需要任何的配置,只是需要项目的POM文件和要被安装的产品文件,它在default构建周期的install阶段被执行。
mvn install
install:install-file的具体执行参数如下:
mvn install:install-file -Dfile=your-artifact-1.0.jar \
[-DpomFile=your-pom.xml] \
[-DgroupId=org.some.group] \
[-DartifactId=your-artifact] \
[-Dversion=1.0] \
[-Dpackaging=jar] \
[-Dclassifier=sources] \
[-DgeneratePom=true]
[-DcreateChecksum=true]
时尚情况适用于存在自定义的或者指定的POM文件的情况。但是,对于一些第三方的产品,可能没有POM。install插件可以生成一个包含POM元素最小及的POM文件,这些元素包括groupId,artifactId,version,packaging。这些通过使用generatePom参数来实现:
mvn install:install-file -Dfile=path-to-your-artifact-jar \
-DgroupId=your.groupId \
-DartifactId=your-artifactId \
-Dversion=version \
-Dpackaging=jar \
-DgeneratePom=true
Resource插件
Resources插件用于处理将项目资源拷贝到输出目录。Resources包含两个目标,即主要资源和测试资源。这样就可以将程序源代码的资源和单元测试的资源进行分离。
Resources产检包含两个目标:
resources:resources将程序源代码的资源拷贝到输出主目录。
该目标的必要参数如下:
outputDirectory、resources
可选参数如下:
encoding、filters
resources:testResources将测试源代码的资源拷贝到测试输出目录。该目标的参数信息和前者相同。
mvn resources:resources,通过执行这个命令,源代码的资源会拷贝到主输出目录。这不会影响到测试代码。这个目标被绑定到process-resources构建阶段。
mvn resources:testResources,这个goal和之前的类似,将测试代码的资源文件拷贝到测试输出目录。同理,这不会影响程序代码。这个目标被绑定到process-test-resources。
指定编码格式:可以在读写文件时指定编码方式,例如ASCII,UTF-8、UTF-16。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
...
<encoding>UTF-8</encoding>
指定资源目录:默认情况下,maven会在src/main/resources目录下寻找资源文件:
Project
| -- pom.xml
` -- src
` -- main
` -- resources
可是,所有的资源不一定在src/main/resources目录下,此时需要在pom中指定资源目录:
<project>
[...]
<build>
[...]
<resources>
<resource>
<directory> [your folder here] </directory>
</resource>
<resource>
<directory> [your another folder here] </directory>
</resource>
</resources>
......
过滤:在资源中可能可以包含变量。这些变量使用${...}来表示,这些属性的值可以是系统属性,工程属性,过滤资源文件以及命令行设置。
例如,在src/main/resources/hello.txt包含如下的内容:
Hello ${name}
如果pom如下:
<project>
[...]
<name>My Resources Plugin Practice Project</name>
[...]
<build>
[...]
<resources>
[...]
<resource>
<directory>src/main/resources</directory>
这样的话,通过调用mvn resources:resources命令,就会生成一个资源在target/class/hello.txt目录中,包含的内容与之前相同:
Hello ${name}
但是,如果添加一个filtering标记到pom,并将其设置为true的话,如下所示:
[...]
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
[...]
那么再执行mvn resources:resources命令时,上述的内容就会变成
Hello My Resources Plugin Practice Project
这是由于name变量被项目名称所代替。也可以使用命令行的方式设置属性的值:
mvn resources:resources –Dname=”world”
不仅仅是预定义的项目变量,也可以指定自己的变量和值,将变量的名字作为标记,将值作为标记的值就可以了,例如:
<project>
[...]
<properties>
<your.name>world</your.name>
</properties>
[...]
</project>
但是,如果变量太多,就不适合放在pom中了,此时可以指定一个资源文件,例如:
<project>
[...]
<name>My Resources Plugin Practice Project</name>
[...]
<build>
[...]
<filters>
<filter> [a filter property] </filter>
</filters>
包含/排除文件和目录:当指定一个资源目录时,可能并不是目录中所有的文件都被使用。因此,可能需要自定包含哪些文件,不包含哪些文件。
<project>
[...]
<name>My Resources Plugin Practice Project</name>
[...]
<build>
[...]
<resources>
[...]
<resource>
<directory> src/my-resources </directory>
<includes>
<include> **/*.txt </include>
</inclues>
<excludes>
<exclude> **/*test*.* </exclude>
</excludes>
</resource>
Site插件
Site插件用于生成项目的站点。生成的站点中包含了项目的发布信息等。
Site插件包含六个目标:
site:deploy通过使用scp或者文件协议来生成由<distributionManagement>指定的站点。
site:attach-descriptor将站点描述符添加到要安装/发布的文件列表中。
site:site生成站点。
site:run开始建立站点,处理文档。
site:stage-deploy将生成的站点发布。
site:stage:生成站点。
可以通过使用mvn site命令来执行site构建周期。
site:deploy目标支持scp和文件协议。为了将生成的站点发布,首先需要指定将站点发布到什么地方。这可以通过distributionManagement来完成:
<project>
...
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-site-plugin</artifactId>
<distributionManagement>
<site>
<id>maven.apache.org</id>
<url>scp://maven.apache.org/deploy/path</url>
</site>
</distributionManagement>
...
</project>
然后在项目中执行site:deploy目标。
但是必须在执行这个目标前已经生成了一个站点。mvn site:deploy
如果需要生成站点同时发布,那么可以使用mvn site-deploy来完成。
Surefire插件
Surefire插件主要用于测试阶段,用于执行应用程序的单元测试。它以两种格式生成测试报告:
纯文本文件(*.txt)
XML文件(*.xml)
默认情况下,这些文件生成在${basedir}/target/surefire-reports目录中。
如果需要使用HTML格式的报告,可以使用
Surefire报告插件,这个插件可以生成TEST-*.xml文件(這些文件保存在${basedir}/target/surefire-reports目錄下),并將這些文件使用DOXIA生成Web界面版本的測試結果。具体内容请参考
Maven Surefire Report Plugin。
Surefire插件只有一个目标,那就是surefire:test,用于运行应用程序的单体测试。
该目标的必要参数为:
basedir:类型为文件,要测试的工程的基准目录。
classesDirectory:包含生成的类文件的目录。
testClassesDirectory:包含生成的测试类文件的目录。
testSourceDirectory:包含测试源代码的目录。
关于可选参数,请参考:
可以通过调用test构建阶段来运行Surefire插件。
mvn test
可以使用不同的测试框架来进行测试代码。例如
TestNG
JUnit(3.8或者4.x)
POJO
Verifier插件
对集成测试非常有用,用于检查特定条件是否存在。
verify:verify目标用于检查是否存在特定的文件和目录。可以使用正则表达式来检查。
必要的参数:
basedir:Project base directory (prepended for relative file paths).
failOnError:Whether the build will fail on verification errors. Default value is true.
verificationFile:The file containing the verifications to perform.
使用方法:
<project>
[...]
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-verifier-plugin</artifactId>
<configuration>
<verificationFile>src/test/verifier/verifications-test.xml</verificationFile>
</configuration>
<executions>
<execution>
<id>main</id>
<phase>verify</phase>
<goals>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
[...]
其中检查的文件的样例如下:
<verifications>
<files>
<file>
<location>src/main/resources/file1.txt</location>//是否存在
</file>
<file>
<location>src/main/resources/file2.txt</location>
<contains>aaaabbbb</contains>//file2.txt是否包含aaaabbbb
</file>
<file>
<location>src/main/resources/file3.txt</location>
<exists>false</exists>//是否不存在file3.txt
</file>
</files>
</verifications>
发表于 @ 2008年05月22日 15:03:28|编辑