Maven2.0:编译、测试、部署、运行

摘要: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诞生了。

  版权声明:任何获得Matrix授权的网站,转载时请务必保留以下作者信息和链接

  作者:Chris Hardin;mycj(作者的blog:http://blog.matrix.org.cn/page/mycj)

  原文:http://www.onjava.com/pub/a/onjava/2006/03/29/maven-2-0.html

  Matrix:http://www.matrix.org.cn/resource/article/44/44475_Maven2.html

  关键字:Maven2

  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的依赖以此来鼓励单元测试。

  

<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.oreilly</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>


  创建完项目后,我们能够往项目里添加代码并使用Maven的任何全新技巧。注意以下命令必须在pom.xml文档所在的目录中运行。

  --mvn test:运行应用程式中的单元测试

  --mvn package:依据项目生成jar文档

  --mvn install:将项目的jar文档添加到库中,&#61548;以备依赖此项目时使用

  --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文档:<packaging>war</packaging>。现在就能够使用mvn package命令来生成war文档。不用担心如何从WEB-INF/lib目录中得到依赖项,在依赖属性值被配置成compile的情况下,Maven会自动包含依赖项。也能够将以下代码添加到pom.xml文档中来改变war文档的名称:

  
<build>

  <finalName>PromoteC</finalName>

   </build>


  依赖管理

  创建好项目结构,添加完一些代码,测试并编译好应用程式后,接下来能够看看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编写的关于时间安排的开源项目,他是您时间安排需求方面的很好的选择。

  
<dependency>

   <groupId>quartz</groupId>

   <artifactId>quartz</artifactId>

   <version>1.5.1</version>

   <scope>compile</scope>

   </dependency>


  我们仅仅只需添加<dependencies>这个元素,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的使用条款。

  
<dependency>

   <groupId>javax.activation</groupId>

   <artifactId>activation</artifactId>

   <version>1.0</version>

   <scope>compile</scope>

   </dependency>


  您或许想将依赖项存入一个源代码控制器的库中,源代码控制器决不能执行这个任务。依赖项是经常变化的,并且通常有一套数字方案来标明其版本。这就是说,您明确地希望有一个内部远程存储库的备份,假如您有一个,这将确保在存储库服务器崩溃并且不能恢复的情况下,您不会丢失任何的自定义资源。不将依赖项放入源代码控制器中也会节省源代码控制器的存储库服务器上的大量磁盘空间。

  配置存储库

  需要项目的每个研发者必须在conf目录中配置存储库是不方便的,所以Maven能够同时查看多个存储库并且将他们全部配置在pom.xml文档中。让我们看看一个例子,他展示了如何在应用程式用使用多个存储库。在以下从pom.xml文档摘录的片断中,我们配置了两个存储库来让Maven寻找依赖项。Ibiblio一直是默认的存储库,我们又添加了Planet Mirror作为后援存储库。我们也能够让团队使用的本地web服务器作为第二个存储库。

  
<repositories>

  <repository>

  <id>Ibiblio</id>

  <name>Ibiblio</name>

  <url>http://www.ibiblio.org/maven/</url>

  </repository>

  <repository>

  <id>PlanetMirror</id>

  <name>Planet Mirror</name>

  <url>http://public.planetmirror.com/pub/maven/</url>

  </repository>

  </repositories>


  使用pom.xml父文档来构建多个项目

  软件公司通常的一种做法就是将多个项目构建到主要产品中。维护依赖关系链和一次性地构建整个产品足以成为一个挑战,但是假如使用Maven的话,事情将变得简单。假如您创建了一个指向其他子模块的pom.xml父文档,Maven将为您处理整个构建过程。他将分析每个子模块的pom.xml文档,并且按照这些子模块的相互依赖顺序来构建项目。假如每个项目明确地指明他们的依赖项,那么子模块在父文档中的放置顺序是不造成任何影响的。但是考虑到其他的研发者,最好确保子模块在pom.xml父文档中的放置顺序和您期望的子项目被构建的顺序相同。下面我们看个示例。

  pom.xml主文档如下:

  
<project>

  <modelVersion>4.0.0</modelVersion>

  <groupId>com.oreilly</groupId>

  <version>1.0-SNAPSHOT</version>

  <artifactId>my-app</artifactId>

  <packaging>pom</packaging>

  <modules>

  <module>Common</module>

  <module>Utilities</module>

  <module>Application</module>

   <module>WebApplication</module>

  </modules>

  </project>


  我们需要确保WebApplication子模块包含了任何的三个jar包,所以需要将这些jar包声明为依赖项。在这个例子中,Utilities项目依赖于Common项目,所以Utilities项目中需要添加一个对Common项目的依赖。Application子模块也是同样的道理,因为他依赖于Common和Utilities项目,Utilities又赖于Common。假如这个例子中有60个子模块,并且他们都相互依赖,这会使得新研发者难以算出什么项目依赖于其他项目,所以这正好是需要确保pom.xml父文档中项目放置顺序要清除的原因。

  以下是Utility模块的依赖项:

  
<dependencies>

  <dependency>

  <groupId>com.oreilly</groupId>

  <artifactId>Common</artifactId>

  <version>1.0-SNAPSHOT</version>

  </dependency>

  </dependencies>


  以下是如何声明Application模块的依赖项:

  
<dependencies>

  <dependency>

  <groupId>com.oreilly</groupId>

  <artifactId>Common</artifactId>

  <version>1.0-SNAPSHOT</version>

  </dependency>

  <dependency>

  <groupId>com.oreilly</groupId>

  <artifactId>Utilities</artifactId>

  <version>1.0-SNAPSHOT</version>

  </dependency>

  </dependencies>


  最后是WebApplication模块的依赖项:

  
<dependencies>

  <dependency>

  <groupId>com.oreilly</groupId>

  <artifactId>Common</artifactId>

  <version>1.0-SNAPSHOT</version>

  </dependency>

  <dependency>

  <groupId>com.oreilly</groupId>

  <artifactId>Utilities</artifactId>

  <version>1.0-SNAPSHOT</version>

  </dependency>

  <dependency>

  <groupId>com.oreilly</groupId>

  <artifactId>Application</artifactId>

  <version>1.0-SNAPSHOT</version>

  </dependency>

  </dependencies>


  现在,我们只需为每个子模块的pom.xml文档添加一个元素来表明他们是个逻辑构建的一部分:

  
<parent>

  <groupId>com.oreilly</groupId>

  <artifactId>my-app</artifactId>

  <version>1.0-SNAPSHOT</version>

  </parent>


  在pom.xml父文档所在的同一个目录中,存在有项目目录:Common, Utilities, Application, 和WebApplication。当我们在该目录中运行mvn package命令时,这些项目会按照依赖顺序而被构建。

  插件和报表

  Maven2.0有大量的插件能够使用。不幸的是,由于Maven的重写,Maven1.0的插件不能在2.0中使用。尽管如此,还是存在一些能够使用的Maven2.0的插件。下面pom.xml文档中的插件配置示例是直接从Maven2.0网站上得来的。这个插件是用来配置编译选项的。

  
<plugins>

  <plugin>

  <groupId>org.apache.maven.plugins</groupId>

  <artifactId>maven-compiler-plugin</artifactId>

  <configuration>

  <source>1.5</source>

  <target>1.5</target>

  </configuration>

  </plugin>

  </plugins>


  Maven报表插件能够用来生成不同的报表,这些报表是在当您使用mvn site命令生成项目的站点时产生的。下面的例子展示了如何使用<reporting>元素来配置这类插件中的一个。

  
<reporting>

  <plugins>

  <plugin>

  <groupId>org.apache.maven.plugins</groupId>

  <artifactId>maven-project-info-reports-plugin</artifactId>

  </plugin>

  </plugins>

  </reporting>


  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项目站点

  Chris Hardin 是McLeod软件公司的高级Java工程师。

以上内容由 华夏名网 收集整理,如转载请注明原文出处,并保留这一部分内容。

你可能感兴趣的:(eclipse,maven,quartz,软件测试,单元测试)