与maven1 相比,maven2可算是几乎重写了,不 过 从速度来 说应该 更快。
主要的几个新特性包括:( 详细 参考 http://www.ibm.com/developerworks/cn/opensource/os-maven2/index.html )
1 . 更快、更 简单
速度方面可以比上 ant 了
2 . 更少的配置文件
现 在的配置文件只剩下了 settings.xml 和 pom.xml 了。
3. Plugin 语 言更 换
语 言 开 始支持java,BeanShell和ant
4. 提供了 预 定 义 的模版
这 点是最有帮助的,用 户 可以自己定 义 自己的 项 目模版了,就像用appfuse一 样 生成 项 目 结 构
5. 生命周期的引入
在Maven2中有了明确的生命周期概念,而且都提供与之 对应 的命令,使得 项 目构建更加清晰明了。
6. 新增 Dependency Scope
这 点也比 较 重要,有些用于 test 范 围 的包,可以不用加入依 赖 了
7. 传递 依 赖 , 简 化依 赖 管理
这 是最 为 方便的,可以省了很多配置。 如a 依 赖 b,b 依 赖 c 默 认 a 也会依 赖 c 。但是也会 带 来 隐 患,如版本冲突。不 过 maven 也已 经 考 虑 到了,可以使用exclusions来排除相 应 的重 复 依 赖
介 绍 了那 么 多, 现 在切入正 题 , 开 始maven2 之旅:
首些下 载 需要的工具:
maven2: http://maven.apache.org/download.html 最主要的
maven-proxy:用来代理repository,使用本地 库 代替maven2的 远 程 库
http://maven-proxy.codehaus.org/
continuum :一个不 错 的持 续 整合工具,用于自 动 build 。支持ant,maven
http://maven.apache.org/continuum/
svn:版本控制工具相信都已 经 配置了。
maven 用于 eclipse 的插件 , 在 maven 主站有下 载 ,不 错 的插件。当然 idea 也有相 应 的插件
最后, http ,服 务 器是必不可少的。用于内部 开发 使用。
可以使用 apache ,或者 jetty http://www.mortbay.org/
安装:
安装 maven2 很 简单 ,把下 载 来的 maven 包解 开 就行了。(目前我的配置都在 win2003 上, 还 没有 应 用于 linux ,所有所有的配置都 针对 windows). 增加相 应 的 环 境 变 量 m2_home=maven2 的安装目 录 ,不要忘了 设 置 java_home 的目 录 。另外在 path 中增加 % m2_home%\bin; 可以直接在命令行下面使用 mvn 。
其他工具的安装在后 续 的文章会介 绍 。
开 始第一个 mvean2 项 目:
mvn archetype:create -DgroupId=com.mycompany.app \
-DartifactId=my-app
简单 介 绍 一下 groupId 相当于你的 组织 ,如同 org.springframework ,会 转 化 为 相 应 得本地路径 artifactId ,你主要的 jar 包名称,也就是你要打成的 jar 名称。
编译应 用 资 源
mvn compile
编译 相 应 的 jave 文件
编译测试类 以及运行 测试类
mvn test
运行 测试类
如果只想 编译 test , 执 行
mvn test-compile
打包和安装你的本地 库
打包:
mvn package
安装:
mvn install
创 建 web site
mvn site
清除所有 输 出
mvn clean
创 建相 关 的 ide 文件
mvn idea:idea 或者 mvn eclipse:eclipse
顺 便 说 一下, maven2 是有生命周期 这 一概念的,也就是 说 如果你 执 行 package ,相 应 的以前 步骤 ,如 compile,test 等都会自 动执 行。
刚开 始 执 行会比 较 慢,需要从maven2 远 程 库 中下 载 所有的文件到本地。如果你的本地没有相 应 的依 赖 包, 则每 次maven都会去 远 程下 载 ,所以配置一个 镜 像 库 就比 较 重要了。
另外介 绍 一下主要的参考 资 料:
mavn2 主站:主要的 pom 和 settings.xml 参考 资 料
Better Builds with Maven http://www.mergere.com/m2book_download.jsp
不 错 的 书 ,主要通 过 例子介 绍 。 可惜都是E文的,花点 时间还 是 值 得的。
下一个主 题 ,会 说 一下maven2的主要配置。
先来 说说 settings.xml , settings.xml 对 于 maven 来 说 相当于全局性的配置,用于所有的 项 目。在 maven2 中存在两个 settings.xml ,一个位于 maven2 的安装目 录 conf 下面,作 为 全局性配置。 对 于 团队设 置,保持一致的定 义 是 关键 ,所以 maven2/conf下面的settings.xml就作 为团队 共同的配置文件。保 证 所有的 团队 成 员 都 拥 有相同的配置。当然 对 于 每 个成 员 ,都需要特殊的 自定 义设 置,如用 户 信息,所以另外一个settings.xml就作 为 本地配置。默 认 的位置 为 :${user.dir} /.m2/settings.xml目 录 中(${user.dir} 指windows 中的用 户 目 录 )。
settings.xml基本 结 构如下:
<settings xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd">
<localRepository/>
<interactiveMode/>
<usePluginRegistry/>
<offline/>
<pluginGroups/>
<servers/>
<mirrors/>
<proxies/>
<profiles/>
<activeProfiles/>
</settings>
简单 介 绍 一下几个主要的配置因素:
localRepository:表示本地 库 的保存位置,也就是maven2主要的jar保存位置,默 认 在${user.dir}/.m2/repository,如果需要另外 设 置,就 换 成其他的路径。
offline:如果不想 每 次 编译 ,都去 查 找 远 程中心 库 ,那就 设 置 为 true 。当然前提是你已 经 下 载 了必 须 的依 赖 包。
Servers
在POM中的 distributionManagement元素定 义 了 开发库 。然而,特定的username和pwd不能使用于pom.xml,所以通 过 此配置来保存server信息
<servers>
<server>
<id>server001</id>
<username>my_login</username>
<password>my_password</password>
<privateKey>${usr.home}/.ssh/id_dsa</privateKey>
<passphrase>some_passphrase</passphrase>
<filePermissions>664</filePermissions>
<directoryPermissions>775</directoryPermissions>
<configuration></configuration>
</server>
</servers>
- id:server 的id,用于匹配distributionManagement库id,比较重要。
- username, password:用于登陆此服务器的用户名和密码
- privateKey, passphrase:设置private key,以及passphrase
- filePermissions, directoryPermissions:当库文件或者目录创建后,需要使用权限进行访问。参照unix文件许可,如664和775
表示 镜 像 库 ,指定 库 的 镜 像,用于增加其他 库
<mirrors>
<mirror>
<id>planetmirror.com</id>
<name>PlanetMirror Australia</name>
<url>http://downloads.planetmirror.com/pub/maven2</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
- id,name:唯一的标志,用于区别镜像
- url:镜像的url
- mirrorOf:此镜像指向的服务id
此 设 置,主要用于无法直接 访问 中心的 库 用 户 配置。
<proxies>
<proxy>
<id>myproxy</id>
<active>true</active>
<protocol>http</protocol>
<host>proxy.somewhere.com</host>
<port>8080</port>
<username>proxyuser</username>
<password>somepassword</password>
<nonProxyHosts>*.google.com|ibiblio.org</nonProxyHosts>
</proxy>
</proxies>
- id:代理的标志
- active:是否激活代理
- protocol, host, port:protocol://host:port 代理
- username, password:用户名和密码
- nonProxyHosts: 不需要代理的host
类 似于 pom.xml 中的 profile 元素,主要包括 activation,repositories,pluginRepositories 和 properties 元素
刚开 始接触的 时 候,可能会比 较 迷惑,其 实这 是 maven2 中比 较强 大的功能。 从字面上来 说 ,就是个性配置。
单 独定 义 profile 后,并不会生效,需要通 过满 足条件来激活。
repositories 和 pluginRepositories
定 义 其他 开发库 和插件 开发库 。 对 于 团队 来 说 ,肯定有自己的 开发库 。可以通 过 此配置来定 义 。
如下的配置,定 义 了本地 开发库 ,用于 release 发 布。
<repositories>
<repository>
<id>repo-local</id>
<name>Internal 开发库 </name>
<url>http://192.168.0.2:8082/repo-local</url>
<releases>
<enabled>true</enabled>
<updatePolicy>never</updatePolicy>
<checksumPolicy>warn</checksumPolicy>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
<layout>default</layout>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>repo-local</id>
<name>Internal 开发库 </name>
<url>http://192.168.0.2:8082/repo-local</url>
<releases>
<enabled>true</enabled>
<updatePolicy>never</updatePolicy>
<checksumPolicy>warn</checksumPolicy>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
<layout>default</layout>
</pluginRepository>
</pluginRepositories>
releases, snapshots: 每 个 产 品的版本的 Release 或者 snapshot( 注: release 和 snapshot 的区 别 , release 一般是比 较稳 定的版本,而 snapshot 基本上不 稳 定,只是作 为 快照)
properties
maven 的 properties 作 为 placeholder 值 ,如 ant 的 properties 。
包括以下的 5 种类 型 值 :
用于激活此 profile
<activation>
<activeByDefault>false</activeByDefault>
<jdk>1.5</jdk>
<os>
<name>Windows XP</name>
<family>Windows</family>
<arch>x86</arch>
<version>5.1.2600</version>
</os>
<property>
<name>mavenVersion</name>
<value>2.0.3</value>
</property>
<file>
<exists>${basedir}/file2.properties</exists>
<missing>${basedir}/file1.properties</missing>
</file>
</activation>
- jdk:如果匹配指定的jdk版本,将会激活
- os:操作系统
- property:如果maven能检测到相应的属性
- file: 用于判断文件是否存在或者不存在
除了使用 activation 来激活 profile ,同 样 可以通 过 activeProfiles 来激活
Active Profiles
表示激活的 profile, 通 过 profile id 来指定。
<activeProfiles>
<activeProfile>env-test</activeProfile> 指定的 profile id
</activeProfiles>
什 么 是 pom?
pom 作 为项 目 对 象模型。通 过 xml 表示maven 项 目,使用pom.xml来 实现 。主要描述了 项 目:包括配置文件; 开发 者需要遵循的 规则 ,缺陷管理系 统 , 组织 和licenses, 项 目的url, 项 目的依 赖 性,以及其他所有的 项 目相 关 因素。
快速察看:
<project>
<modelVersion>4.0.0</modelVersion>
<!-- The Basics -->
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<packaging>...</packaging>
<dependencies>...</dependencies>
<parent>...</parent>
<dependencyManagement>...</dependencyManagement>
<modules>...</modules>
<properties>...</properties>
<!-- Build Settings -->
<build>...</build>
<reporting>...</reporting>
<!-- More Project Information -->
<name>...</name>
<description>...</description>
<url>...</url>
<inceptionYear>...</inceptionYear>
<licenses>...</licenses>
<organization>...</organization>
<developers>...</developers>
<contributors>...</contributors>
<!-- Environment Settings -->
<issueManagement>...</issueManagement>
<ciManagement>...</ciManagement>
<mailingLists>...</mailingLists>
<scm>...</scm>
<prerequisites>...</prerequisites>
<repositories>...</repositories>
<pluginRepositories>...</pluginRepositories>
<distributionManagement>...</distributionManagement>
<profiles>...</profiles>
</project>
基本内容:
POM 包括了所有的 项 目信息。
maven 相 关 :
pom 定 义 了最小的 maven2 元素,允 许 groupId,artifactId,version 。所有需要的元素
- groupId:项目或者组织的唯一标志,并且配置时生成的路径也是由此生成,如org.codehaus.mojo生成的相对路径为:/org/codehaus/mojo
- artifactId: 项目的通用名称
- version:项目的版本
- packaging: 打包的机制,如pom, jar, maven-plugin, ejb, war, ear, rar, par
- classifier: 分类
主要 为 依 赖 , 继 承,合成
依 赖关 系:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<type>jar</type>
<scope>test</scope>
<optional>true</optional>
</dependency>
...
</dependencies>
- groupId, artifactId, version:描述了依赖的项目唯一标志
- type:相应的依赖产品包形式,如jar,war
- scope:用于限制相应的依赖范围,包括以下的几种变量:
- systemPath: 仅用于范围为system。提供相应的路径
- optional: 标注可选,当项目自身也是依赖时。用于连续依赖时使用
外在告 诉 maven 你只包括指定的 项 目,不包括相 关 的依 赖 。此因素主要用于解决版本冲突 问题
<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-embedder</artifactId>
<version>2.0</version>
<exclusions>
<exclusion>
<groupId>org.apache.maven</groupId>
<artifactId>maven-core</artifactId>
</exclusion>
</exclusions>
</dependency>
表示 项 目maven-embedder需要 项 目maven-core,但我 们 不想引用maven-core
继 承 关 系
另一个 强 大的 变 化,maven 带 来的是 项 目 继 承。主要的 设 置:
定 义 父 项 目
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>org.codehaus.mojo</groupId>
<artifactId>my-parent</artifactId>
<version>2.0</version>
<packaging>pom</packaging>
</project>
packaging 类 型,需要pom用于parent和合成多个 项 目。我 们 需要增加相 应 的 值给 父pom,用于子 项 目 继 承。 主要的元素如下:
- 依赖型
- 开发者和合作者
- 插件列表
- 报表列表
- 插件执行使用相应的匹配ids
- 插件配置
- 子项目配置
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.codehaus.mojo</groupId>
<artifactId>my-parent</artifactId>
<version>2.0</version>
<relativePath>../my-parent</relativePath>
</parent>
<artifactId>my-project</artifactId>
</project>
relativePath 可以不需要,但是用于指明 parent 的目 录 ,用于快速 查询 。
dependencyManagement :
用于父 项 目配置共同的依 赖关 系,主要配置依 赖 包相同因素,如版本, scope 。
合成(或者多个模 块 )
一个 项 目有多个模 块 ,也叫做多重模 块 ,或者合成 项 目。
如下的定 义 :
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>org.codehaus.mojo</groupId>
<artifactId>my-parent</artifactId>
<version>2.0</version>
<modules>
<module>my-project1<module>
<module>my-project2<module>
</modules>
</project>
build 设 置
主要用于 编译设 置,包括两个主要的元素, build 和 report
build
主要分 为 两部分,基本元素和 扩 展元素集合
注意:包括 项 目 build 和 profile build
<project>
<!-- "Project Build" contains more elements than just the BaseBuild set -->
<build>...</build>
<profiles>
<profile>
<!-- "Profile Build" contains a subset of "Project Build"s elements -->
<build>...</build>
</profile>
</profiles>
</project>
基本元素
<build>
<defaultGoal>install</defaultGoal>
<directory>${basedir}/target</directory>
<finalName>${artifactId}-${version}</finalName>
<filters>
<filter>filters/filter1.properties</filter>
</filters>
...
</build>
- defaultGoal: 定义默认的目标或者阶段。如install
- directory: 编译输出的目录
- finalName: 生成最后的文件的样式
- filter: 定义过滤,用于替换相应的属性文件,使用maven定义的属性。设置所有placehold的值
资 源 (resources)
你 项 目中需要指定的 资 源。如 spring 配置文件 ,log4j.properties
<project>
<build>
...
<resources>
<resource>
<targetPath>META-INF/plexus</targetPath>
<filtering>false</filtering>
<directory>${basedir}/src/main/plexus</directory>
<includes>
<include>configuration.xml</include>
</includes>
<excludes>
<exclude>**/*.properties</exclude>
</excludes>
</resource>
</resources>
<testResources>
...
</testResources>
...
</build>
</project>
- resources: resource的列表,用于包括所有的资源
- targetPath: 指定目标路径,用于放置资源,用于build
- filtering: 是否替换资源中的属性placehold
- directory: 资源所在的位置
- includes: 样式,包括那些资源
- excludes: 排除的资源
- testResources: 测试资源列表
在 build 时 , 执 行的插件,比 较 有用的部分,如使用 jdk 5.0 编译 等等
<project>
<build>
...
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.0</version>
<extensions>false</extensions>
<inherited>true</inherited>
<configuration>
<classifier>test</classifier>
</configuration>
<dependencies>...</dependencies>
<executions>...</executions>
</plugin>
</plugins>
</build>
</project>
- extensions: true or false,是否装载插件扩展。默认false
- inherited: true or false,是否此插件配置将会应用于poms,那些继承于此的项目
- configuration: 指定插件配置
- dependencies: 插件需要依赖的包
- executions: 用于配置execution目标,一个插件可以有多个目标。
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>echodir</id>
<goals>
<goal>run</goal>
</goals>
<phase>verify</phase>
<inherited>false</inherited>
<configuration>
<tasks>
<echo>Build Dir: ${project.build.directory}</echo>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
说 明:
- id:规定execution 的唯一标志
- goals: 表示目标
- phase: 表示阶段,目标将会在什么阶段执行
- inherited: 和上面的元素一样,设置false maven将会拒绝执行继承给子插件
- configuration: 表示此执行的配置属性
插件管理
pluginManagement :插件管理以同 样 的方式包括插件元素,用于在特定的 项 目中配置。所有 继 承于此 项 目的子 项 目都能使用。主要定 义 插件的共同元素
扩 展元素集合
主要包括以下的元素:
Directories
用于 设 置各 种 目 录结 构,如下:
<build>
<sourceDirectory>${basedir}/src/main/java</sourceDirectory>
<scriptSourceDirectory>${basedir}/src/main/scripts</scriptSourceDirectory>
<testSourceDirectory>${basedir}/src/test/java</testSourceDirectory>
<outputDirectory>${basedir}/target/classes</outputDirectory>
<testOutputDirectory>${basedir}/target/test-classes</testOutputDirectory>
...
</build>
Extensions
表示需要 扩 展的插件,必 须 包括 进 相 应 的 build 路径。
<project>
<build>
...
<extensions>
<extension>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-ftp</artifactId>
<version>1.0-alpha-3</version>
</extension>
</extensions>
...
</build>
</project>
Reporting
用于在 site 阶 段 输 出 报 表。特定的 maven 插件能 输 出相 应 的定制和配置 报 表。
<reporting>
<plugins>
<plugin>
<outputDirectory>${basedir}/target/site</outputDirectory>
<artifactId>maven-project-info-reports-plugin</artifactId>
<reportSets>
<reportSet></reportSet>
</reportSets>
</plugin>
</plugins>
</reporting>
Report Sets
用于配置不同的目 标 , 应 用于不同的 报 表
<reporting>
<plugins>
<plugin>
...
<reportSets>
<reportSet>
<id>sunlink</id>
<reports>
<report>javadoc</report>
</reports>
<inherited>true</inherited>
<configuration>
<links>
<link>http://java.sun.com/j2se/1.5.0/docs/api/</link>
</links>
</configuration>
</reportSet>
</reportSets>
</plugin>
</plugins>
</reporting>
更多的 项 目信息
name: 项 目除了 artifactId 外,可以定 义 多个名称
description: 项 目描述
url: 项 目 url
inceptionYear: 创 始年份
Licenses
<licenses>
<license>
<name>Apache 2</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
<distribution>repo</distribution>
<comments>A business-friendly OSS license</comments>
</license>
</licenses>
Organization
配置 组织 信息
<organization>
<name>Codehaus Mojo</name>
<url>http://mojo.codehaus.org</url>
</organization>
Developers
配置 开发 者信息
<developers>
<developer>
<id>eric</id>
<name>Eric</name>
<email>eredmond@codehaus.org</email>
<url>http://eric.propellors.net</url>
<organization>Codehaus</organization>
<organizationUrl>http://mojo.codehaus.org</organizationUrl>
<roles>
<role>architect</role>
<role>developer</role>
</roles>
<timezone>-6</timezone>
<properties>
<picUrl>http://tinyurl.com/prv4t</picUrl>
</properties>
</developer>
</developers>
Contributors
<contributors>
<contributor>
<name>Noelle</name>
<email>some.name@gmail.com</email>
<url>http://noellemarie.com</url>
<organization>Noelle Marie</organization>
<organizationUrl>http://noellemarie.com</organizationUrl>
<roles>
<role>tester</role>
</roles>
<timezone>-5</timezone>
<properties>
<gtalk>some.name@gmail.com</gtalk>
</properties>
</contributor>
</contributors>
环 境 设 置
Issue Management
定 义 相 关 的 bug 跟踪系 统 ,如 bugzilla,testtrack,clearQuest 等
<issueManagement>
<system>Bugzilla</system>
<url>http://127.0.0.1/bugzilla</url>
</issueManagement>
Continuous Integration Management
连续 整合管理,基于 triggers 或者 timings
<ciManagement>
<system>continuum</system>
<url>http://127.0.0.1:8080/continuum</url>
<notifiers>
<notifier>
<type>mail</type>
<sendOnError>true</sendOnError>
<sendOnFailure>true</sendOnFailure>
<sendOnSuccess>false</sendOnSuccess>
<sendOnWarning>false</sendOnWarning>
<configuration><address>continuum@127.0.0.1</address></configuration>
</notifier>
</notifiers>
</ciManagement>
Mailing Lists
<mailingLists>
<mailingList>
<name>User List</name>
<subscribe>user-subscribe@127.0.0.1</subscribe>
<unsubscribe>user-unsubscribe@127.0.0.1</unsubscribe>
<post>user@127.0.0.1</post>
<archive>http://127.0.0.1/user/</archive>
<otherArchives>
<otherArchive>http://base.google.com/base/1/127.0.0.1</otherArchive>
</otherArchives>
</mailingList>
</mailingLists>
SCM
软 件配置管理,如 cvs 和 svn
<scm>
<connection>scm:svn:http://127.0.0.1/svn/my-project</connection>
<developerConnection>scm:svn:https://127.0.0.1/svn/my-project</developerConnection>
<tag>HEAD</tag>
<url>http://127.0.0.1/websvn/my-project</url>
</scm>
Repositories
配置同 setting.xml 中的 开发库
Plugin Repositories
配置同 repositories
Distribution Management
用于配置分 发 管理,配置相 应 的 产 品 发 布信息 , 主要用于 发 布,在 执 行 mvn deploy 后表示要 发 布的位置
1 配置到文件系 统
<distributionManagement>
<repository>
<id>proficio-repository</id>
<name>Proficio Repository</name>
<url>file://${basedir}/target/deploy</url>
</repository>
</distributionManagement>
2 使用 ssh2 配置
<distributionManagement>
<repository>
<id>proficio-repository</id>
<name>Proficio Repository</name>
<url>scp://sshserver.yourcompany.com/deploy</url>
</repository>
</distributionManagement>
3 使用 sftp 配置
<distributionManagement>
<repository>
<id>proficio-repository</id>
<name>Proficio Repository</name>
<url>sftp://ftpserver.yourcompany.com/deploy</url>
</repository>
</distributionManagement>
4 使用外在的 ssh 配置
编译扩 展用于指定使用 wagon 外在 ssh 提供,用于提供你的文件到相 应 的 远 程服 务 器。
<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>
5 使用 ftp 配置
<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.wagon</groupId>
<artifactId>wagon-ftp</artifactId>
<version>1.0-alpha-6</version>
</extension>
</extensions>
</build>
repository 对应 于你的 开发库 ,用 户 信息通 过 settings.xml 中的 server 取得
Profiles
类 似于 settings.xml 中的 profiles ,增加了几个元素,如下的 样 式:
<profiles>
<profile>
<id>test</id>
<activation>...</activation>
<build>...</build>
<modules>...</modules>
<repositories>...</repositories>
<pluginRepositories>...</pluginRepositories>
<dependencies>...</dependencies>
<reporting>...</reporting>
<dependencyManagement>...</dependencyManagement>
<distributionManagement>...</distributionManagement>
</profile>
</profiles>
准 备 工作:
下 载 必 须 的 软 件:
maven2: http://maven.apache.org/download.html 最主要的
maven-proxy :用来代理 repository ,使用代理来 访问 多个 远 程 库
http://maven-proxy.codehaus.org/
continuum :一个不 错 的持 续 整合工具,用于自 动 build 。 支持ant,maven
http://maven.apache.org/continuum/
svn:版本控制工具
创 建一致的 开发环 境
在共享的 开发环 境中,更好的建 议 是保持maven的两个不同的配置文件分 别 管理,包括共享和用 户 自定 义设 置。共同的配置包括在安装目 录 中,而 单 独的 开发设 置保存在用 户 本地目 录 。
全局的配置文件 settings.xml
// 公司内部 库 ,所有的 release 版本 ,serverid 对应 于 repository id ,用于在 deploy 时 , 访问 使用,主要保存用 户 名和密 码
<server>
<id>internal</id>
<username>${website.username}</username>
<password>${website.pwd}</password>
<filePermissions>664</filePermissions>
<directoryPermissions>775</directoryPermissions>
</server>
// 目前的 开发库 ,用于 snapshot 库
<server>
<id>snapshot</id>
<username>${website.username}</username>
<password>${website.pwd}</password>
<filePermissions>664</filePermissions>
<directoryPermissions>775</directoryPermissions>
</server>
</servers>
<profiles>
<!-- 定 义 核心 库 maven 镜 像 , 由 maven-proxy 实现 -->
<profile>
<id>central-repo</id>
<repositories>
<repository>
<id>central</id>
<name>Internal Repository</name>
<url>http://192.168.0.2:9999/repository</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>central</id>
<name>Internal Repository</name>
<url>http://192.168.0.2:9999/repository</url>
</pluginRepository>
</pluginRepositories>
</profile>
<!-- 定 义 内部 库 ,包括公司的所有 release 版本 -->
<profile>
<id>internal-repo</id>
<repositories>
<repository>
<id>internal</id>
<name>Internal Repository</name>
<url>http://192.168.0.2:8080/repo-local</url>
<releases>
<enabled>true</enabled>
<updatePolicy>never</updatePolicy>
<checksumPolicy>warn</checksumPolicy>
</releases>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>internal</id>
<name>Internal Plugin Repository</name>
<url>http://192.168.0.2:8080/repo-local</url>
<releases>
<enabled>true</enabled>
<updatePolicy>never</updatePolicy>
<checksumPolicy>warn</checksumPolicy>
</releases>
</pluginRepository>
</pluginRepositories>
</profile>
<!-- 定 义 内部 开发库 ,也可以合并 snapshot 和 release-->
<profile>
<id>snapshot-repo</id>
<repositories>
<repository>
<id>snapshot</id>
<name>Internal Repository</name>
<url>http://192.168.0.2:8080/repo-snapshot</url>
<snapshots>
<enabled>true</enabled>
<updatePolicy>interval:60</updatePolicy>
<checksumPolicy>warn</checksumPolicy>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>snapshot</id>
<name>Internal Plugin Repository</name>
<url>http://192.168.0.2:8080/repo-snapshot</url>
<snapshots>
<enabled>true</enabled>
<updatePolicy>interval:60</updatePolicy>
<checksumPolicy>warn</checksumPolicy>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<!-- 激活相 应 得配置 -->
<activeProfiles>
<activeProfile>central-repo</activeProfile>
<activeProfile>internal-repo</activeProfile>
<activeProfile>snapshot-repo</activeProfile>
</activeProfiles>
<!-- 插件默 认 groupId -->
<pluginGroups>
<pluginGroup>com.mycompany.plugins</pluginGroup>
</pluginGroups>
服 务 器 设 置典型是共同的,只有用 户 名需要在用 户环 境中 设 置。使用一致的定 义 来配置共同的 设 置
- profile定义了共同的因素,内部开发库,包括指定的组织或者部门发布的产品。这些库独立于核心开发库。
- 激活的profiles列表,用于激活相应的profile
- plugin 组只有当你的组织中有自己定义的插件,用于命令行运行在pom中定义。
<profiles>
<profile>
<id>property-overrides</id>
<properties>
<website.username>myuser</website.username>
<website.pwd>test</website.username>
</properties>
</profile>
</profiles>
</settings>
创 建共享 开发库
大多数 组织 将会 创 建自己的内部 开发库 ,用于配置,而中心 开发库 用于 连 接maven
设 置内部 开发库 是 简单 的,使用http 协议 ,可以使用存在的http 服 务 器。或者 创 建新的服 务 ,使用apache,或者jetty
假 设 服 务 器地址192.168.0.2 ,端口8080
http://192.168.0.2:8080/repo-local
设 置另外一个 开发库 ,用于 设 置 项 目的snapshot 库 http://192.168.0.2:8080/repo-snapshot
中心 镜 像 库 ,使用maven-proxy 创 建,当然也可以 创 建自己的 镜 像。用于下 载 本地 库 中没有的artifact
maven-proxy 设 置
从网上直接下 载 maven-proxy-standalone-0.2-app.jar 和 proxy.properties
在命令行中,直接运行java -jar maven-proxy-standalone-0.2-app.jar proxy.properties
主要的配置:
设 置repo.list 中增加相 应 的 库 就可以,如下定 义 :
repo.list=repo1.maven.org,...
#maven 的中心 库
repo.repo1.maven.org.url=http://repo1.maven.org/maven2
repo.repo1.maven.org.description=maven.org
repo.repo1.maven.org.proxy=one
repo.repo1.maven.org.hardfail=false
repo.repo1.maven.org.cache.period=360000
repo.repo1.maven.org.cache.failures=true
以后所有的 远 程 库 ,都通 过 此方式增加。 顺 便 说 一下,不要忘了注 释 原来的example,那是没有 办 法 访问 的。
其他配置如
端口号 port=9999
保存的位置 repo.local.store=target/repo
serverName=http://localhost:9999
创 建 标 准的 组织 pom
定 义 共同的内容,包括公司的 结 构,如 组织 ,部 门 以及 团队 。
察看一下 maven 的自身,可以作 为 很好的参考。
如 scm
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.apache.maven</groupId>
<artifactId>maven-parent</artifactId>
<version>1</version>
</parent>
<groupId>org.apache.maven.scm</groupId>
<artifactId>maven-scm</artifactId>
<url>http://maven.apache.org/maven-scm/</url>
...
<modules>
<module>maven-scm-api</module>
<module>maven-scm-providers</module>
...
</modules>
</project>
在 maven 父 项 目中可以看到如下定 义 :
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.apache</groupId>
<artifactId>apache</artifactId>
<version>1</version>
</parent>
<groupId>org.apache.maven</groupId>
<artifactId>maven-parent</artifactId>
<version>5</version>
<url>http://maven.apache.org/</url>
...
<mailingLists>
<mailingList>
<name>Maven Announcements List</name>
<post>announce@maven.apache.org</post>
...
</mailingList>
</mailingLists>
<developers>
<developer>
...
</developer>
</developers>
</project>
<modelVersion>4.0.0</modelVersion>
<groupId>org.apache</groupId>
<artifactId>apache</artifactId>
<version>1</version>
<organization>
<name>Apache Software Foundation</name>
<url>http://www.apache.org/</url>
</organization>
<url>http://www.apache.org/</url>
...
<repositories>
<repository>
<id>apache.snapshots</id>
<name>Apache Snapshot Repository</name>
<url>http://svn.apache.org/maven-snapshot-repository</url>
<releases>
<enabled>false</enabled>
</releases>
</repository>
</repositories>
...
<distributionManagement>
<repository>
...
</repository>
<snapshotRepository>
...
</snapshotRepository>
</distributionManagement>
</project>
对 于 项 目自身来 说 ,父 pom 很少更新。所以,最后的方式保存父 pom 文件在 单 独的版本控制区域,它 们 能 够 check out ,更改和配置 .
使用Continuum持久整合
持 续 整合自 动 build 你的 项 目,通 过 一定的 时间 ,包括所有的冲突在早期察 觉 ,而不是 发 布的 时 候。另外持 续 整合也是一 种 很好的 开发 方式,使 团队 成 员 能 产 生 细 微的,交互的 变动 ,能更有效的支持平行 开发进 程。
可以使用 maven 的 continuum 作 为 持久整合的服 务 。
安装 continuum ,比 较简 ,使用以下的命令:
C:\mvnbook\continuum-1.0.3> bin\win32\run
可以通 过 http://localhost:8082/continuum 来 验证
为 了支持 continuum 发 送 e-mail 提醒,你需要相 应 的 smtp 服 务 用于 发 送信息。默 认 使用 localhost:25 ,如果你没有 设 置, 编辑 上面的文件改 变 smtp-host 设 置。
下一 步 , 设 置 svn 目 录 :
svn co file://localhost/C:/mvnbook/svn/proficio/trunk proficio
编辑 pom.xml 用于正确相 应 得 e-mail 地址。
...
<ciManagement>
<system>continuum</system>
<url>http://localhost:8080/continuum
<notifiers>
<notifier>
<type>mail</type>
<configuration>
<address>youremail@yourdomain.com</address>
</configuration>
</notifier>
</notifiers>
</ciManagement>
...
<scm>
<connection>
scm:svn:file://localhost/c:/mvnbook/svn/proficio/trunk
</connection>
<developerConnection>
scm:svn:file://localhost/c:/mvnbook/svn/proficio/trunk
</developerConnection>
</scm>
...
<distributionManagement>
<site>
<id>website</id>
<url>
file://localhost/c:/mvnbook/repository/sites/proficio
/reference/${project.version}
</url>
</site>
</distributionManagement>
提交相 应 的pom,然后 执 行mvn install
如果你返回http://localhost:8082/continuum,你会看到相 应 的 项 目列表。
一旦你登 录 后,你可以 选择 mavan 2.0 项 目用于增加相 应 的 项 目。你可以增加你的url或者提交你的本地内容。
你可以使用本地 pom url ,如下 file://localhost/c:mvnbook/proficio/pom.xml
在提交了此 url 后, continuum 将会返回相 应 的成功信息。
以下的原 则 用于更好的帮助持 续 整合:
早提交, 经 常提交:当用 户经 常提交 时 ,持 续 整合是最有效的。 这 并不意味着,提交不正确的代 码 。
经 常运行build:用于最快 检测 失 败
尽快修正失 败 :当失 败发 生 时 , 应该马 上修正失 败
建 议 一个有效的版本
运行clean build
运行 复杂 的 综 合 测试
build 所有的 项 目 结 构分支
持 续 运行 项 目的拷 贝
=====
下载e
下载exe可安装的那种。
设maven安装在目录D:"Maven,
下面设置环境变量:
Maven_Home=D:"Maven
在PATH中加入;%Maven_Home%"bin
Maven默认的remote repository是ibiblio.org,这个地方有些人上不去,因此要更改一下。Maven找寻配置参数的默认的顺序是从maven.jar中的defaults.properties开始。打开该文件,修改:
maven.repo.remote = http://apache.linuxforum.net/dist/java-repository, http://dist.codehaus.org,http://mirrors.sunsite.dk/maven/, http://public.planetmirror.com/pub/maven,http://www.ibiblio.org/maven |
Maven默认的本地文件保存在Document and Setting的user.home里面,非常不便。在%MAVEN_HOME%下建立一个local目录,将本地的repostiory保存在此,以免重装系统丢失。
maven.home.local = ${maven.home}/local |
Maven的提示语言在中文环境中可能出现乱码,进入maven.jar,发现org"apache"maven"messages目录下的messages_zh_CN.properties里面直接写了中文字符。删掉它!就不会乱码了。(或者用native2ascii转换)
好了,可以开工了。执行maven genapp,采用web模版。id设定为sample。输入maven eclipse,为该项目增加eclipse支持。
进入eclipse,导入workspace下面的Sample Project。由于缺少MAVEN_REPO变量,Eclipse提示编译失败。
在Eclipse的Preferences – Java - Build Path - Classpath Variables中添加名为MAVEN_REPO的变量,指向D:"maven"local"repository。
如果想让eclipse支持直接运行maven的goal,可以安装mavenide插件。
xe可安装的那种。
设maven安装在目录D:"Maven,
下面设置环境变量:
Maven_Home=D:"Maven
在PATH中加入;%Maven_Home%"bin
Maven默认的remote repository是ibiblio.org,这个地方有些人上不去,因此要更改一下。Maven找寻配置参数的默认的顺序是从maven.jar中的defaults.properties开始。打开该文件,修改:
maven.repo.remote = http://apache.linuxforum.net/dist/java-repository, http://dist.codehaus.org,http://mirrors.sunsite.dk/maven/, http://public.planetmirror.com/pub/maven,http://www.ibiblio.org/maven |
Maven默认的本地文件保存在Document and Setting的user.home里面,非常不便。在%MAVEN_HOME%下建立一个local目录,将本地的repostiory保存在此,以免重装系统丢失。
maven.home.local = ${maven.home}/local |
Maven的提示语言在中文环境中可能出现乱码,进入maven.jar,发现org"apache"maven"messages目录下的messages_zh_CN.properties里面直接写了中文字符。删掉它!就不会乱码了。(或者用native2ascii转换)
好了,可以开工了。执行maven genapp,采用web模版。id设定为sample。输入maven eclipse,为该项目增加eclipse支持。
进入eclipse,导入workspace下面的Sample Project。由于缺少MAVEN_REPO变量,Eclipse提示编译失败。
在Eclipse的Preferences – Java - Build Path - Classpath Variables中添加名为MAVEN_REPO的变量,指向D:"maven"local"repository。
如果想让eclipse支持直接运行maven的goal,可以安装mavenide插件。
本文转自kenty博客园博客,原文链接http://www.cnblogs.com/kentyshang/archive/2008/01/18/1044741.html如需转载请自行联系原作者
kenty