1.前言
Maven,发音是[`meivin],"专家"的意思。它是一个很好的项目管理工具,很早就进入了我的必备工具行列,但是这次为了把project1项 目完全迁移并应用maven,所以对maven进行了一些深入的学习。写这个学习笔记的目的,一个是为了自己备忘,二则希望能够为其他人学习使用 maven 缩短一些时间。
2. maven概要
首先我把maven的概念快速的梳理一下,让我们快速地建立起一个比较精确的maven应用场景。
2.1 maven不是什么
读书时候要先限定范围,避免一些有害的遐想。要说maven不是什么,我们可以从如下几个要点来展开
- maven不是ant,也不是make。
我们以前接触的构建工具,需要写一些详细的步骤,比如: compile project1/src } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }4) 如果只想运行单个测试用例,能否实现?
可以,运行时候增加命令行参数 -Dtest=MyTest 即可,其中MyTest是所需要运行的单元测试用例名称,但是不需要包含package部分。
4.3 编译
1) 问:如何给插件指派参数?比如我要设置一些编译参数
答:以下内容设定编译器编译java1.5的代码
< project >
...
< build >
...
< plugins >
< plugin >
< artifactId > maven-compiler-plugin artifactId >
< configuration >
< source > 1.5 source >
< target > 1.5 target >
configuration >
plugin >
plugins >
...
build >
...
project >2) 问:我的目录是非标准的目录结构,如何设置让maven支持?
答:指定source目录和test-source目录即可。
< build >
< directory > target directory >
< sourceDirectory > src sourceDirectory >
< scriptSourceDirectory > js/scripts scriptSourceDirectory >
< testSourceDirectory > test testSourceDirectory >
< outputDirectory > bin outputDirectory >
< testOutputDirectory > bin testOutputDirectory >
build >3) 我源代码是UTF8格式的,我如何在maven中指定?
设置一个变量即可
< project >
...
< properties >
< project.build.sourceEncoding > UTF-8 project.build.sourceEncoding >
properties >
...
project >{code:xml}
... {code}maven-compiler-plugin UTF-8 . 问:我的项目除了main/java目录之外,还加了其他的c++目录,想要一并编译,如何做?
答:使用native插件,具体配置方法参考[http://mojo.codehaus.org/maven-native/native-maven-plugin/]{code:xml}
org.codehaus.mojo native-maven-plugin true . 问:我想要把工程的所有依赖的jar都一起打包,怎么办?
答:首先修改maven的配置文件,给maven-assembly-plugin增加一个jar-with-dependencies的描述。{code:xml}
[...] {code}maven-assembly-plugin jar-with-dependencies mvn assembly:assembly
. 问:我想把main/scripts中的内容一起打包发布,如何做?
答:在pom中配置额外的资源目录。如果需要的话,还可以指定资源目录的输出位置{code:xml}
... {code}true src/main/command run.bat run.sh /abc src/main/scripts . 问:我有多个源代码目录,但是maven只支持一个main src和一个test src,怎么办?
答:使用另外一个插件,并仿照如下配置pom{code:xml}
org.codehaus.mojo build-helper-maven-plugin 1.1 add-source generate-sources add-source . 问:我的源代码目录中有一部分文件我不想让maven编译,怎么做?
答:使用一个maven插件,然后使用includes和excludes。同理,也可以处理资源的过滤。{code:xml}
http://www.cnblogs.com/src/java com.sun.enterprise hk2-maven-plugin com/sun/logging/LogDomains.* com/sun/enterprise/util/OS.java com/sun/enterprise/util/io/FileUtils.java com/sun/enterprise/util/zip*.properties . 问:我的项目是一个纯的html组成的项目,没有任何的java代码,怎么跳过编译过程?
答:配置如下{code:xml}
src/java com.sun.enterprise hk2-maven-plugin . 问:我的工程里用hibernate,想在编译时候自动生成ddl,如何做?
答:添加插件hibernate3-maven-plugin
,按照如下配置:{code:xml}
org.codehaus.mojo hibernate3-maven-plugin 2.1 hbm2ddl annotationconfiguration hsqldb hsqldb ${hsqldb.version} . 问:我能用maven支持eclipse RCP项目吗?
答:当然可以,你可以使用插件 Tycho,详细内容可以参考这里[http://mattiasholmqvist.se/2010/02/building-with-tycho-part-1-osgi-bundles/ ].
org.sonatype.tycho target-platform-configuration 0.7.0 p2 4.4 ant互动
1) 如何在maven编译时候运行ant脚本?
使用专门的antrun插件,并且在target标签内部加入ant的代码
< plugin > < artifactId > maven-antrun-plugin artifactId > < version > 1.6 version > < executions > < execution > < phase > phase > < configuration > < target > target > configuration > < goals > < goal > run goal > goals > execution > executions > plugin >
2)如何在ant脚本中引用maven的classpath?
maven给每一个依赖都生成了一个属性,格式为"groupId:artifactId[:classifier]:type",比如,如果一下例子就显示依赖的org.apache.common-util的jar文件路径
< echo message ="Dependency JAR Path: ${org.apache:common-util:jar}" />
另外,maven还预定义了四个classpath的引用,他们是
- maven.compile.classpath
- maven.runtime.classpath
- maven.test.classpath
- maven.plugin.classpath
3)如何使用antrun插件运行外部的build文件?
很简单,直接在antrun里边使用ant指令即可,如下:
< plugin > < groupId > org.apache.maven.plugins groupId > < artifactId > maven-antrun-plugin artifactId > < version > 1.6 version > < executions > < execution > < id > compile id > < phase > compile phase > < configuration > < target > < property name ="compile_classpath" refid ="maven.compile.classpath" /> < property name ="runtime_classpath" refid ="maven.runtime.classpath" /> < property name ="test_classpath" refid ="maven.test.classpath" /> < property name ="plugin_classpath" refid ="maven.plugin.classpath" /> < ant antfile ="${basedir}/build.xml" > < target name ="test" /> ant > target > configuration > < goals > < goal > run goal > goals > execution > executions > plugin >
. 问:如何在ant中使用maven的功能?
答:使用ant的[maven task|http://maven.apache.org/ant-tasks/index.html],不过只有ant 1.6以上和jdk 1.5环境才支持。h4. 测试相关
. 问:如何忽略某个阶段的结果?比如单元测试不一定要全正确
答:给插件增加testFailureIgnore参数,并设置为false。如果要屏蔽该阶段,则用true {code:xml}
[...] {code}org.apache.maven.plugins maven-surefire-plugin true . 问:我如何在maven中加入PMD,CheckStyle,JDepend等检查功能?
答:加入PMD检查,以下代码如果在reporting
节点中加入则在mvn site
中执行,如果在build
节点中加入,则在build的时候自动运行检查。详细配置参考[pmd插件使用说明|http://maven.apache.org/plugins/maven-pmd-plugin/]{code:xml}
加入 checkstyle 检查,详细配置参考[checkstyle插件使用说明|http://maven.apache.org/plugins/maven- checkstyle-plugin/],同样注意放置在reporting和build节点中的区别(所有报表类插件都要同样注意):org.apache.maven.plugins maven-pmd-plugin 2.5 {code:xml}
加入 simian 的支持,simian是一个支持代码相似度检查的工具,目前有maven插件,也有checkstyle的插件。它不仅可以检查java,甚至可以支持文 本文件的检查。详细帮助信息参考[这里|http://www.redhillconsulting.com.au/products/simian /]。simian 的 maven插件在[这里|http://mojo.codehaus.org/simian-report-maven-plugin /introduction.html]org.apache.maven.plugins maven-checkstyle-plugin 2.5 {code:xml}
加入 jdepend 检查,详细配置参考[jdepend使用说明|http://mojo.codehaus.org/jdepend-maven-plugin/],org.codehaus.mojo simian-maven-plugin 1.6.1 {code:xml}
加入 findbugz 检查,详细配置参考[findbugz使用说明|http://mojo.codehaus.org/findbugs-maven-plugin/usage.html],org.codehaus.mojo jdepend-maven-plugin 2.0-beta-2 {code:xml}
加入javadoc生成,详细配置参考[javadoc usage|http://maven.apache.org/plugins/maven-javadoc-plugin/usage.html]org.codehaus.mojo findbugs-maven-plugin 2.0.1 {code:xml}
加入 jxr 支持,JXR是一个生成java代码交叉引用和源代码的html格式的工具,详细配置信息参考[jxr usage|http://maven.apache.org/plugins/maven-jxr-plugin/]。注意,jxr没有必要在build阶段运行。org.apache.maven.plugins maven-javadoc-plugin 2.7 ... {code:xml}
加入 Cobertura 支持,它是一个代码覆盖率工具,可以用来评估具有相应测试的源代码的比率。详细帮助在[这里|http://mojo.codehaus.org /cobertura-maven-plugin/index.html]。另外一个功能相似的软件是[EMMA|http: //emma.sourceforge.net/samples.html],详细的帮助在[这里|http://mojo.codehaus.org /emma-maven-plugin/usage.html]。两个产品的比较文章在[这里|http://www.topcoder.com /tc?module=Static&d1=features&d2=030107],个人倾向于都要用,因为给出的指标不一样,都有参 考作用。org.apache.maven.plugins maven-jxr-plugin 2.1 {code:xml|title=Cobertura }
org.codehaus.mojo cobertura-maven-plugin 2.4 85 85 true 85 85 85 85 com.example.reallyimportant.* 90 80 com.example.boringcode.* 40 30 clean check {code:xml|title=EMMA}
添加 javaNCSS 插件,它是一个java代码的度量工具,详细参考在[这里|http://mojo.codehaus.org/javancss-maven-plugin/]。... {code}... ...org.codehaus.mojo emma-maven-plugin 1.0-alpha-3-SNAPSHOT {code:xml}
h4. profile相关org.codehaus.mojo javancss-maven-plugin 2.0-beta-2 . 问:profile能够设置为某个变量不存在的条件下激活?
答:使用!前缀,请看示例:{code:xml}
h4. 部署相关!environment.type . 问:其他部署到服务器的方式和配置怎么配?
答:本文摘自 [http://blog.csdn.net/zyxnetxz/archive/2009/05/18/4199348.aspx]{panel} *Distribution Management* 用于配置分发管理,配置相应的产品发布信息,主要用于发布,在执行mvn deploy后表示要发布的位置 *# 配置到文件系统{code:xml}
*# 使用ssh2配置proficio-repository Proficio Repository file://${basedir}/target/deploy {code} {code:xml}
*# 使用sftp配置proficio-repository Proficio Repository scp://sshserver.yourcompany.com/deploy {code} {code:xml}
*# 使用外在的ssh配置编译扩展用于指定使用wagon外在ssh提供,用于提供你的文件到相应的远程服务器。proficio-repositoryi Proficio Repository sftp://ftpserver.yourcompany.com/deploy {code} {code:xml}
*# 使用ftp配置proficio-repository Proficio Repository scpexe://sshserver.yourcompany.com/deploy org.apache.maven.wagon wagon-ssh-external 1.0-alpha-6 {code} {code:xml}
{panel} h4. 插件配置proficio-repository Proficio Repository ftp://ftpserver.yourcompany.com/deploy org.apache.maven.wagongroupId> wagon-ftpartifactId> 1.0-alpha-6version> {code} . 问:我用maven输出site,如何设置输出为utf8编码?
答: 配置site插件的编码设置{code:xml} ...
org.apache.maven.plugins maven-site-plugin 2.0-beta-6 UTF-8