Maven2.0介绍
来源:互联网 发布:淘宝能用话费支付吗 编辑:程序博客网 时间:2024/05/10 19:11
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>
--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>
以下是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网站上得来的。这个插件是用来设置编译选项的。
- Maven2.0介绍
- Maven2介绍
- Maven2介绍
- Maven2介绍
- Maven2 介绍
- Maven2基础介绍
- maven2.0学习笔记
- MAVEN2.0实用指南
- maven2.0学习笔记
- maven2.0学习笔记
- maven2.0学习笔记
- MAVEN2.0实用指南
- maven2.0学习笔记
- Maven2
- maven2
- maven2
- maven2
- maven2
- Android游戏可能遇到的3个问题及解决方案
- TCP拥塞窗口调整撤销剖析
- 画图
- java动态代理(JDK和cglib)
- Database schema(From Wikipedia)
- Maven2.0介绍
- 基础算法之三: 合并两个有序数组
- GNU Autotools (autoconf, automake, libtool, etc.) 自动化编译 (1) 简单示例
- Windows下查看某端口号被哪个进程占用
- SVN入门笔记(1)
- 隔行扫描与逐行扫描的来龙去脉
- 使用ControllerClassNameHandlerMapping实现SpringMVC的CoC配置
- C++开发必看 四种强制类型转换的总结
- 排序算法