Maven1.0已经历了几年的时间,并且作为Ant的替代品已被广大的开发人员所接收,但它并没有在很大程度使开发人员从Ant的 build.xml文件中解脱出来。Maven1.0速度慢并且笨拙,使用起来的困难度并不亚于使用Ant的项目。事实上,它的核心是基于Ant实现的。 在经过了几乎彻底的重写后,Maven2.0诞生了。
一个Java项目中最困难的地方就是如何着手启动它。在启动项目之前,我们必须配置好所有 的逻辑关系。比如,Java源代码应该放在何处?单元测试应该在何处进行?依赖的jar包应该如何放置?如何构建项目,如何形成文档,如何测试和部署项目?在这种情况下,开发人员不同的处理选择将会影响项目的余下部分。您的选择可能会使你陷入困境,也可能会在将来证明您是一位Java架构大师。我们假定后者是我们奋斗的目标,接下来就进入我们的正题。
构建一个Java项目可以使用很多工具,其中包括Ant。Ant作为一款具有革命性的工具,一直是众多开发者使用工具中的首选,它能使开发人员摆脱 使用大量make命令的苦海。对于那些不太熟悉make命令的人来说,他们有充足的理由来表明使用命令并不是构建Java项目的最好工具,因为它不具备平 台独立性并且不易使用。Ant的出现解决了以上的问题,它使用了一个平台独立的工具,该工具能够解析XML配置文件,即build.xml。虽然Ant由 于其诸多的优点而备受欢迎,但它同样有一些缺点。build.xml文件由于采用了极其简短的描述方式,使得开发人员需要预先学习它的语法。虽然学习曲线不是很陡峭,但Java开发人员更应该把时间放在开发上面。
Maven是新一代的生力军,它的境遇正好和几年前的Ant十分类似。Maven1.0已经历了几年的时间,并且作为Ant的替代品已被广大的开发 人员所接收,但它并没有在很大程度使开发人员从Ant的build.xml文件中解脱出来。Maven1.0速度慢并且笨拙,使用起来的困难度并不亚于使 用Ant的项目。事实上,它的核心是基于Ant实现的。在经过了几乎彻底的重写后,Maven2.0诞生了。
Maven2.0的优点
Maven2.0有许多很好功能,这些功能不仅仅是帮助您构建项目。如果您刚刚开始启动一个Java项目,并且想使该项目快速地开展下去,Maven2.0能够在几分钟内达到您的要求。以下是Maven2.0的一些优点:
–标准的项目布局和项目结构生成器
–标准的依赖管理机制
–多项目支持
–在开发者需要的时候及时地下载新的插件和功能部件
–生成最新项目信息的网站
–集成了源代码控制软件:CVS和Subversion
以上列表展示的只是Maven2.0特点中的一小部分。但这足以使Maven2.0成为一个构建管理系统可靠的选择。既然我们已经知道Maven是个什么东西了,接下来让我们看看如何使用它。
入门
我们要做的第一件事情就是设置目录结构,但这并不需要让我们手动设置,Maven会根据您开发的项目类型来为您做这件事。一旦您下载并解压了最新发 布的Maven 2.0,您应该将Maven所在目录下面的bin目录添加到您的系统路径下。您可以运行命令mvn -version来测试您的安装。
既然已经安装上了工具,让我们看看创建一个简单的Java项目的例子。Maven使用原型来决定目录结构是如何展现的。Maven自带了几个内建的原型,您也可以自定义原型。
mvn archetype:create -DgroupId=com.oreilly -DartifactId=my-app
您看,这就生成了我们的项目布局。
my-app
—-src
—-main
—-java
—-com
—-oreilly
—-test
—-java
—-com
—-oreilly
对,就这么简单。这种目录结构可以通过创建一个新的原型来覆写,但并不推荐这么做,因为Maven的一个优点就是使用标准的目录结构。该目录结构包 含两个源代码树,一个是Java应用程序的源代码,另一个是单元测试代码。同时您也许会注意到,当第一次运行Maven的时候,它会进行一些下载工作。当 您开始调用工具时,Maven会根据您使用的插件来更新自身的一些所需功能。Maven默认会从Ibiblio存储库中得到更新。您可以在Maven安装 目录下的conf目录中,或者项目自身中修改Maven远程存储库的选择。
您会发现Maven在my-app目录下创建了一个pom.xml文件。这是项目的最基本部分。pom.xml文件包含了一组指令,这些指令告诉 Maven如何构建项目和包含哪些其它的特殊指令(POM是“项目对象模型”的缩写)。在默认的情况下,Maven包含了JUnit的依赖以此来鼓励单元 测试。
xsi:schemaLocation=”http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd”>
4.0.0
com.oreilly
my-app
jar
1.0-SNAPSHOT
Maven Quick Start Archetype
http://maven.apache.org
junit
junit
3.8.1
test
创建完项目后,我们可以往项目里添加代码并使用Maven的所有全新技巧。注意以下命令必须在pom.xml文件所在的目录中运行。
–mvn test:运行应用程序中的单元测试
–mvn package:依据项目生成jar文件
以备依赖此项目时使用l–mvn install:将项目的jar文件添加到库中,
–mvn site:生成项目相关信息的网站
–mvn clean:清除目标目录中的生成结果
–mvn eclipse:eclipse:生成Eclipse项目文件
接下来我们看看稍微复杂点的地方,我们知道手动开始一个Java web项目比手动开始一个简单的Java项目更耗时,然而Maven的使用则能化难为易。下面的例子(实际上是一行命令)展现了项目结构的构造。
mvn archetype:create -DgroupId=com.oreilly
-DartifactId=Oreilly
-DarchetypeArtifactId=maven-archetype-webapp
生成的结果结构如下所示:
Oreilly
—-src
—-main
—-resources
—-webapp
—-WEB-INF
这一次,我们的项目由于支持了将包含在war文件中的web资源而设置有所不同。pom.xml文件中将包含一行来表明项目应该被打包成war文件:
war。现在就可以使用mvn package命令来生成war文件。不用担心如何从WEB-INF/lib目录中得到依赖项,在依赖属性值被设置成compile的情况下,Maven 会自动包含依赖项。也可以将以下代码添加到pom.xml文件中来改变war文件的名称:
PromoteC
依赖管理
创建好项目结构,添加完一些代码,测试并编译好应用程序后,接下来可以看看Maven是如何处理依赖关系的。为了给项目添加一个依赖项,必须将此依 赖项添加到pom.xml文件中。下次运行Maven的时候,它将从Ibiblio存储库中得到这个依赖项,并且将此依赖项添加到项目构建路径中。
关于依赖的问题有几个重要的事情值得注意。在写这篇文章的时候,Maven中最大的麻烦之处就是不能从Maven存储库中获取Sun的jar文件。 这个问题归因于Sun在其代码中设置的许可证限制。解决这个问题的办法有两种,一种是下载这些代码并将它们安装在您本地的存储库中,另一种是做一个外部声明,并将这个声明指向文件系统中依赖项所在的位置。希望Sun能够尽早地创建自己的存储库,尽管如此,Maven也会被升级来使之能够下载这些资源,只是 在下载之前它会提示用户接受许可证协议。
另外一个麻烦的地方就是有时候使用的最新的库文件可能在远程存储库中不存在。另一种可能是由于无法访问Internet,需要所有的依赖项都能在本 地获取。这些问题的最好解决方案就是将jar文件安装到本地的存储库中。将本地的存储库放在一台web服务器上也同样是个便利之举,这样整个开发团队就能 从此获益,每个人都没有必要去管理自己的存储库了。改变Maven的存储库路径只需简单地编辑其安装目录下conf文件夹下面的settings.xml 文件即可。
在Maven中使用依赖是简单的。让我们看看往上述pom.xml文件中添加一个依赖项的情况。我们虽然已经使用了JUnit,但让我们将功能强大的Quartz库添加到项目中。Quartz是一款用纯Java编写的关于时间安排的开源项目,它是您时间安排需求方面的很好的选择。
quartz
quartz
1.5.1
compile
我们仅仅只需添加这个元素,Maven就能下载Quartz并将其作为项目中的一个依 赖项。不用担心Quartz的依赖项,一个Maven的存储库将包含依赖项自身依赖的资源信息,当Maven下载Quartz的时候,它自身的依赖资源也 同样会被下载。为了验证版本为1.5.1的Quartz存在于Ibiblio库中,我们可以浏览Maven存储库。注意到scope参数的使用,它告诉了 Maven依赖项在何种阶段是所需的。在使用JUnit的情况下,我们设置scope参数的值为test来告诉Maven这个依赖项只是在测试阶段所需的,而不是运行时所需的资源。以下是scope参数值的说明:
–compile:默认值。表明是所有任务所需的资源
–test:运行所有的测试用例时所需资源
–runtime:表明是运行时所需资源
–provided:JDK部分或应用服务器的classpath所需的资源
现在,如何处理那些麻烦的Sun的jar包和那些需要但却不能在远程存储库中找到的jar包了?我们必须使用Maven来手动将这些jar包安装到 本地的存储库中。不用担心,这没有听上去那么困难。为了做个示例,我们将安装Java Activation框架的jar包。首先我们必须从Sun的站点上下载此jar包,接着我们使用Maven将它导入本地的存储库中。您自己也可以按照 Maven上传资源指南中的指导将缺少的jar包安装到Ibiblio中。
mvn install:install-file -Dfile=activation.jar
-DgroupId=javax.activation -DartifactId=activation
-Dversion=1.0 -Dpackaging=jar
现在,新的jar包就像其它的项目依赖项一样安装到了本地存储库中。在只需添加依赖声明后,我们就已准备就绪了。在添加jar包和声明它们为依赖项 时,必须确保版本信息的正确性。版本的不匹配会导致Maven在寻找资源时的失败。在导入Sun的jar包时,如果您需要寻求标准命名参数的帮助,可以参 考Sun标准jar包命名。记住,在目前您不能通过存储库来公开发布这些jar包,这将违反Sun的使用条款。
javax.activation
activation
1.0
compile
您或许想将依赖项存入一个源代码控制器的库中,源代码控制器决不能执行这个任务。依赖项是经常变化的,并且通常有一套数字方案来标明其版本。这就是说,您明确地希望有一个内部远程存储库的备份,如果您有一个,这将确保在存储库服务器崩溃并且不能恢复的情况下,您不会丢失所有的自定义资源。不将依赖项 放入源代码控制器中也会节省源代码控制器的存储库服务器上的大量磁盘空间。
配置存储库
要求项目的每个开发者必须在conf目录中配置存储库是不方便的,所以Maven可以同时查看多个存储库并且将它们全部配置在pom.xml文件 中。让我们看看一个例子,它展示了如何在应用程序用使用多个存储库。在以下从pom.xml文件摘录的片断中,我们设置了两个存储库来让Maven寻找依 赖项。Ibiblio一直是默认的存储库,我们又添加了Planet Mirror作为后援存储库。我们也可以让团队使用的本地web服务器作为第二个存储库。
Ibiblio
Ibiblio
http://www.ibiblio.org/maven/
PlanetMirror
Planet Mirror
http://public.planetmirror.com/pub/maven/
使用pom.xml父文件来构建多个项目
软件公司通常的一种做法就是将多个项目构建到主要产品中。维护依赖关系链和一次性地构建整个产品足以成为一个挑战,但是如果使用Maven的话,事 情将变得简单。如果您创建了一个指向其它子模块的pom.xml父文件,Maven将为您处理整个构建过程。它将分析每个子模块的pom.xml文件,并且按照这些子模块的相互依赖顺序来构建项目。如果每个项目明确地指明它们的依赖项,那么子模块在父文件中的放置顺序是不造成任何影响的。但是考虑到其他的 开发者,最好保证子模块在pom.xml父文件中的放置顺序和您期望的子项目被构建的顺序一样。下面我们看个示例。
pom.xml主文件如下:
4.0.0
com.oreilly
1.0-SNAPSHOT
my-app
pom
Common
Utilities
Application
WebApplication
我们需要确保WebApplication子模块包含了所有的三个jar包,所以需要将这些jar包声明为依赖项。在这个例子中, Utilities项目依赖于Common项目,所以Utilities项目中需要添加一个对Common项目的依赖。Application子模块也是 同样的道理,因为它依赖于Common和Utilities项目,Utilities又赖于Common。如果这个例子中有60个子模块,并且它们都相互 依赖,这会使得新开发者难以算出什么项目依赖于其它项目,所以这正好是要求确保pom.xml父文件中项目放置顺序要清除的原因。
以下是Utility模块的依赖项:
com.oreilly
Common
1.0-SNAPSHOT
以下是如何声明Application模块的依赖项:
com.oreilly
Common
1.0-SNAPSHOT
com.oreilly
Utilities
1.0-SNAPSHOT
最后是WebApplication模块的依赖项:
com.oreilly
Common
1.0-SNAPSHOT
com.oreilly
Utilities
1.0-SNAPSHOT
com.oreilly
Application
1.0-SNAPSHOT
现在,我们只需为每个子模块的pom.xml文件添加一个元素来表明它们是一个逻辑构建的一部分:
com.oreilly
my-app
1.0-SNAPSHOT
在pom.xml父文件所在的同一个目录中,存在有项目目录:Common, Utilities, Application, 和WebApplication。当我们在该目录中运行mvn package命令时,这些项目会按照依赖顺序而被构建。
插件和报表
Maven2.0有大量的插件可以使用。不幸的是,由于Maven的重写,Maven1.0的插件不能在2.0中使用。尽管如此,还是存在一些可以 使用的Maven2.0的插件。下面pom.xml文件中的插件配置示例是直接从Maven2.0网站上得来的。这个插件是用来配置编译选项的。
org.apache.maven.plugins
maven-compiler-plugin
1.5
1.5
Maven报表插件可以用来生成不同的报表,这些报表是在当你使用mvn site命令生成项目的站点时产生的。下面的例子展示了如何使用元素来配置这类插件中的一个。
org.apache.maven.plugins
maven-project-info-reports-plugin
Maven Plugin Matrix是一个十分实用的工具,它能给出哪些Maven插件适合于哪些版本的Maven。
Maven 和 Eclipse如何能使全世界最好的IDE变得更好了?答案是使用Maven2的插件,它能帮助您寻找依赖项并自动地将它们添加到pom.xml文件中。虽然最好的方法是 首先使用Maven来创建您的项目,然后再用命令mvn eclipse:eclipse来生成Eclipse项目文件,这样最初就能得到一个好的目录结构,但Maven也可通过其Eclipse插件来管理任何 项目。您可以在Eclipse自身的升级器中输入站点http://m2eclipse.codehaus.org/ 来安装插件。在安装完成并重启IDE后,您需要在Eclipse的参数选项中配置此插件,设置本地存储库的位置。这是很重要的一步,因为如果 Eclipse默认的存储库不能匹配您默认的需求,Maven会重新下载您的依赖项。配置完成后,将项目导入Eclipse,鼠标右击该项目,选择 Maven 2 -> Enable。现在您可以回到之前的步骤,您可以有更多的选项比如添加依赖项,这将弹出一个搜索框,您可以搜索依赖项并添加它们,插件会替你编辑 pom.xml文件。
插件会使用Maven来构建您的项目,就像Eclipse使用Ant来构建项目一样。如果您想获取更多的关于Eclipse整合Maven的信息,可以查阅Maven站点上的Eclipse集成Maven 2.x使用指南。
另一方面,如果您是一个IntelliJ使用爱好者,您也能通过运行指令mvn idea:idea来完成同样的任务。这些IDE 工具能够节省开发人员的时间。例如,如果一个开发人员为一个项目添加了一些特征,团队里的其他开发人员只需从源代码控制器的存储库中重新获取项目文件即可,这就节省了每个开发人员必须配置IDE的时间。
结论
Maven2.0有着许多实用的特点,并且完成任务十分出色。Maven中最值得称赞的地方就是使用了标准的目录结构和部署。这就 使得开发人员能够适应不同的项目,并且不用学习任何结构方面新的东西,也不用掌握特殊的指令来构建结构。Maven可以通过纯脚本来实现。在文档方面,由 于使用了项目站点构建工具,所以当项目构建完成后,您可以查看所有开发的当前状态。
毫无疑问,当提到构建配置的伸缩性,易用性和项目管理方面时,Maven2.0足可以将Ant取而代之。在接下来的几年内,我们将 看到Maven作为标准构建技术更多的使用,直到有人带来了大家公认的“高级捕鼠器”。您可以从下面列出的Maven项目站点上下载Maven。
资源
Matrix:http://www.matrix.org.cn
Onjava:http://www.onjava.com
Maven项目站点
相关文档_
使用ant发布war包build.xml的配置[转]
使用Maven构造Turbine项目
用Maven进行项目管理
Magic Maven
Maven安装全程指南
Maven最初的目的是在Jakarta Turbine项目中使构建处理简单化。几个项目之间使用到的Ant build文件差异很小,各个JAR都存入CVS。因此希望有一个标准的方法构建各个工程,清晰的定义一个工程的组成,一个容易的方法去发布项目信息并且去提供一种在各个项目之间共享JAR包。
结果出现了一种功能能用于构建和管理任何基于java的工程。Maven小组希望他们已经做到了一些事情,这将有助于Java开发者更容易的完成每天的工作并且有助于理解任何基于java的项目。
Maven的目标是:
· 使构建过程更容易
· 提供统一构建系统
· 提供高质量的项目信息
· 提供开发的最佳实践指南
· 能无缝的加入新的特性
对Maven的错误理解
· Maven是一个站点和文档制作工具。
· Maven扩展了Ant,使其能下载到各种依赖包
· Maven是一系列可重用的Ant脚本
Maven的版本。
Maven现在主要有Maven 1.x和Maven 2.x,其中现在最新版本是Maven 2.02。
Maven 2完成了对Maven 1的重写。重写的首要目的是要提供了强大的Jave构建和包含API的项目,允许Maven被植入任何地方,尤其是高级别的产品如IDEs、质量工具、报告工具等这些。Maven 2构建生命周期的概念正式化,其比Maven更易扩展。
因此现在我们主要研究的就是Maven 2。
1. Windows 2000/xp下的安装
1. 解压缩maven-2.0.2-bin.zip到你希望安装Maven 2.0.2的所在目录。这里假设你选择了C:\ProgramFiles\Apache Software Foundation\maven-2.0.2.
2. 将C:\Program Files\Apache Software Foundation\maven-2.0.2\bin目录加入到你的%path%环境变量中。
3. 同时,确认JAVA_HOME是否正确设置成功。
4. 运行 mvn --version 确认是否安装成功。
显示Maven version: 2.0.2 则表示安装成功。
2. 基于Unxi-based的操作系统(Linux,Solaris and Mac OS X)
1. 解压缩发布包到你希望安装Maven 2.0.2的所在目录。这里假设你选择了/usr/local/maven-
2. 将/usr/local/maven-2.0.2/bin目录加入到你的path环境变量中,例如:PATH=/usr/local/maven-2.0.2y/bin: $PATH。
3. 同时,确认JAVA_HOME是否正确设置成功。
4. 运行 mvn --version 确认是否安装成功。
显示Maven version: 2.0.2 则表示安装成功。
Maven是一种对项目的管理工具,它提供了一种方式来管理以下项目中涉及到的工作内容,同时以下也是Maven的主要功能:
· 构建项目(Builds)
· 文档编制(Documentation)
· 报告(Reporting)
· 依赖管理(Dependencies)
· 配置管理(SCMs)
· 发布管理(Releases)
1. 首先创建一个Maven工程
Maven可用于构建java应用工程和java web应用工程。
1. WebApp
mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=my-webapp
-DarchetypeArtifactId=maven-archetype-webapp
my-webapp
|-- pom.xml
`-- src
`-- main
|-- webapp
| |-- WEB-INF
| | `-- web.xml
| `--index.jsp
`-- resources
其他的目录则需要自己补充。
其pom.xml文件内容如下:
<project 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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany.app</groupId> <artifactId>my-webapp</artifactId> <packaging>war</packaging> <version>1.0-SNAPSHOT</version> <name>Maven Webapp Archetype</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> <build> <finalName>my-webapp</finalName> </build> </project>
|
2. App
mvn archetype:create -DgroupId=com.mycompany.ap -DartifactId=my-app
命令正确执行后,生成如下目录:
my-app
|-- pom.xml
`-- src
|-- main
| `-- java
| `-- com
| `-- mycompany
| `-- app
| `-- App.java
`-- test
`-- java
`-- com
`-- mycompany
`-- app
`-- AppTest.java
其pom.xml文件内容如下:
<project 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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany.ap</groupId> <artifactId>my-app</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>Maven Quick Start Archetype</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> </project> |
2. Maven项目的标准目录介绍
Maven提倡使用一个共同的标准目录结构,使开发人员能在熟悉了一个Maven工程后,对其他的Maven工程也能清晰了解。这样做也省去了很多设置的麻烦。
以下的文档介绍是Maven希望的目录结构,并且也是目录创建工程是采用的目录结构。Maven推荐大家尽可能的遵守这样的目录结构。
src/main/java |
Application/Library sources |
src/main/resources |
Application/Library resources |
src/main/filters |
Resource filter files |
src/main/assembly |
Assembly descriptors |
src/main/config |
Configuration files |
src/main/webapps |
Web application sources |
src/test/java |
Test sources |
src/test/resources |
Test resources |
src/test/filters |
Test resource filter files |
src/site |
Site |
LICENSE.txt |
Project's license |
README.txt |
Project's readme |
在顶级目录上是工程的描述文件pom.xml(如果使用Ant则还包括其他属性文件,maven.xml或build.xml),另外还包括提供给最终用户的文件,如,README.txt, LICENSE.txt等等。
顶级目录还包括两个子目录:src,target。顶级目录下可能出现的其他目录仅仅是CVS或.svn和其他多模块工程的工程目录,最好不要再有其他目录。
Target目录是所有工程编译构建的输出目录。
Src目录包含所有工程的源码文件,配置文件,资源文件等等。它下面的子目录一般包含main(主要的工程源文件),test(测试文件),site(项目站点文件)。
3. 项目构建的生命周期的介绍
Maven 2是围绕着构建生命周期概念设计的。这意味着,构建或者发布的过程已经被清晰的定义了。
当我们使用Maven构建工程时,我们只需要了解几个Maven定义好的命令即可,其他的工作则交给POM来完成。
以下给出Maven提供的构建生命周期列表:
validate |
validate the project is correct and all necessary information is available. |
generate-sources |
generate any source code for inclusion in compilation. |
process-sources |
process the source code, for example to filter any values. |
generate-resources |
generate resources for inclusion in the package. |
process-resources |
copy and process the resources into the destination directory, ready for packaging. |
compile |
compile the source code of the project. |
process-classes |
post-process the generated files from compilation, for example to do bytecode enhancement on Java classes. |
generate-test-sources |
generate any test source code for inclusion in compilation. |
process-test-sources |
process the test source code, for example to filter any values. |
generate-test-resources |
create resources for testing. |
process-test-resources |
copy and process the resources into the test destination directory. |
test-compile |
compile the test source code into the test destination directory |
test |
run tests using a suitable unit testing framework. These tests should not require the code be packaged or deployed. |
package |
take the compiled code and package it in its distributable format, such as a JAR. |
pre-integration-test |
perform actions required before integration tests are executed. This may involve things such as setting up the required environment. |
integration-test |
process and deploy the package if necessary into an environment where integration tests can be run. |
post-integration-test |
perform actions required after integration tests have been executed. This may including cleaning up the environment. |
verify |
run any checks to verify the package is valid and meets quality criteria. |
install |
install the package into the local repository, for use as a dependency in other projects locally. |
deploy |
done in an integration or release environment, copies the final package to the remote repository for sharing with other developers and projects. |
因此,当我们构建一个项目时,只需要了解自己希望做什么,然后执行以上对应的生命周期即可。
例如,我们希望编译我们的工程。在命令行状态下进入到工程的pom.xml文件所在的目录中,使用命令:mvn compile;希望构建打包我们的工程,使用mvn package即可。
当然了,maven的构建生命周期也是可以扩展和自定义的,这里就先不做介绍了。
4. pom.xml的介绍
pom.xml包含了一个项目的项目对象模型(POM)。项目对象模型(POM)是Maven工作的基本单元。请记住,这个是非常重要的,因为POM包含了工程的非常重要的信息块,并且基本上包含了和项目相关的任何要素。
让我们熟悉一下pom.xml包含的基本项:
· poject 这是pom.xml的顶级元素。
· modelVersion 这是元素指出了这个POM使用的是那个版本的对象模型。这个模型的版本自身么是经常改变的,但这种改变是为了使模型更加的稳定。
· groupId 这个元素指出创建这个工程的组织或团队的唯一标识,并且这个也是一个项目的关键标识,推荐使用这个组织或团队的完整域名。例如:org.apache.maven.plugins是为Maven plug-ins定义的groupId。
· artifactId 这个元素指出这个工程的主要制品的基本名称。一个工程的主要制品如果是jar文件,次要制品如果是源码包,则次要制品的名称的一部分也使用artifactId。典型的制品名称使用这样的格式:<artifactId>-<version>.<extension>(例如,myapp-1.0.jar)。
· packaging 这个元素指出制品的类型(例如:JAR,WAR,EAR等等)。这个元素不仅仅指示出制品的类型,同时也指示出工程构建过程中的部分生命周期。Packaging的默认值是JAR。
· version 这个元素指出这个项目产生的制品的版本号,Maven在帮助开发人员管理版本号时走了很长的路,以后你将经常看到SNAPSHOT在一个版本中,这个表示一个工程仍然在开发状态。
· name 这个元素指出这个工程显示的名称。这个常用于Maven产生的文档中。
· url 这个员算指出在哪里能发现工程的站点。这个常用于Maven产生的文档中。
· desription 这个元素提供了这个工程基本的描述。这个也常用于Maven产生的文档中。
以上只是pom.xml中的一些基本项,完整的pom.xml的元素介绍请参考:
http://maven.apache.org/maven-model/maven.html
1. 文档创建:
对于如何创建和编制文档,maven有一个简单的示例命令:
mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-site |
执行了以上命令后,我们将得到这样一个目录结构:
my-app |-- pom.xml `-- src |-- site |-- apt | |-- format.apt | `-- index.apt |-- fml | `-- faq.fml |-- fr | |-- apt | | |-- format.apt | | `-- index.apt | |-- fml | | `-- faq.fml | `-- xdoc | `-- xdoc.xml |-- site.xml |-- site_fr.xml `-- xdoc `-- xdoc.xml |
你现在可以看到一个$basedir/src/site目录,以及它包含的一些站点描述文件(site.xml,site_fr_xml),和各种maven支持的文档格式相对应的目录和示例文档都已经产生。
以上的创建只是示例,我们自己创建时就没有命令行使用了,只能按照上面的目录结构创建我们需要的文档,并在文档中写入我们工程的信息。
让我们再来看看maven所支持的文档格式。
2. 文档格式:
Maven支持3种文档格式:
· Xdoc format
这个是一种简单快捷的,基于original Anakia format的文件格式。
· APT format
“Almost Plain Text”,(接近普通文本格式),这是一种允许你采用接近普通文本格式的方式简单的写出类似于wiki格式的结构性文档。
如果你对此很感兴趣,请参考完整的APT format的书写规范
http://maven.apache.org/guides/mini/guide-apt-format.html
· FML formate
这个是一种FAQ结构形式的文档格式。
了解了以上的文档格式,我们就可以按照以上文档格式的要求,选用我们喜欢的文档格式编写我们的文档。当编写完成后,我们需要生成所有文档。这里生成文档,maven的处理是生成站点(site),也就是身成html页面,这样所有对此项目感兴趣的人员都可以通过访问此站点来了解所有的信息。生成站点的命令是:
mvn site |
3. 文档国际化:
当然,你可能早就想到文档国际化的问题,这里maven也早就处理了。在pom.xml中
<project> ... <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-site-plugin</artifactId> <configuration> <locales>en,fr</locales> </configuration> </plugin> </plugins> ... |
注意到<locales>en,fr</locales>了吗?这里就支持了英语(en)和法语(fr)两种语言的文档。请注意以下生成的目录,由于英语是在第一个,属于默认语言,所以$basedir/src/site目录下并没有en的文件夹,而有fr的文件夹,而且这个文件夹里包含了maven支持的文档格式相对应的目录和示例文档。
Maven有多个报告能添加在你的文档站点中,来显示项目当前的状态,这些报告采用插件的形式可在项目中配置。
为了为你的文档站点增加这些报告,必须增加reporting部分在pom.xml中,下面这个为标准的项目信息报告插件在pom.xml中的配置。
<project> ... <reporting> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-project-info-reports-plugin</artifactId> </plugin> </plugins> </reporting> ... |
Maven在执行mvn site命令时,除了产生开发人员编制的文档信息外,根据pom.xml中设置的报告,会同时生成这个项目信息的报告文档。并且这个是默认的生成项。
这个默认的生成项将根据项目的信息生成以下报告:
· 持续集成信息(Continuous Integration)
· 依赖性信息(Dependencies)
· 发布追踪信息(Issue Tracking)
· 邮件列表信息(Mailing Lists)
· 工程协议信息(Project License)
· 项目团队信息(Project Team)
· 源码库信息(Source Repository)
根据笔者测试,以上信息均是在pom.xml进行设置的。
· 持续集成信息根据以下配置信息生成:
<ciManagement> <system/> <url/> <notifiers> <notifier> <type/> <sendOnError/> <sendOnFailure/> <sendOnSuccess/> <sendOnWarning/> <address/> <configuration/> </notifier> </notifiers> </ciManagement> |
· 依赖性信息根据以下配置信息有关
<dependencies> <dependency> <groupId/> <artifactId/> <version/> <type/> <classifier/> <scope/> <systemPath/> <exclusions> <exclusion> <artifactId/> <groupId/> </exclusion> </exclusions> <optional/> </dependency> </dependencies> |
· 发布追踪信息
<issueManagement> <system/> <url/> </issueManagement> |
· 邮件列表信息
<mailingLists> <mailingList> <name/> <subscribe/> <unsubscribe/> <post/> <archive/> <otherArchives/> </mailingList> </mailingLists> |
笔者在pom.xml中设置以上信息后,运行mvn site总会报错。如果哪位了解到报错原因请告诉我,谢谢。[email protected]
· 工程协议信息
<licenses> <license> <name/> <url/> <distribution/> <comments/> </license> </licenses> |
· 项目团队信息
<organization> <name/> <url/> </organization> |
<developers> <developer> <id/> <name/> <email/> <url/> <organization/> <organizationUrl/> <roles/> <timezone/> <properties/> </developer> </developers>
|
<contributors> <contributor> <name/> <email/> <url/> <organization/> <organizationUrl/> <roles/> <timezone/> <properties/> </contributor> </contributors> |
· 源码库信息
<scm> <connection/> <developerConnection/> <tag/> <url/> </scm> |
默认情况下这些文档将生成在$basedir/src/site目录下。
需要得到其他的报告,则需要配置其他的报告插件。
要想了解更多的信息,请参考以下网页:
http://cvs.peopleware.be/training/maven/maven2/morePlugins.html
这里我们通过使用外部依赖(external dependencies)来大家对maven的依赖管理有一个简单而具体的了解。
当我们在做一个工程的时候,不可能一切都是从空白开始,对于我们做Web应用的来说,使用框架已经司空见惯,而这种对框架的引入使用对于Maven来说,就是工程的依赖。而我们的工程要进行测试,则不能少了对Junit框架的依赖。
依赖管理是maven的一个主要特征,这个是对于用户来说,是Maven令人振奋的一个最著名的特征。对于一个单一的工程来说,依赖管理没有什么困难的,但是当你开始处理多个模块的工程或由10多个甚至上百个模块组成的应用程序时, Maven能帮助你轻松稳定的控制这些大量的依赖。
在pom.xml中dependencies部分列出了所有外部依赖,详细描述了在编译时,测试时,运行时是否需要这个依赖。现在,假定我们的工程只有对Junit的依赖。它的pom.xml文件可能如下:
<project 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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany.app</groupId> <artifactId>my-app</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>Maven Quick Start Archetype</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> </project> |
从以上pom.xml文件可以看出,定义一个外部依赖(external dependencies)至少需要4个元素:groupId, artifactId, version, and scope。对于groupId, artifactId, version的意思,和前面我们在创建工程时提到的这几个元素的意义相同,这里就不再重复介绍,scope元素指出你的工程如何使用依赖,并且它的值有compile,test和runtime等等。想要了解更多的依赖说明的信息,请看
http://maven.apache.org/maven-model/maven.html
要想了解完整的依赖机制,请看
http://maven.apache.org/guides/introduction/introduction-to-dependency-management.html
有了这些依赖信息,Maven将能在工程构建时引用依赖。
引用的过程是:
首先,在本地仓库(默认的本地仓库地址为:~/.m2/repository)中查找此依赖是否存在。
再次,如果在本地仓库中未发现,则在远程仓库中下载此依赖,并下载到本地仓库中。
最后,通过以上两个步骤就能找到依赖。如果远程仓库无法访问,则可以设置其他远程仓库。具体请看
http://maven.apache.org/guides/introduction/introduction-to-repositories.html
一个简单的例子。比如我们要添加一个log4j到我们的工程中。
首先.需要了解log4j的groupId, artifactId, and version信息。可在google上搜索“site:www.ibiblio.org maven2 log4j”。这样在搜索结果里可以找到/maven2/log4j/log4j (or /pub/packages/maven2/log4j/log4j)这样的目录,在这个目录中有一个文件叫做maven-metadata.xml。这个文件内容如下所示:
<metadata> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.1.3</version> <versioning> <versions> <version>1.1.3</version> <version>1.2.4</version> <version>1.2.5</version> <version>1.2.6</version> <version>1.2.7</version> <version>1.2.8</version> <version>1.2.11</version> <version>1.2.9</version> <version>1.2.12</version> </versions> </versioning> </metadata> |
这样我们能找到groupId为log4j,artifactId为log4j,version当然要用最新的,选择1.2.12。scope我们设置为compile。
这样我们使用mvn compile 编译工程时,会看到mvn下载了log4j到我们的本地仓库。
Maven的配置管理是作为一个单独的Maven子项目在做。叫做SCM。他是这样介绍的:
MavenSCM支持Maven 2.x插件(例如,maven-release-plugin)和其他工具(例如,Continuum,这个是一个和maven 2.x结合很好的一个持续集成工具。),Maven SCM提供给他们一个公共的API去做配置管理的各种操作。当然了要执行配置管理操作,当然少不了配置滚里工具了。Maven SCM给出了一个列表,说明Maven SCM现在所支持的配置管理工具。
完全支持的配置管理工具 |
CVS Subversion Perforce StarTeam |
部分支持的配置管理工具 |
ClearCase File system Visual Source Safe |
不支持的配置管理工具 |
Accurev Aegis Arch BitKeeper ClearCase Multisite CM Synergy Code Co-op Darcs Monotone OpenCM PureCM Serena PVCS / Dimension Starteam Enterprise Svk Vesta |
当你选中了上面的一个配置管理工具,你就可以利用Maven 2.x的插件或者集成管理工具进行配置管理了。
1. 持续集成工具continuum
continuum是Maven的一个子项目。他是一个构建基于java的工程的持续集成服务器。他支持以下多种工程类型:
· Maven 1
· Maven 2
· Ant
· Shell scripts
continuum有以下特征
· 紧密整合Maven 2.x
· 紧密整合Maven SCM
o Subversion
o CVS
o Starteam
o Clearcase
o Perforce
· 更易用的基于网络的设置和界面
· 基于Quartz(Quartz-based)的时间计划表设置
· 添加新项目十分方便
· 邮件通知
· 其他IM通知
o IRC
o Jabber
o MSN
· 责备机制(Blame Mechanism)
1. 下载:
在以下连接处下载此软件
http://maven.apache.org/continuum/download.html |
安装:
Windows 2000/XP
解压缩continuum-1.0.2-bin.zip到你希望安装Continuum 1.0.2的所在目录。这里假定你安装在C:\Program Files\Apache Software Foundation\continuum-1.0下。
运行:
· bin/linux/run.sh 如果是UNIX平台
· bin/solaris/run.sh 如果是Solaris平台
· bin/win32/run.bat 如果是Windows平台
· bin/macosx/run.sh 如果是MacOS X平台.
· bin/plexus.sh 如果是其他平台
当服务器启动成功后,打开浏览器访问:
http://localhost:8080/continuum/ |
注意:由于continuum判断一个工程是否构建成功,是使用一个命令行返回值。而windows平台的用户,这个返回值有问题。因此需要修改以下maven 2的bin/mvn.bat文件。这里可以直接从以下地址下载修改后的文件替换掉即可。
http://maven.apache.org/continuum/scripts/mvn.bat |
2. 添加一个项目到continuum
要添加一个maven 2的项目到continuum,需要写入一个pom url或者导入一个pom.xml,当然导入的这个pom.xml文件中包含了continuum需要的各种信息。
我们来看看导入的pom.xml文件中具体需要包含哪些项:
· 配置管理信息(The SCM information)
<scm> <connection/> <developerConnection/> <tag/> <url/> </scm> |
· 开发者信息(The developers)
<ciManagement> <system>continuum</system> <notifiers> <notifier> ... </notifier> </notifiers> </ciManagement> |
· 集成后所有的通知人信息(The notifiers)
<notifier> <type>mail</type> <configuration> <address>[email protected]</address> </configuration> <notifier> |
<notifier> <type>irc</type> <configuration> <host>irc.codehaus.org</host> <port>6667</port> <channel>#maven</channel> </configuration> </notifier> |
3. 构建工程
· 按照定制的时间构建
· 点击本项目上的build按钮进行构建。
1. 发布配置方法
要发布(Releases)一个项目,需要在pom.xml和setting.xml中分别配置。
在pom.xml中
<distributionManagement> <repository> <id>mycompany-repository</id> <name>MyCompany Repository</name> <url>scp://repository.mycompany.com/repository/maven2</url> </repository> </distributionManagement> |
在setting.xml中
<settings> . . <servers> <server> <id>mycompany-repository</id> <username>jvanzyl</username> <!-- Default value is ~/.ssh/id_dsa --> <privateKey>/path/to/identity</privateKey> (default is ~/.ssh/id_dsa) <passphrase>my_key_passphrase</passphrase> </server> </servers> . . </settings> |
通过以上的设置,项目将可以发布到远程仓库,远程服务器。
项目发布现在支持scp,ftp和scpexe等方式。
2. Setting.xml文件
这个文件是一个maven的配置文件。
他有下面的功能:
· 配置本地仓库
· 配置访问网络的代理服务器
· 安全和部署的设置。
· 为仓库设置景象
想要了解更多这个文件的信息可以参考一下以下文章:
http://maven.apache.org/guides/mini/guide-configuring-maven.html |
3. 运行发布的命令
mvn deploy |
当有了以上的工程目录,无论是webapp工程,还是app,我们都希望在集成开发环境中开发。Maven如何和IDE集成。现在我们就来进行讲解。
1. 首先要让eclipse知道Maven 2的repository(仓库)的路径。
因此要设置一个M2_REPO的变量为classpath。
可以使用命令行的方式来设置:
mvn -Declipse.workspace=<path-to-eclipse-workspace> eclipse:add-maven-repo |
还可以在eclipse中定义一个新的classpath变量通过在eclipse的菜单上选择Window> Preferences. 选择Java > Build Path > Classpath Variables page.
2. 生成eclipse的工程文件。
使用命令行
mvn eclipse:eclipse |
这样通过在eclipse的菜单上选择File >Import >Existing Projects into Workspace,就可以将工程导入eclipse中。
通过以上2个步骤,我们就可以利用eclipse来进行开发工作了。
3. Eclipse插件mavenide
同时在eclipse中我们可以下载一个maven的插件,用来辅助eclipse进行maven工程的开发工作。这个插件名称叫做mavenide。
这个插件可使用以下更新站点:http://m2eclipse.codehaus.org/
并且非常方便的是,这里还提供了一个flash的演示来介绍如何安装此插件,这个flash演示的观看地址在:
http://m2eclipse.codehaus.org/Installing_Maven_2.0_plugin_for_Eclipse.html
要正常使用此插件请注意以下问题:
eclipse使用3.1或以上版本。
Mavenide的插件为0.0.5不要安装错误了。
通过笔者在安装好此插件的一些使用后,看到了此插件的以下一些特性。
1. 可以方便的添加依赖。
2. 在编辑完pom.xml文档后,会自动检查此文档的格式是否正确。
3. 可以将mvn的一些命令通过扩展工具的方式在eclipse中轻松执行。