maven 介绍

版权声明:任何获得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文件添加到库中,        以备依赖此项目时使用
--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项目站点 

时间: 2024-09-28 04:24:46

maven 介绍的相关文章

一,Maven - 介绍与安装

一,介绍 官网:http://maven.apache.org 下载:http://maven.apache.org/download.cgi 官方教程:http://maven.apache.org/guides/getting-started/index.html Maven是一个项目管理和综合工具.Maven提供了开发人员构建一个完整的生命周期框架.开发团队可以自动完成项目的基础工具建设,Maven使用标准的目录结构和默认构建生命周期. 在多个开发团队环境时,Maven可以设置按标准在非常

Maven介绍,包括作用、核心概念、用法、常用命令、扩展及配置

两年半前写的关于Maven的介绍,现在看来都还是不错的,自己转下.写博客的一大好处就是方便自己以后查阅,自己总结的总是最靠谱的. 由浅入深,主要介绍maven的用途.核心概念(Pom.Repositories.Artifact.Build Lifecycle.Goal).用法(Archetype意义及创建各种项目).maven常用参数和命令以及简单故障排除.maven扩展(eclipse.cobertura.findbugs.插件开发).maven配置. 较长,可根据个人需要有选择性的查看,比如

Maven常用插件配置和使用

主要介绍Maven的几个常见第三方插件(cobertura.findbugs.source.assembly.插件开发)配置和使用,接Maven介绍 maven本质上是一个插件框架,它的所有工作都交给插件来做,每个插件可以有多个goal. 除了自带的插件之外还有很多比较成熟的第三方插件,我们也很容易上手进行简单的插件开发,下面一一介绍 1 自带插件 maven自带的核心插件为Build plugins和Reporting plugins. mvn compile编译源码实际上就利用到了maven

Maven入门

一.Maven介绍 Maven是一个项目管理和综合工具.Maven提供了开发人员构建一个完整的生命周期框架.开发团队可以自动完成项目的基础工具建设,Maven使用标准的目录结构和默认构建生命周期. 在多个开发团队环境时,Maven可以设置按标准在非常短的时间里完成配置工作.由于大部分项目的设置都很简单,并且可重复使用,Maven让开发人员的工作更轻松,同时创建报表,检查,构建和测试自动化设置. Maven提供了开发人员的方式来管理: Builds Documentation Reporting

Maven入门指南(一)

原文链接  译文链接  译者:nkcoder  校对:方腾飞 Maven介绍: Maven是一个强大的Java项目构建工具.当然,你也可以使用其它工具来构建项目,但由于Maven是用Java开发的,因此Maven被更多的用于Java项目中. 这篇教程的目的是帮助你理解Maven的工作机制.因此教程主要关注Maven的核心概念.一旦你理解了这些核心概念,当你想了解更多的细节时,再取查看Maven文档,或者从网上搜索,就变得容易多了. 事实上,Maven开发者认为Maven不仅仅是一个构建工具.你可

spring-大家下载所需要的jar包一般都是去哪里下载

问题描述 大家下载所需要的jar包一般都是去哪里下载 想下载Spring的jar包,去了官网发现没有下载的地方,有没有知道官网怎么下的 解决方案 http://repo.spring.io/release/org/springframework/spring/ 解决方案二: 可以下http://zhidao.baidu.com/link?url=5o6jwTL6yWcPiPrbSUCz3H9qSBlQx4QcNSZvNIG0SDkhDgWywM0KWKnUZkd1VP24LwKO7tm7jMh7

《Netty实战》Netty In Action中文版——文前内容

<Netty实战>样章由人民邮电出版社授权并发编程网发布,本书的中文版已经由人民邮电出版社引进并出版. 京东预售链接(优先发货):<Netty实战>([美]诺曼·毛瑞尔(Norman Maurer),马文·艾伦·沃尔夫泰尔(Marvin Allen Wolfthal))   内容提要 本书是为想要或者正在使用Java从事高性能网络编程的人而写的,循序渐进地介绍了Netty各个方面的内容. 本书共分为4个部分:第一部分详细地介绍Netty的相关概念以及核心组件,第二部分介绍自定义协议

java-maven

3.1. Maven 3.1.1. Maven介绍 我们使用maven构建应用环境,因此我们先来简单介绍maven.Maven是什么?如何回答这个问题 要看你怎么看这个问题. 绝大部分Maven用户都称Maven是一个"构建工具":一个用来把源代码构建成可发布的构件的工具.构建工程师和项目经理会说Maven是一个更复杂 的东西:一个项目管理工具.那么区别是什么? 像Ant这样的构建工具仅仅是关注预处理,编译,打包,测试和分发,而 Maven 这样的一个项目管理工具提供了构建工具所提供功

问下这种结构的项目如何发布

问题描述 在学习androidpn服务器源码下载下来发现和平时看到的web项目不一样网上确定说是可以用的并且说直接放tom猫发布就好可是这个不是web项目我怎么样用tom发布?最好不需要导出war包,我想直接在eclipse里用内置的tom猫启动,方便调试.就是如何可以放入tom猫内发布,最好是在eclipse里能放入内置的tom猫方便调试. 解决方案 解决方案二:没人看吗..解决方案三:我的理解是,这是一个包含三个maven项目的文件夹.你把console.server.starter分别导入