转自:http://www.oschina.net/question/158170_29368css
Maven,发音是[`meivin],"专家"的 意思。它是一个很好的项目管理工具,很早就进入了个人必备工具行列,可是此次为了把project1项目彻底迁移并应用maven,因此对maven进行 了一些深刻的学习。写这个学习笔记的目的,一个是为了本身备忘,二则但愿可以为其余人学习使用maven 缩短一些时间。html
首先我把maven的概念快速的梳理一下,让咱们快速地创建起一个比较精确的maven应用场景。java
读书时候要先限定范围,避免一些有害的遐想。要说maven不是什么,咱们能够从以下几个要点来展开mysql
maven将本身定位为一个项目管理工具。它负责管理项目开发过程当中的几乎全部的东西:linux
maven把项目的构建划分为不一样的生命周期(lifecycle),在我看来,划分的已是很是仔细了,你们能够参考这里 。粗略一点的话,它这个过程(phase)包括:编译、测试、打包、集成测试、验证、部署。maven中全部的执行动做(goal)都须要指明本身在这个过程当中的执行位置,而后maven执行的时候,就依照过程的发展依次调用这些goal进行各类处理。c++
这个也是maven的一个基本调度机制。通常来讲,位置稍后的过程都会依赖于以前的过程。固然,maven一样提供了配置文件,能够依照用户要求,跳过某些阶段。web
所谓的"约定优于配置",在maven中并非彻底不能够修改的,他们只是一些配置的默认值而已。可是使用者除非必要,并不须要去修改那些约定内容。maven默认的文件存放结构以下:算法
每个阶段的任务都知道怎么正确完成本身的工做,好比compile任务就知道从src/main/java下编译全部的java文件,并把它的输出class文件存放到target/classes中。spring
对maven来讲,采用"约定优于配置"的策略能够减小修改配置的工做量,也能够下降学习成本,更重要的是,给项目引入了统一的规范。sql
maven使用以下几个要素来惟必定位某一个输出物: groupId:artifactId:packaging:version 。好比 org.springframework:spring:2.5 。每一个部分的解释以下:
maven有本身的版本规范,通常是以下定义 <major version>.<minor version>.<incremental version>-<qualifier> ,好比1.2.3-beta-01。要说明的是,maven本身判断版本的算法是major,minor,incremental部分用数字比 较,qualifier部分用字符串比较,因此要当心 alpha-2和alpha-15的比较关系,最好用 alpha-02的格式。
maven在版本管理时候可使用几个特殊的字符串 SNAPSHOT ,LATEST ,RELEASE 。好比"1.0-SNAPSHOT"。各个部分的含义和处理逻辑以下说明:
maven把整个maven管理的项目分为几个部分,一个部分是源代码,包括源代码自己、相关的各类资源,一个部分则是单元测试用例,另一部分则是各类maven的插件。对于这几个部分,maven能够独立管理他们,包括各类外部依赖关系。
依赖管理通常是最吸引人使用maven的功能特性了,这个特性让开发者只须要关注代码的直接依赖,好比咱们用了spring,就加入spring依赖说明就能够了,至于spring本身还依赖哪些外部的东西,maven帮咱们搞定。
任意一个外部依赖说明包含以下几个要素:groupId, artifactId, version, scope, type, optional。其中前3个是必须的,各自含义以下:
maven认为,程序对外部的依赖会随着程序的所处阶段和应用场景而变化,因此maven中的依赖关系有做用域(scope)的限制。在maven中,scope包含以下的取值:
另外,代码有代码本身的依赖,各个maven使用的插件也能够有本身的依赖关系。依赖也能够是可选的,好比咱们代码中没有任何cache依赖,可是hibernate可能要配置cache,因此该cache的依赖就是可选的。
maven的多项目管理也是很是强大的。通常来讲,maven要求同一个工程的全部子项目都放置到同一个目录下,每个子目录表明一个项目,好比
按照这种格式存放,就是继承方式,全部具体子项目的pom.xml都会继承总项目pom的内容,取值为子项目pom内容优先。
要设置继承方式,首先要在总项目的pom中加入以下配置
其次在每一个子项目中加入
便可。
固然,继承不是惟一的配置文件共用方式,maven还支持引用方式。引用pom的方式更简单,在依赖中加入一个type为pom的依赖便可。
用户能够在maven中定义一些属性,而后在其余地方用${xxx}进行引用。好比:
maven提供了三个隐式的变量,用来访问系统环境变量、POM信息和maven的settings:
profile 是maven的一个重要特性,它可让maven可以自动适应外部的环境变化,好比同一个项目,在linux下编译linux的版本,在win下编译 win的版本等。一个项目能够设置多个profile,也能够在同一时间设置多个profile被激活(active)的。自动激活的 profile的条件能够是各类各样的设定条件,组合放置在activation节点中,也能够经过命令行直接指定。profile包含的其余配置内容可 以覆盖掉pom定义的相应值。若是认为profile设置比较复杂,能够将全部的profiles内容移动到专门的 profiles.xml 文件中,不过记得和pom.xml放在一块儿。
activation节点中的激活条件中常见的有以下几个:
maven的操做有两种方式,一种是经过mvn命令行命令,一种是使用maven的eclipse插件。由于使用eclipse的maven插件操做起来比较容易,这里就只介绍使用mvn命令行的操做。
maven 的主执行程序为mvn.bat,linux下为mvn.sh,这两个程序都很简单,它们的共同用途就是收集一些参数,而后用 java.exe来运行maven的Main函数。maven一样须要有配置文件,名字叫作settings.xml,它放在两个地方,一个是maven 安装目录的conf目录下,对全部使用该maven的用户都起做用,咱们称为主配置文件,另一个放在 %USERPROFILE%/.m2/settings.xml下,咱们成为用户配置文件,只对当前用户有效,且能够覆盖主配置文件的参数内容。还有就是 项目级别的配置信息了,它存放在每个maven管理的项目目录下,叫pom.xml,主要用于配置项目相关的一些内容,固然,若是有必要,用户也能够在 pom中写一些配置,覆盖住配置文件和用户配置文件的设置参数内容。
通常来讲,settings文件配置的是好比repository库路径之类的全局信息,具体能够参考官方网站的文章 。
要建立一个新的maven工程,咱们须要给咱们的工程指定几个必要的要素,就是maven产品坐标的几个要素:groupId, artifactId,若是愿意,你也能够指定version和package名称。咱们先看一个简单的建立命令:
d:\work\temp>mvn archetype:create -DgroupId=com.abc -DartifactId=product1 -DarchetypeArtifactId=maven-archetype-webapp
首先看这里的命令行参数的传递结构,怪异的 -D参数=值 的方式是 java.exe 要求的方式。这个命令建立一个web工程,目录结构是一个标准的maven结构,以下:
你们要注意,这里目录结构的布局其实是由参数 archetypeArtifactId 来决定的,由于这里传入的是 maven-archetype-webapp 若是咱们传入其余的就会建立不一样的结构,默认值为 maven-archetype-quickstart ,有兴趣的读者能够参考更详细的列表 ,我把部分经常使用的列表在这里:
Artifact | Group | Version | Repository | Description |
---|---|---|---|---|
maven-archetype-j2ee-simple | org.apache.maven.archetypes | A simple J2EE Java application | ||
maven-archetype-marmalade-mojo | org.apache.maven.archetypes | A Maven plugin development project using marmalade | ||
maven-archetype-plugin | org.apache.maven.archetypes | A Maven Java plugin development project | ||
maven-archetype-portlet | org.apache.maven.archetypes | A simple portlet application | ||
maven-archetype-profiles | org.apache.maven.archetypes | |||
maven-archetype-quickstart | org.apache.maven.archetypes | |||
maven-archetype-simple | org.apache.maven.archetypes | |||
maven-archetype-site-simple | org.apache.maven.archetypes | A simple site generation project | ||
maven-archetype-site | org.apache.maven.archetypes | A more complex site project | ||
maven-archetype-webapp | org.apache.maven.archetypes | A simple Java web application | ||
maven-archetype-har | net.sf.maven-har | 0.9 | Hibernate Archive | |
maven-archetype-sar | net.sf.maven-sar | 0.9 | JBoss Service Archive |
你们能够参考更详细的 archetype:create 帮助 和 archtype参考信息 。
多项目管理是maven的主要特点之一,对于一个大型工程,用maven来管理他们之间复杂的依赖关系,是再好不过了。maven的项目配置之间的关系有两种:继承关系和引用关系。
maven默认根据目录结构来设定pom的继承关系,即下级目录的pom默认继承上级目录的pom。要设定二者之间的关系很简单,上级pom以下设置:
要记住的是,这里的module是目录名,不是子工程的artifactId。子工程以下设置:
这样二者就相互关联起来了,继承关系就设定完毕,全部父工程的配置内容都会自动在子工程中生效,除非子工程有相同的配置覆盖。若是你不喜欢层层递进的目录结构来实现继承,也能够在parent中加入 <relativePath>../a-parent/pom.xml</relativePath> 来制定parent项目的相对目录。继承关系一般用在项目共同特性的抽取上,经过抽取公共特性,能够大幅度减小子项目的配置工做量。
引用关系是另一种复用的方式,maven中配置引用关系也很简单,加入一个 type 为 pom 的依赖便可。
可是不管是父项目仍是引用项目,这些工程都必须用 mvn install 或者 mvn deploy 安装到本地库才行,不然会报告依赖没有找到,eclipse编译时候也会出错。
须要特别提出的是复用过程当中,父项目的pom中能够定义 dependencyManagement 节点,其中存放依赖关系,可是这个依赖关系只是定义,不会真的产生效果,若是子项目想要使用这个依赖关系,能够在自己的 dependency 中添加一个简化的引用
这种方法能够避免版本号满天飞的状况。
在maven中通常都会用到安装库文件的功能,一则是咱们经常使用的hibernate要使用jmx库,可是由于sun的license限制,因此没法将其直接包含在repository中。因此咱们使用mvn命令把jar安装到咱们本地的repository中
mvn install:install-file -DgroupId=com.sun.jdmk -DartifactId=jmxtools -Dversion=1.2.1 -Dpackaging=jar -Dfile=/path/to/file
若是咱们想把它安装到公司的repository中,须要使用命令
mvn deploy:deploy-file -DgroupId=com.sun.jdmk -DartifactId=jmxtools -Dversion=1.2.1 -Dpackaging=jar -Dfile=/path/to/file -Durl=http://xxx.ss.com/sss.xxx -DrepositoryId=release-repo
对于咱们的工程输出,若是须要放置到公司的repository中的话,能够经过配置pom来实现
这里使用的scp方式提交库文件,还有其余方式可使用,请参考faq部分。而后记得在你的settings.xml中加入这一内容
maven定义了不少变量属性,参考这里 http://docs.codehaus.org/display/MAVENUSER/MavenPropertiesGuide
咱们已经知道maven预约义了许多的阶段(phase),每一个插件都依附于这些阶段,而且在进入某个阶段的时候,调用运行这些相关插件的功能。咱们先来看完整的maven生命周期:
生命周期 | 阶段描述 |
---|---|
validate | 验证项目是否正确,以及全部为了完整构建必要的信息是否可用 |
generate-sources | 生成全部须要包含在编译过程当中的源代码 |
process-sources | 处理源代码,好比过滤一些值 |
generate-resources | 生成全部须要包含在打包过程当中的资源文件 |
process-resources | 复制并处理资源文件至目标目录,准备打包 |
compile | 编译项目的源代码 |
process-classes | 后处理编译生成的文件,例如对Java类进行字节码加强(bytecode enhancement) |
generate-test-sources | 生成全部包含在测试编译过程当中的测试源码 |
process-test-sources | 处理测试源码,好比过滤一些值 |
generate-test-resources | 生成测试须要的资源文件 |
process-test-resources | 复制并处理测试资源文件至测试目标目录 |
test-compile | 编译测试源码至测试目标目录 |
test | 使用合适的单元测试框架运行测试。这些测试应该不须要代码被打包或发布 |
prepare-package | 在真正的打包以前,执行一些准备打包必要的操做。这一般会产生一个包的展开的处理过的版本(将会在Maven 2.1+中实现) |
package | 将编译好的代码打包成可分发的格式,如JAR,WAR,或者EAR |
pre-integration-test | 执行一些在集成测试运行以前须要的动做。如创建集成测试须要的环境 |
integration-test | 若是有必要的话,处理包并发布至集成测试能够运行的环境 |
post-integration-test | 执行一些在集成测试运行以后须要的动做。如清理集成测试环境。 |
verify | 执行全部检查,验证包是有效的,符合质量规范 |
install | 安装包至本地仓库,以备本地的其它项目做为依赖使用 |
deploy | 复制最终的包至远程仓库,共享给其它开发人员和项目(一般和一次正式的发布相关) |
maven核心的插件列表能够参考 http://maven.apache.org/plugins/index.html 。这里仅列举几个经常使用的插件及其配置参数:
除了如下的几个faq条目以外,还有一些faq能够参考
兄弟们若是有其余问题,欢迎跟帖提问!
答:直接在pom文件中加入一个dependency节点,若是要删除依赖,把对应的dependency节点删除便可。
答:设置exclusion便可。
答:加入一个特殊的依赖关系,使用system类型,以下:
可是要记住,发布的时候不会复制这个jar。须要手工配置,并且其余project依赖这个project的时候,会报告警告。若是没有特殊要求,建议直接注册发布到repository。
答:在project属性中去掉java build path中对其余 project 的依赖关系,直接在pom中设置依赖关系便可
答:使用 assembly 插件便可。
答:maven自己在发布的时候,能够发布单纯的jar,也能够同时发布xxx-tests.jar和xxx-javadoc.jar(你们常常在repository中能够看到相似的东西)。咱们本身的项目A要同时输出test.jar能够作以下的设置
修改pom.xml文件,将旧版jar的依赖内容中的版本直接修改成新版本便可。
将依赖的文件安装到本地库,用以下命令能够完成:
mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> -DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging> -DgeneratePom=true Where: <path-to-file> the path to the file to load <group-id> the group that the file should be registered under <artifact-id> the artifact name for the file <version> the version of the file <packaging> the packaging of the file e.g. jar
答:使用资源过滤功能,好比:
答: maven-svn-revision-number-plugin 能够从 SVN 中获取版本号,并将其变成环境变量,交由其余插件或者profile使用,详细帮助在这里 。通常和resource的filter机制同时使用
这段代码负责把resource文件中的内容替换成适当内容
有好几种方法均可以实现跳过单元测试步骤,一种是给mvn增长命令行参数 -Dmaven.test.skip=true 或者 -DskipTests=true ;另一种是给surefire插件增长参数,以下:
<project> [...] <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.8</version> <configuration> <skipTests>true</skipTests> </configuration> </plugin> </plugins> </build> [...]</project>
能够,运行时候增长命令行参数 -Dtest=MyTest 便可,其中MyTest是所须要运行的单元测试用例名称,可是不须要包含package部分。
答:如下内容设定编译器编译java1.5的代码
要设置其余插件的参数也能够,请参考对应插件的帮助信息
答:指定source目录和test-source目录便可。
这个例子把源代码设置成了src目录,测试代码在test目录,因此输出到bin目录。这里要注意,directory若是也设置成bin目录的 话,maven打包的时候会引发死循环,由于directory是全部工做存放的地方,默认包含outputDirectory定义的目录在内。
设置一个变量便可
{color:blue}以上是官方给出的解决方案,可是通过尝试这样只能影响到resource处理时候的编码{color},真正有用的是以下配置:
{code:xml} <build> ... <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <encoding>UTF-8</encoding> </configuration> </plugin> ... </build> {code}
答:使用native插件,具体配置方法参考[http://mojo.codehaus.org/maven-native/native-maven-plugin/]
{code:xml} <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>native-maven-plugin</artifactId> <extensions>true</extensions> <configuration> </plugin> {code}
答:首先修改maven的配置文件,给maven-assembly-plugin增长一个jar-with-dependencies的描述。
{code:xml} <project> [...] <build> <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> </plugin> </plugins> </build> [...] </project> {code}
而后使用命令打包便可:
mvn assembly:assembly
答:在pom中配置额外的资源目录。若是须要的话,还能够指定资源目录的输出位置
{code:xml} <build> ... <resources> <resource> <filtering>true</filtering> <directory>src/main/command</directory> <includes> <include>run.bat</include> <include>run.sh</include> </includes> <targetPath>/abc</targetPath> </resource> <resource> <directory>src/main/scripts</directory> </resource> </resources> ... </build> {code}
答:使用另一个插件,并仿照以下配置pom
{code:xml} <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>build-helper-maven-plugin</artifactId> <version>1.1</version> <executions> <execution> <id>add-source</id> <phase>generate-sources</phase> <goals> <goal>add-source</goal> </goals> <configuration> <sources> <source>src/config/java</source> <source>src/main/java</source> <source>src/member/java</source> </sources> </configuration> </execution> </executions> </plugin> {code}
答:使用一个maven插件,而后使用includes和excludes。同理,也能够处理资源的过滤。
{code:xml} <build> <sourceDirectory>http://www.cnblogs.com/src/java</sourceDirectory> <plugins> <plugin> <groupId>com.sun.enterprise</groupId> <artifactId>hk2-maven-plugin</artifactId> <configuration> <includes> <include>com/sun/logging/LogDomains.*</include> <include>com/sun/enterprise/util/OS.java</include> <include>com/sun/enterprise/util/io/FileUtils.java</include> <include>com/sun/enterprise/util/zip/**</include> <include>com/sun/enterprise/util/i18n/**</include> <include>com/sun/enterprise/deployment/backend/IASDeploymentException.java</include> </includes> <excludes> <exclude>com/sun/enterprise/config/ConfigBeansFactory.java</exclude> <exclude>com/sun/enterprise/config/clientbeans/**</exclude> </excludes> </configuration> </plugin> </plugins> <resources> <resource> <directory>http://www.cnblogs.com/src/java</directory> <includes> <include>**/*.properties</include> </includes> </resource> </resources> </build> {code}
答:配置以下
{code:xml} <build> <sourceDirectory>src/java</sourceDirectory> <plugins> <plugin> <groupId>com.sun.enterprise</groupId> <artifactId>hk2-maven-plugin</artifactId> </plugin> </plugins> </build> {code}
答:添加插件
hibernate3-maven-plugin
,按照以下配置:
{code:xml} <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>hibernate3-maven-plugin</artifactId> <version>2.1</version> <configuration> <components> <component> <name>hbm2ddl</name> <implementation>annotationconfiguration</implementation> </component> </components> </configuration> <dependencies> <dependency> <groupId>hsqldb</groupId> <artifactId>hsqldb</artifactId> <version>${hsqldb.version}</version> </dependency> </dependencies> </plugin> {code}
答:固然能够,你可使用插件 Tycho,详细内容能够参考这里[http://mattiasholmqvist.se/2010/02/building-with-tycho-part-1-osgi-bundles/].
<plugin> <groupid>org.sonatype.tycho</groupid> <artifactid>target-platform-configuration</artifactid> <version>0.7.0</version> <configuration> <resolver>p2</resolver> </configuration> </plugin> 另外,老牌的pde-maven-plugin就不要用了,已经好几年没见更新了。
使用专门的antrun插件,而且在target标签内部加入ant的代码
<plugin> <artifactId>maven-antrun-plugin</artifactId> <version>1.6</version> <executions> <execution> <phase> <!-- 生命周期阶段 --> </phase> <configuration> <target> <!-- 加入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的引用,他们是
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> <!-- 同时传递内置的classpath给外部ant文件 --> <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 task|http://maven.apache.org/ant-tasks/index.html],不过只有ant 1.6以上和jdk 1.5环境才支持。
答:给插件增长testFailureIgnore参数,并设置为false。若是要屏蔽该阶段,则用
<skip>true</skip>
{code:xml} <project> [...] <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <testFailureIgnore>true</testFailureIgnore> </configuration> </plugin> </plugins> </build> [...] </project> {code}
答:加入PMD检查,如下代码若是在
reporting
节点中加入则在
mvn site
中执行,若是在
build
节点中加入,则在build的时候自动运行检查。详细配置参考[pmd插件使用说明|http://maven.apache.org/plugins/maven-pmd-plugin/]
{code:xml} <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-pmd-plugin</artifactId> <version>2.5</version> </plugin> </plugins> {code}
加入 checkstyle 检查,详细配置参考[checkstyle插件使用说明|http://maven.apache.org/plugins/maven- checkstyle-plugin/],一样注意放置在reporting和build节点中的区别(全部报表类插件都要一样注意):
{code:xml} <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-checkstyle-plugin</artifactId> <version>2.5</version> </plugin> {code}
加入 simian 的支持,simian是一个支持代码类似度检查的工具,目前有maven插件,也有checkstyle的插件。它不只能够检查java,甚至能够支持文 本文件的检查。详细帮助信息参考[这里|http://www.redhillconsulting.com.au/products/simian /]。simian 的 maven插件在[这里|http://mojo.codehaus.org/simian-report-maven-plugin /introduction.html]
{code:xml} <build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>simian-maven-plugin</artifactId> <version>1.6.1</version> </plugin> </plugins> ... </build> {code}
加入 jdepend 检查,详细配置参考[jdepend使用说明|http://mojo.codehaus.org/jdepend-maven-plugin/],
{code:xml} <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>jdepend-maven-plugin</artifactId> <version>2.0-beta-2</version> </plugin> {code}
加入 findbugz 检查,详细配置参考[findbugz使用说明|http://mojo.codehaus.org/findbugs-maven-plugin/usage.html],
{code:xml} <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>findbugs-maven-plugin</artifactId> <version>2.0.1</version> </plugin> {code}
加入javadoc生成,详细配置参考[javadoc usage|http://maven.apache.org/plugins/maven-javadoc-plugin/usage.html]
{code:xml} <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javadoc-plugin</artifactId> <version>2.7</version> <configuration> ... </configuration> </plugin> {code}
加入 jxr 支持,JXR是一个生成java代码交叉引用和源代码的html格式的工具,详细配置信息参考[jxr usage|http://maven.apache.org/plugins/maven-jxr-plugin/]。注意,jxr没有必要在 build阶段运行。
{code:xml} <reporting> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jxr-plugin</artifactId> <version>2.1</version> </plugin> </plugins> </reporting> {code}
加入 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],我的倾向于都要用,由于给出的指标不同,都有参 考做用。
{code:xml|title=Cobertura } <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>cobertura-maven-plugin</artifactId> <version>2.4</version> <configuration> <check> <branchRate>85</branchRate> <lineRate>85</lineRate> <haltOnFailure>true</haltOnFailure> <totalBranchRate>85</totalBranchRate> <totalLineRate>85</totalLineRate> <packageLineRate>85</packageLineRate> <packageBranchRate>85</packageBranchRate> <regexes> <regex> <pattern>com.example.reallyimportant.*</pattern> <branchRate>90</branchRate> <lineRate>80</lineRate> </regex> <regex> <pattern>com.example.boringcode.*</pattern> <branchRate>40</branchRate> <lineRate>30</lineRate> </regex> </regexes> </check> </configuration> <executions> <execution> <goals> <goal>clean</goal> <goal>check</goal> </goals> </execution> </executions> </plugin> {code}
{code:xml|title=EMMA} <reporting> ... <plugins> ... <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>emma-maven-plugin</artifactId> <version>1.0-alpha-3-SNAPSHOT</version> </plugin> ... </plugins> ... </reporting> {code}
添加 javaNCSS 插件,它是一个java代码的度量工具,详细参考在[这里|http://mojo.codehaus.org/javancss-maven-plugin/]。
{code:xml} <reporting> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>javancss-maven-plugin</artifactId> <version>2.0-beta-2</version> </plugin> </plugins> </reporting> {code}
h4. profile相关
答:使用!前缀,请看示例:
{code:xml} <activation> <property> <name>!environment.type</name> </property> </activation> {code}
h4. 部署相关
答:本文摘自 [http://blog.csdn.net/zyxnetxz/archive/2009/05/18/4199348.aspx]{panel} *Distribution Management* 用于配置分发管理,配置相应的产品发布信息,主要用于发布,在执行mvn deploy后表示要发布的位置 *# 配置到文件系统
{code:xml} <distributionManagement> <repository> <id>proficio-repository<id> <name>Proficio Repository<name> <url>file://${basedir}/target/deploy<url> <repository> <distributionManagement> {code}
*# 使用ssh2配置
{code:xml} <distributionManagement> <repository> <id>proficio-repository<id> <name>Proficio Repository<name> <url>scp://sshserver.yourcompany.com/deploy<url> <repository> <distributionManagement> {code}
*# 使用sftp配置
{code:xml} <distributionManagement> <repository> <id>proficio-repositoryi<d> <name>Proficio Repository<name> <url>sftp://ftpserver.yourcompany.com/deploy<url> <repository> <distributionManagement> {code}
*# 使用外在的ssh配置编译扩展用于指定使用wagon外在ssh提供,用于提供你的文件到相应的远程服务器。
{code:xml} <distributionManagement> <repository> <id>proficio-repository<id> <name>Proficio Repository<name> <url>scpexe://sshserver.yourcompany.com/deploy<url> <repository> <distributionManagement> <build> <extensions> <extension> <groupId>org.apache.maven.wagon<groupId> <artifactId>wagon-ssh-external<artifactId> <version>1.0-alpha-6<version> <extension> <extensions> <build> {code}
*# 使用ftp配置
{code:xml} <distributionManagement> <repository> <id>proficio-repository<id> <name>Proficio Repository<name> <url>ftp://ftpserver.yourcompany.com/deploy<url> <repository> <distributionManagement> <build> <extensions> <extension> <groupId>org.apache.maven.wagongroupId> <artifactId>wagon-ftpartifactId> <version>1.0-alpha-6version> <extension> <extensions> <build> {code}
{panel} h4. 插件配置
答: 配置site插件的编码设置
{code:xml} ... <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-site-plugin</artifactId> <version>2.0-beta-6</version> <configuration> <outputEncoding>UTF-8</outputEncoding> </configuration> </plugin> ... {code} FROM:http://www.cnblogs.com/BigTall/archive/2011/03/23/1993253.html