Maven简介
是什么?
Is a software project management and comprehension tool.项目管理工具
是基于POM概念(工程对象模型)
[设计重复、编码重复、文档重复、构建重复,maven最大化消除了构建的重复]
[与XP:简单、交流与反馈;测试驱动开发、十分钟构建、持续集成、富有信息的工作区]
功能:
1)规范构建系统,项目构建,自动化(标准化)构建è构建工具(清理、编译、测试、生成报告、打包、部署),而且是跨平台的。抽象构建过程,提供构建任务实现。
2)依赖管理:[在这开源的年代里,几乎任何Java应用都会借用一些第三方的开源类库,这些类库都可以通过依赖的方式引入到项目中来。随着依赖的增多,版本不一致、版本冲突、依赖臃肿等问题都会接踵而来。Maven提供了一个优秀的解决方案:]通过一组坐标maven能够找到任何一个Java类库。
3)项目信息管理:管理原本分散在各个角落的项目信息:项目描述、开发者列表、版本控制系统地址、许可证、缺陷管理系统地址。。。
4)自动生成项目站点,获得项目文档、测试报告、静态分析报告、源码版本日志报告。。。
5)中央仓库:提供一个免费的中央仓库,在其中集合可以找到任何的流行开源类库。通过一些Maven的衍生工具(如Nexus),可以对其进行快速地搜索。只要定位了坐标,Maven就能够帮我们自动下载。Http://repo1.maven.org/maven2/
相关内容:
1)maven的安装、配置、基本使用
2)坐标和依赖、中央仓库、maven仓库、生命周期、插件、聚合与集成
3)nexus建立私服、使用maven进行测试、使用Hudson进行持续集成、
4)使用maven构建web应用、maven的版本管理、maven的灵活构建、生成项目站点和maven的m2eclipse插件
5)maven和archetype插件
Java领域构建管理的解决方案发展:IDEàMake|Ant+IvyàMaven
================================================
参考官方document:“http://maven.apache.org/guides/index.html”几乎都能找到。
Windows环境下,在用户目录C:\Documents and Settings\Administrator下,默认情况下,.m2/repository存放Maven本地仓库。所有的Maven构件(artifact)都被存储到改仓库中,以便重用。Maven根据一套规则来确定任何一个构件在仓库中的位置。
也可以自定义本地仓库位置
Maven安装与配置
设置HTTP代理
有的时候公司由于安全因素考虑,要求你使用通过安全认证的代理访问因特网。
所以要为Maven配置HTTP代理,才能让它正常访问外部仓库,以下载所需要的资源。
Ping repo1.maven.org——index central|http://repo1.maven.org/maven2
http代理服务器:218.14.227.197 3128 测试是否畅通
setting.xml里的<proxies>元素
插件
eclipse 的 maven插件 m2eclipse
地址:http://m2eclipse.sonatype.org/sites/m2e 核心 maven integration for eclipse
还有一些额外组件:为方便与其他工具如Subversion进行集成,地址:
http://m2eclipse.sonatype.org/sites/m2e-extras
查看eclipse是否已经支持创建Maven项目File->New->Other里面有maven一项
Maven安装最佳实践
1)设置MAVEN_OPTS,运行mvn命令实际上是执行了Java命令,既然是运行Java,那么Java命令可用的参数也在运行mvn命令时可用。
通常需要设置MAVEN_OPTS值为:-Xms128m –Xmx512m
因为Java默认的最大可用内存往往不够满足maven运行的需要。
2)配置用户范围的settings.xml
一般最佳实践:把M2_HOME/conf/settings.xml文件复制到~/.m2/settings.xml
3)不使用IDE内嵌的Maven
Maven使用入门
编写pom->编写主代码->编写测试代码->打包和运行->使用archetype生成项目骨架->m2eclipse简单使用
Make——Makefile;Ant——build.xml;Maven——pom.xml;
POM:project object Model项目对象模型,定义项目的基本信息,用于描述项目如何构建,声明项目依赖等等。
项目的骨架: mvn archetype:generate 用于创建项目的骨架:
|----pom.xml
|----src
|-----main
|------java/该目录下存放项目主代码
|------resources
|-----test
|------java/默认的测试代码目录
|------resources
|-----target
|-----classes
|-----test-classes
|-----surefire
|-----surefire-reports
|--------包名.类名.txt
|--------Test-包名.类名.xml
|-----maven-archiver
|---------pom.properties
|-----XXXX-版本.jar
|-----original-XXX-版本.jar
[官方插件使用:“http://maven.apache.org/plugins/index.html”]
1) Mvn clean compile: clean:clean , resources:resources, compiler:compiler
2) Mvn clean test: clean:clean, resources:resources, compiler:compiler, resources:testResources, compiler:testCompiler, surfire:test
3) mvn clean package: jar:jar
4)mvn clean install: install:install
5)java –jar xxx.jar
还可以配置字符encoding
打包
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.4</version>
<relativePath></relativePath>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
坐标和依赖
Maven坐标元素包括:groupId, artifactId, version, packaging, classifier。
1)groupId:定义当前Maven项目隶属的实际项目。例如org.sonatype.nexus的groupId,org.sonatype表示Sonatype公司建立的个非盈利性组织,nexus表示Nexus这一实际项目。
2)artifactId:定义实际项目中的一个Maven项目(模块),推荐做法:使用实际项目名称作为artifactId的前缀。
3)version:定义Maven项目当前所处的版本。Maven还定义了一套完成的版本规范,已经快照的概念。
4)packagin:定义Maven项目的打包方式,默认jar
5)classifier:帮助定义构建输出的一些附属构件。附属构件与主构构件对应,例如Java文档和源代码(nexus-indexer-2.0.0.jar, nexus-indexer-2.0.0-javadoc.jar, nexus-indexer-2.0.0-sources.jar)。该元素不能直接定义。
项目构件的文件名与坐标相对应,一般的规则:artifactId-version[-classifier].packaging。
Type:依赖的类型,对应于项目坐标定义的packaging。大部分情况下,该元素不必声明,其默认值为jar
依赖范围scope
依赖范围就是用来控制依赖与这三种classpath(编译calsspath, 测试classpath, 运行classpath)的关系。
1)compile:编译依赖范围。如果没有指定,就会默认使用该依赖范围。使用此依赖范围的Maven依赖,对于编译、测试和运行3中classpath都有效。典型的例子是spring-core,在编译、测试和运行的时候都需要使用该依赖。
2)test:测试依赖范围。使用此依赖范围的Maven依赖,只对于测试classpath有效,在编译主代码或者运行项目的使用时将无法使用该类依赖。典型的例子是JUnit,它只有在编译测试代码及运行测试的时候才需要。
3)provided:已提供依赖范围。使用此依赖范围的Maven依赖,对于编译和测试classpath有效,但在运行时无效。典型的例子是servlet-api,编译和测试项目的时候需要该依赖,但是在运行项目的时候,由于容器已经提供,就不需要Maven重复地引入一遍。
4)runtime:运行时依赖范围。使用此依赖范围的Maven依赖,对于测试和运行classpath有效,但在编译主代码无效。典型的例子是JDBC驱动实现,项目主代码的编译只需要JDK提供的JDBC接口,只有在执行测试或者运行项目的时候才需要实现上述接口的具体JDBC驱动。
5)system:系统依赖范围。该依赖与三种classpath的关系,和provided依赖访问完全一致。但是,使用system范围的依赖时必须通过systemPath元素显式地指定依赖文件的路径。由于此类依赖不是通过Maven仓库解析的,而且往往与本机系统绑定,可能造成构建的不可移植,故应谨慎使用。
6)import:导入依赖范围。。。。。。
scope |
编译 |
测试 |
运行 |
demo |
compile |
O |
O |
O |
Spring-core |
test |
|
O |
|
JUnit |
provided |
O |
O |
|
servlet-api |
runtime |
|
O |
O |
JDBC驱动实现 |
system |
O |
O |
|
本地的,jre |
传递性依赖:不用在使用Spring Framework的时候就不用去考虑它依赖了什么,也不用担心多余的依赖。Maven依赖会解析各个直接依赖的POM,将那些必要的间接依赖,以传递性依赖的形式引用到当前的项目中。
右边是第二依赖 |
compile |
test |
provided |
runtime |
compile |
compile |
- |
- |
runtime |
test |
test |
- |
- |
test |
provided |
provide |
- |
provided |
provided |
runtime |
runtime |
- |
- |
runtime |
依赖调解:解决传递性依赖造成的问题,需要清楚的知道该传递性依赖时从哪条依赖路径引入的。原则:1)路径最近者优先;2)第一声明者优先。
可选依赖:可选依赖是不传递的。可选类似单选框,比如A->B, B->Y(可选), B->X(可选),需要A显示声明X或Y的依赖。例子:B是一个持久层隔离工具包,它支持多种数据库,包括MySQL, PostgreSQL等,在构建工具包的时候,需要这2种数据库的驱动程序,但是在使用这个工具的时候,只会依赖一种数据库。
<optional>true</optional>表示依赖是可选依赖。
排除依赖:<exclusions><exclusion></exclusion></exclusions>
归类依赖:使用常量${},<properties><变量>值</变量></properites>
优化依赖:
mvn dependency:list:查看当前项目的已解析依赖
mvn dependency:tree:在已解析依赖的基础上,查看依赖树,能看到某个依赖时通过哪条传递路径引入的
mvn dependency:analyze [used undeclared dependencies, Unused declared dependencies]
配置jdk
Xml代码
1. <build>
2. <plugins>
3. <plugin>
4. <groupId>org.apache.maven.plugins</groupId>
5. <artifactId>maven-compiler-plugin</artifactId>
6. <version>3.1</version>
7. <configuration>
8. <source>1.6</source>
9. <target>1.6</target>
10. </configuration>
11. </plugin>
12. </plugins>
13.</build>
仓库
1)何为Maven仓库
坐标和依赖是任何一个构件在Maven世界中的逻辑表示方式;
而构件的物理表示方式是文件,Maven通过仓库来统一管理这些文件。
在Maven世界中,任何一个依赖、插件或者项目构建输出,都可以称为构件。
2)仓库的布局
路径与坐标的大致对应关系:
groupId/artifactId/version/artifactId-version.packaging
3)仓库的分类
Maven仓库:本地仓库+远程仓库[中央仓库+私服+其他公共仓库]
超级POM:maven-modle-builder-3.0.jar中的
org/apache/maven/model/pom-4.0.0.xml
<repositories>
<repository>中央仓库
<id>central</id>
<name>Central Repository</name>
<url>http://repo.maven.apache.org/maven2</url>
<layout>default</layout>仓库部署
<snapshots>
<enabled>false</enabled>不允许下载快照版本
</snapshots>
</repository>
</repositories>
4)远程仓库的配置:可以直接配置在POM文件中
<repositories>
<repository>
<id>jboss</id>
<name>JBossRepository</name>
<url>http://repository.jboss.com/maven2</url>
<layout>default</layout>
<snapshotPolicy>always</snapshotPolicy>
<releases><enabled>true</enabled></releases>允许下载发布版本
<snapshots>
<enabled>false</enabled>
<updatePolicy>daily</updatePolicy> 仓库检查更新的频率
<checksumPolicy>ignore</checksumPolicy>校验和文件
</snapshots>
</repository>
</repositories>
认证:必须配置在settings文件中
<server>
<id>deploymentRepo</id>
<username>repouser</username>
<password>repopwd</password>
</server>
部署到远程仓库:mvn clean deploy,配置POM
<distributionManagement>
<repository>
<id 和setting里server的id对应/><name/><url/>
</repository>
<snapshotRepository>
<id/><name/><url/>
</snapshotRepository>
</distributionManagement>
5)快照版本
Maven会自动为构件打上时间戳。有了这个时间戳,Maven就能随时找到仓库中该构件的最新文件。
6)从仓库解析依赖的机制
RELEASE、LATEST:groupId/artifactId/maven-metadata.xml
SNAPSHOT:groupId/artifactId/version/maven-metadata.xml
7)镜像:代理了主流的Maven公共仓库,如central,JBoss,Java.net。。。。
<mirror>
<id>mirrorId</id>
<mirrorOf>repositoryId</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://my.repository.com/repo/path</url>
</mirror>
8)仓库搜索服务
https://repository.sonatype.org/index.html
http://www.jarvana.com/jarvana/
生命周期和插件
Maven的生命周期是抽象的,其实际行为都由插件来完成。
命令——生命周期阶段——插件---插件目标
1)何为生命周期
项目构建的生命周期:。。。。。。
Maven的生命周期:为对所有的构建过程进行抽象和统一。包括:
清理à初始化à编译à测试à打包à集成测试à验证à部署à站点生成。。。。。
2)生命周期详解
Maven拥有3套相互独立的生命周期:clean, default, site。每个生命周期都包含一些阶段(phase)。这些阶段是有顺序的,并且后面的阶段依赖于前面的阶段。但是3套生命周期本身是相互独立的,用户调用某个生命周期的某个阶段不会对其他生命周期产生任何影响。
èclean: 清理项目
阶段们:pres-clean, clean, post-clean
èdefault: 构建项目
阶段们:
Validate, initialize,
generate-sources, process-sources, [处理项目主资源文件,对src/main/resources目录的内容进行变量替换等工作后,复制到项目输出的主classpath目录中target\classes],
Generate-resources, process-resources
Compile[编译项目的主源码,编译src/main/java目录下的Java文件至项目输出的主classpath目录中], process-classes
generate-test-sources, process-test-sources,
Generate-test-resources, process-test-resources
Test-compile, process-test-classes, test
Prepare-package, package
Pre-integeration-test, Integeration-test, post-integration-test
Verify,
install[将包安装到Maven本地仓库,供本地其他Maven项目使用],
deploy[将最终的包复制到远程仓库,供其他开发人员和Maven项目使用]
èsite: 建立项目站点,建立和发布项目站点
阶段们:pre-site, site, post-site, site-deploy
3)插件目标 plugin goal
每一个目标对应一个功能,例如:dependency:analyze, dependency:tree………
通用写法:[插件前缀:目标]
Maven核心仅仅定义了抽象的生命周期,具体的任务是交由插件完成的。一个插件有多个目标是为复用代码。
4)插件绑定
Maven的生命周期与插件相互绑定,用以完成实际的构建任务。具体:
生命周期的阶段与插件的目标相互绑定,以完成某个具体的构建任务
周期阶段 |
插件目标 |
pre-clean |
|
clean |
Maven-clean-plugin:clean |
Post-clean |
|
Validate |
|
initialize |
|
generate-sources |
|
process-sources |
|
Generate-resources |
|
Process-resources |
Maven-reousrces-plugin:resources |
Compile |
Maven-compiler-plugin:compile |
process-classes |
|
Generate-test-resources |
|
process-test-resources |
Maven-resources-plugin:testResources |
Test-compile |
Maven-compiler-plugin:testCompile |
process-test-classes |
|
test |
Maven-surefire-plugin:test |
Prepare-package |
|
package |
Maven-jar-plugin:jar |
Pre-integeration-test |
|
Integeration-test |
|
post-integration-test |
|
verify |
|
install |
Maven-install-plugin:install |
deploy |
Maven-deploy-plugin:deploy |
Pre-site |
|
Site |
Maven-site-plugin:site |
Post-site |
|
Site-deploy |
Maven-site-plugin:deploy |
以上表格是内置默认绑定,用户还可以自己选择将某个插件目标绑定到生命周期的某个阶段上。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.1.1</version>
<executions>
<execution>
<id>attach-sources</id>
<phase>verify</phase>
<goals>他
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
使用maven-help-plugin查看插件详细信息:
Mvn help:describe -Dplugin=org.apache.maven.plugins:maven-source-plugin:2.1.1 -Ddetail ?????
5)插件配置
è很多插件目标的参数都支持从命令行配置,用户可以再Maven命令中使用-D参数,并伴随一个参数键=参数值的形式来配置插件目标的参数。例:
Mvn install –Dmaven.test.skip=true
èPOM中插件全局配置<configuration>:所有该基于该插件目标的任务都会使用的配置
èPOM中插件任务配置<executions>
6)获取插件信息
基本上所有主要的Maven插件都来自:Apache和Codehaus
http://maven.apache.org/plugins/index.html ok
http://repo1.maven.org/maven2/org/apache/maven/plugins ok
http://mojo.codehaus.org/plugins.html
http://repository.codhaus.org/org/codehaus.mojo/
使用maven-help-plugin描述插件来获取插件的详细信息
Mvn help:describe –Dplugin=org.apache.maven.plugins:maven-compiler-plugin:2.1
关键点:Goal Presifx:前缀,类似插件名的缩写。
7)从命令行调用插件
Mvn [options] [<goal()s>] [<phase(s)>]
Mvn 前缀:目标:-D参数键=参数值
8)插件解析机制
插件仓库:<pluginRepositories>
插件的默认groupId:Maven的官方插件,即groupId:org.apache.maven.plugins
解析插件版本:首先maven在超级pom中为所有核心插件设定了版本。不是核心插件则会去检查所有仓库中的可用版本,然后做出选择。
解析插件前缀:插件前缀与groupId:artifactId是一一对应的,这种匹配关系存储在仓库元数据中,与之前提到的groupId/aritifactId/maven-metadata.xml不同,这里仓库元数据为groupId/maven-metadata.xml
聚合与继承
Maven的聚合特性能够把项目的各个模块聚合在一起构建,
而Maven的继承特性则能帮助抽取各个模块相同的依赖和插件等配置,在简化POM的同时,还能促进各个模块配置的一致性。
2)聚合
3)继承
<dependencyManagement/>
<pluginManagement/>
RelativePath的默认值是…/pom.xml,即父POM在上一层目录下。
可继承的POM元素:
groupId:项目Id
version:项目版本
description:项目的描述信息
organization:项目的组织信息
inceptionYear:项目的创始年份
url:项目的URL地址
developers:项目的开发者信息
contributors:项目的贡献者信息
distributionManagement:项目的部署配置
issueManagement:项目的缺陷跟踪系统信息
ciManagement:项目的持续集成系统信息
scm:项目的版本控制系统信息
mailingLists:项目的邮件列表信息
properties:自定义的Maven属性
dependencies:项目的依赖配置
dependencyManagement:项目的依赖管理配置
repositories:项目的仓库配置
build:包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等。
Reporting:包括项目的报告输出目录配置、报告插件配置等。
依赖管理:
插件管理:跟依赖管理差不多
4)聚合与继承的关系
在实际项目中,一个POM往往既是聚合POM,又是父POM。而且Maven默认能识别的父模块位置和上述方案是一致的,这样就不用再配置relativePath
5)约定优于配置
约定:
源码目录:src/main/java/
编译输出目录:target/classes/
打包方式:jar
包输出目录:target/
超级POM
6)反应堆
在一个多模块的Maven项目中,反应堆Reactor是指所有模块组成的一个构建结构。对于单模块的项目,反应堆就是该模块本身,但是对于多模块项目来说,反应堆就包含了各模块之间继承与依赖点的关系,从而能自动计算出合理的模块构建顺序。
实际的构建顺序:
Maven按序读取POM,如果该POM没有依赖模块,则进一步先构建改模块,否则就想构建其依赖模块,如果该依赖还依赖于其他模块,则进一步先构建依赖的依赖。
模块间的依赖关系会将反应堆构成一个有向非循环图,各个模块是该图的节点,依赖关系构成了有向边。
裁剪反应堆:
一般来说,用户会选择构建整个项目或者选择构建单个模块,但有些时候,用户会想要仅仅构建完整反应堆中的某个模块——裁剪反应堆
-am, --also-make同时构建所列模块的依赖模块
-amd, -also-make-dependents同时构建依赖于所列模块的模块
-pl, --projects <arg>构建指定的模块,模块间用逗号分隔
-rf, -resume-from <arg>从指定的模块恢复反应堆
使用Nexus创建私服
1)Nexus介绍
Maven仓库管理软件,典型的Java Web应用,其特性:
è较小的内存占用
è基于ExtJS的友好界面
è基于Restlet的完全REST API
è支持代理仓库、宿主仓库和仓库组
è基于文件系统,不需要数据库
è支持仓库索引和搜索
è支持从界面上传Maven构件
è细粒度的安全控制
2)安装Nexus
Admin/admin123
3)Nexus的仓库与仓库组
主要仓库类型:group(仓库组),hosted(宿主),proxy(代理)。Policy表示改仓库为发布版本的仓库还是快照版本仓库。最后两轮的值为仓库的状态和路径:
Nexus中的仓库是一个实际仓库在Nexus服务上的缓存代理。从仓库的名称中就可以知道该仓库代理了那个仓库。
setting.xml里的profiles activeProfiles
使用Maven进行测试
Maven的重要职责之一:自动运行单元测试,通过maven-surefire-plugin与主流的单元测试框架JUnit3、JUnit4以及TestNG集成,并且能够自动生成丰富的结果报告。
1)maven-surfire-plugin
2)跳过测试
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.5</version>
<configuration>
<skipTests>true</shipTests>
</configuration>
</plugin>
3)动态指定要运行的测试用例
Maven-surefire-plugin提供了一个test参数让Maven用户能够在命令行指定要运行的测试用例。可以使用通配符。
4)包含与排除测试用例
<configuration>
<includes>
<include>**/*Tests.java</include>
<indludes>
<excludes>
<exclude>**/*Service.java</exclude>
<exdludes>
</configuration>
5)测试报告
Mvn cobertura:cobertura
6)运行TestNG测试
7)重用测试代码
Mvn jar:test-jar
<type>test-jar<type>
现实中常见的情况是:很多程序员即使修改了一些较底层的代码(如数据库访问、业务逻辑),都会习惯性地打开浏览器测试整个应用,这往往是没有必要的。可以用单元测试覆盖的代码就不应该依赖于Web页面测试,且不说页面测试更加耗时耗力,这种方式还无法自动化,更别提重复性了。因此Web页面测试应该进限于页面层次,例如JSP、CSS、JavaScript的修改,其他代码修改(如数据访问),请编写单元测试。
使用Hudson进行持续集成
持续集成:作为最核心的敏捷实践之一
Maven所实现的自动化构建正式持续集成的一个必要前提,持续集成还要求开发人员使用版本控制工具和持续集成服务器。
使用Maven构建Web应用
一个典型的WAR文件目录结构:
-war/
|------META-INF/
|------WEB-INF/
|--------classes/
|--------lib/
|--------web.xml
|------img/
|------css/
|------js/
|------index.html
|------sample.jsp
Maven对Web项目的布局结构也有一个通用的约定,但是一定要记住Web项目显示指定打包方式为war。而且还多个一个Web资源目标
--project/
|----pom.xml
|----src/
|-----main/
|------java/该目录下存放项目主代码
|------resources/
|------webapp/
|-------WEB-INF/
|------web.xml
|-------img/
|-------css/
|-------js/
|-------index.html
|-------sample.jsp
|-----test/
|------java/默认的测试代码目录
|------resources/
|-----target/
|-----classes/
|-----test-classes/
|-----surefire/
|-----surefire-reports/
|--------包名.类名.txt
|--------Test-包名.类名.xml
|-----maven-archiver/
|---------pom.properties
|-----XXXX-版本.jar
|-----original-XXX-版本.jar
同一个项目中,一个模块要依赖其他模块则dependency这么写:
使用jetty-maven-plugin进行测试
在setting文件里:
<pluginGroups>
<!-- pluginGroup | Specifies a further group identifier to use for plugin
lookup. <pluginGroup>com.your.plugins</pluginGroup> -->
<pluginGroup>org.mortbay.jetty</pluginGroup>
</pluginGroups>
配置插件
<!-- jetty插件, 设定context path与spring profile -->
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>${jetty.version}</version>
<configuration>
<!-- 启动热部署 -->
<reload>automatic</reload>
<scanIntervalSeconds>10</scanIntervalSeconds>
<systemProperties>
<systemProperty>
<name>spring.profiles.active</name>
<value>development</value>
</systemProperty>
</systemProperties>
<useTestClasspath>true</useTestClasspath>
<webAppConfig>
<contextPath>/${project.artifactId}</contextPath>
</webAppConfig>
</configuration>
</plugin>
使用Cargo实现自动化部署
<plugin>
<groupId>org.codehaus.cargo</groupId>
<artifactId>cargo-macen2-plugin</artifactId>
<version>1.0</version>
<configuration>
<container>
<containerId>tomcat6x</containerId>
<home>D:\cmd\apache-tomcat-6</homde>
</container>
<configuration>
<type>standalone|existing</type>
<home>${project.build.directory}/tomcat6x</home>
<properties>
<cargo.servlet.port>8081</cargo.servlet.port>
<properties>
</configuration>
</configuration>
</plugin>
cargo:redeploy
部署到远程web容器
<plugin>
<groupId>org.codehaus.cargo</groupId>
<artifactId>cargo-macen2-plugin</artifactId>
<version>1.0</version>
<configuration>
<container>
<containerId>tomcat6x</containerId>
<type>remote</type>
</container>
<configuration>
<type>runtime</type>
<properties>
<cargo.remote.username>root</cargo.remote.username>
<cargo.remote.password>123456</cargo.remote.password> <cargo.tomcat.manager.url>http://192.168.137.2:8080/manager</cargo.tomcat.manager.url>
</properties>
</configuration>
</configuration>
</plugin>
主干trunk:项目开发代码的主体,是从项目开始知道当前都处于活动的状态;
分支branch:从主干的某个点分离出来的代码拷贝,通常可以再不影响主干的前提下载这里进行重大bug的修复,或者做一些实验性质的开发。如果分支达到了预期的目的,通常发生在这里的变更会被合并merge到主干中;
标签tag:用来标识主干或者分支的某个点的状态,以代表项目的某个稳定状态,这通常就是版本发布时的状态。
Maven属性:
1)内置属性:${basedir}项目根目录, ${version}项目版本
2)POM属性:使用该属性引用POM文件中对应元素的值,例如:${project.artifactId}
3)自定义属性:用户可以在POM的<properties>元素下自定义Maven属性
4)Setting属性:与POM属性同理,用户使用以settings开头的属性引用settings.xml文件中XML元素的值
5)Java系统属性:所有Java系统属性都可以使用Maven属性引用。
6)环境变量属性:所有环境变量都以env.开头
scm
release:prepare release:perform release:branch
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<configuration>
<tagBase>file:///D:/svn_repository/tags/</tagBase>
<branchBase>file:///D:/svn_repository/branches/dispatch-config</branchBase>
<tagNameFormat>@{project.artifactId}-V@{project.version}-build-130327</tagNameFormat>
<workingDirectory>${java.io.tmpdir}/${project.artifactId}/checkout</workingDirectory>
<checkModificationExcludes>
<checkModificationExclude>.project</checkModificationExclude>
<checkModificationExclude>.classpath</checkModificationExclude>
<checkModificationExclude>.settings</checkModificationExclude>
<checkModificationExclude>.releaseBackup</checkModificationExclude>
</checkModificationExcludes>
<generateReleasePoms>false</generateReleasePoms>
<autoVersionSubmodules>true</autoVersionSubmodules>
<remoteTagging>true</remoteTagging>
<username>${svn.name}</username>
<password>${svn.pwd}</password>
<updateBranchVersions>true</updateBranchVersions>
<updateWorkingCopyVersions>true</updateWorkingCopyVersions>
<branchName>1.0.7</branchName>
</configuration>
</plugin>
<scm>
<url>file:///D:/svn_repository/branches/dispatch-config/1.0.3</url>
<connection>scm:svn:file:///D:/svn_repository/branches/dispatch-config/1.0.3</connection>
<developerConnection>scm:svn:file:///D:/svn_repository/branches/dispatch-config/1.0.3</developerConnection>
</scm>