Maven系列之附录A-maven插件配置

来源:互联网 发布:零基础学php要多久 编辑:程序博客网 时间:2024/06/05 02:30

经过一段时间的研究,对Maven也有了一定的认识,算是对Maven初级入门。

多少次,多么希望将以前的项目逐个转换为Maven项目,这对日后搭建新的Maven项目,都是非常好的。因为,这也算是对知识的一种自我积累和沉淀,分享一些积累和沉淀,未尝也不是一件好事。

我非常喜欢插件plugin,本文重点介绍一些常用的插件。这些插件恐怕是在搭建新工程时,必备的或者需要优先考虑的。

在pom.xml文件中,插件位于标签project---->build---->plugins下,封装在plugin中。正常情况下,每一个plugin都需要声明groupId、artifactId、version,然后加上需要的配置configuration或者插件定义好的执行项executions。

maven-compiler-plugin

指定JDK版本、编码格式

编译时,采用统一的JDK版本进行编译,统一的编码格式,这是一个约定,放到你的项目中,避免很多事情。

maven-compiler-plugin,编译插件,编译时,指定JDK编译版本,编码格式,方式如下:

<project><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><jdk.version>1.6</jdk.version></properties>...<build><plugins><plugin><!-- 编译时:JDK版本、编码格式 --><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>${jdk.version}</source><target>${jdk.version}</target><encoding>${project.build.sourceEncoding}</encoding></configuration></plugin></plugins></build>...<project>

properties下是一些自定义的配置信息。

gruopId不写时默认为org.apache.maven.plugins,这个groupId已经在Maven的超级pom中定义,还定义了版本version。也就是说,对于org.apache.maven.plugins下的插件,可以只提供artifactId,不用提供groupId和version。当然,提供也没有问题。

参考网址:http://maven.apache.org/plugins/maven-compiler-plugin/examples/set-compiler-source-and-target.html

maven-resources-plugin

指定资源文件编码格式

资源文件,是不需要编译的,按照约定,其通常位于src/main/resources和src/test/resources下,一般包括xml文件和properties文件。这部分文件也是需要指定文件编码格式的。

maven-resources-plugin,资源文件插件,下面是指定资源文件的编码格式:

<plugin><!-- 指定资源文件编码格式 --><groupId>org.apache.maven.plugins</groupId><artifactId>maven-resources-plugin</artifactId><configuration><encoding>${project.build.sourceEncoding}</encoding></configuration></plugin>

注意${project.build.sourceEncoding},此处没有提供properties和pom文件的结构,想必大家都是明白人。

参考网址:http://maven.apache.org/plugins/maven-resources-plugin/examples/encoding.html

maven-surefire-plugin

跳过单元测试

在使用mvn install命令时,如果你不希望执行test单元测试,有一个插件可以做到,那就是maven-surefire-plugin。

<plugin><!-- skip test --><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><configuration><skip>true</skip></configuration></plugin>

在《Maven实战》中,也专门讲到了这个,可编译但不执行单元测试代码,也可既不编译也不执行单元测试代码,有兴趣的可以研究下。

在该书中,还讲到,不建议这么做。因为单元测试很重要,如果非要跳过,建议执行mvn install skiptest,这样也能达到同样的效果。

maven-source-plugin

生成source.jar

在日常开发中,我们的工程,除了需要借助Maven下载依赖的jar包外,有时,为了调试方便,我们也希望下载对应的source.jar和javadoc.jar。

这个是可以的,别告诉我你不会,或者不想。不用Google或者百度,在Eclipse中,进入Windows->Perference->Maven,众里寻他千百度,蓦然回首,设置却在灯火阑珊处。

那么,我们有没有想过,我们在发布jar包的时候,是否可以同时发布source.jar和javadoc.jar呢?答案当然是可以了。先看看source.jar:

<plugin><!-- source jar --><groupId>org.apache.maven.plugins</groupId><artifactId>maven-source-plugin</artifactId><executions><execution><id>attach-sources</id><phase>verify</phase><goals><goal>jar-no-fork</goal></goals></execution></executions></plugin>

maven-javadoc-plugin

生成Javadoc.jar

下面是javadoc.jar:

<plugin><!-- Javadoc jar --><groupId>org.apache.maven.plugins</groupId><artifactId>maven-javadoc-plugin</artifactId><executions><execution><id>attach-javadocs</id><goals><goal>jar</goal></goals></execution></executions></plugin>

无论是source.jar还是javadoc.jar,其产生的实质还是通过插件调用JDK的命令(如javadoc)来生成对应的jar包。通过mvn clean install或者mvn install命令,在本地仓库生成*.jar的同时,你会发现也生成了*-source.jar和*-javadoc.jar。都到本地仓库了,那到远程仓库也是一样的,来个mvn clean deploy或者mvn deploy,自己去远程仓库查看下吧。

不得不说,这两个,我非常喜欢,如果涉及到源代码的版权,或者公司不想公布源代码,那你得注意了,生成javadoc.jar也是不错的。

参考网址:http://maven.apache.org/plugin-developers/cookbook/attach-source-javadoc-artifacts.html

maven-jar-plugin

MANIFEST.MF文件加入时间戳

执行mvn install后,jar包中会带上一个MANIFEST.MF文件,位于jar包下的META-INF文件下中。一般MANIFEST.MF文件内容如下:

Manifest-Version: 1.0Archiver-Version: Plexus ArchiverCreated-By: Apache MavenBuilt-By: LewisBuild-Jdk: 1.6.0_32

这是默认的MANIFEST.MF,事实上,可通过maven-jar-plugin插件在MANIFEST.MF文件中加入一些其他信息,比如Build At等。

<properties><maven.build.timestamp.format>yyyy-MM-dd HH:mm:ss.SSS</maven.build.timestamp.format></properties>...<plugin><!-- 定制MANIFEST.MF信息 --><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><configuration><archive><manifest><addDefaultImplementationEntries>true</addDefaultImplementationEntries><addDefaultSpecificationEntries>true</addDefaultSpecificationEntries></manifest><manifestEntries><Built-At>${maven.build.timestamp}</Built-At></manifestEntries></archive></configuration></plugin>

${maven.build.timestamp}不需要在properties中定义,这个应该是超级pom定义了,默认是long型时间戳,如果需要展示年月日时分秒等信息,需要在properties中定义maven.build.timestamp.format,这个format格式来自于Java。

通过上面的插件,再检查下MANIFEST.MF文件,应该多了点东东。

参考网址:http://my.oschina.net/zhanglubing/blog/95181

MANIFEST.MF文件加入SCM Build Number

研究这个插件,也是被逼的,开发说他提交代码了,可发布到UAT,BUG依旧,开发把问题推给hudson,说自动打包有问题。

maven + hudson + nexus + scm(svn/git/...)做自动化集成,这恐怕是天经地义的。为找出问题,我想,可否在MANIFEST.MF中加入svn的build number呢,如果可以,当再遇到上述问题时,检查build number,这样,谁都不冤枉。

<plugin><!-- 定制MANIFEST.MF信息 --><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><configuration><archive><manifestEntries><SCM-Revision>${buildNumber}</SCM-Revision></manifestEntries></archive></configuration></plugin><plugin><!-- MANIFEST.MF加入版本号 --><groupId>org.codehaus.mojo</groupId><artifactId>buildnumber-maven-plugin</artifactId><executions><execution><phase>validate</phase><goals><goal>create</goal></goals></execution></executions><configuration><!-- Default: false,若设置为true,会检查文件是否修改,若有修改,则构建失败 --><doCheck>false</doCheck><!-- Default: false,若设置为true,版本号会更新为最新,否则会保持为本地值 --><doUpdate>true</doUpdate><!-- Default: false,若设置为true,在多模块的项目中,只会从SCM获取一次版本号 --><getRevisionOnlyOnce>true</getRevisionOnlyOnce></configuration></plugin>

其中,为获取${buildNumber}信息,需要在pom中加入scm信息。

<scm><connection>scm:svn:svn://username:password@svnUrl</connection><url>svn://username:password@svnUrl</url></scm>

参考网址:http://maven.apache.org/plugin-developers/cookbook/add-svn-revision-to-manifest.html

可执行的jar

老实说,做一个可执行的jar,这个早过时了,现在谁还用这个呢?如果你确实需要,那就来吧。

<plugin><!-- 可执行的jar --><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><configuration><archive><manifest><addClasspath>true</addClasspath><classpathPrefix>lib/</classpathPrefix><mainClass>com.lewis.test.TestClass</mainClass></manifest></archive></configuration></plugin>

这个比较简单。

写在最后

我想说,其实项目中,我们常用的插件还有很多,不可能都一一记住,那么,在需要的时候,请查阅:

  • Maven插件中心网址:http://maven.apache.org/plugins/index.html
  • Maven Plugins Cookbook:http://maven.apache.org/plugin-developers/cookbook/index.html
0 0
原创粉丝点击