`

maven3.0.4学习笔记(四)-几点总结

阅读更多

一 maven的生命周期

maven把项目的构建划分为不同的生命周期(lifecycle),在我看来,划分的已经是非常仔细

了。粗略一点的话,它这个过程(phase)包括:编译、测试、打包、集成测试、验证、部署。maven
中所有的执行动作(goal)都需要指明自己在这个过程中的执行位置,然后maven执行的时候,就依照
过程的发展依次调用这些goal进行各种处理。
这个也是maven的一个基本调度机制。一般来说,位置稍后的过程都会依赖于之前的过程。当
然,maven同样提供了配置文件,可以依照用户要求,跳过某些阶段。

 

二 maven的“约定优于配置”

所谓的"约定优于配置",在maven中并不是完全不可以修改的,他们只是一些配置的默认值而
已。但是使用者除非必要,并不需要去修改那些约定内容。maven默认的文件存放结构如下:
/项目目录
pom.xml 用于maven的配置文件
/src 源代码目录
/src/main 工程源代码目录
/src/main/java 工程java源代码目录
/src/main/resource 工程的资源目录
/src/test 单元测试目录
/src/test/java 单元测试java源代码目录
/src/test/resource 单元测试资源目录
/target 输出目录,所有的输出物都存放在这个目录下
/target/classes 编译之后的class文件
每一个阶段的任务都知道怎么正确 完成自己的工作,比如compile任务就知道从
src/main/java下编译所有的java文件,并把它的输出class文件存放到target /classes中。
对maven来说,采用"约定优于配置"的策略可以减少修改配置的工作量,也可以降低学习成本,更重
要的是,给项 目引入了统一的规范。

三maven的版本规范

Maven使用如下几个要素来唯一定位某一个输出:
groupId:artifactId:packaging:version 。
比如: org.springframework:spring:2.5 。每个部分的解释如下:
1. groupId
团体,公司,小组,组织,项目,或者其它团体。团体标识的约定是, 它以创建这个项目的组织名称
的逆向域名(reverse domain name)开头。来自Sonatype的项目有一个以com.sonatype开
头的groupId,而Apache Software的项目有以org.apache开头的groupId。
2. artifactId
在 groupId下的表示一个单独项目的唯一标识符。比如我们的tomcat, commons等。不要在
artifactId中包含点号(.)。
3. version
一个项目的特定版本。发布的项目有一个固定的版本标识来指向该项目的某一个特定的版 本。而正在
开发中的项目可以用一个特殊的标识,这种标识给版本加上一个"SNAPSHOT"的标记。 虽然项目
的打包格式也是Maven坐标的重要组成部分,但是它不是项目唯一标识符的一个部分。一个项目的
groupId:artifactId:version使之成为一个独一无二的项目;你不能同时有一个拥有同样的gro
upId, artifactId 和version标识的项目。
4. packaging
项目的类型,默 认是jar,描述了项目打包后的输出。类型为jar的项目产生一个JAR文件,类型
为war的项目产生一个web应用。
5. classifier
很少使用的坐标,一般都可以忽略classifiers。如果你要发布同样的代码,但是由于技术原因需要
生成两个单独的构 件,你就要使用一个分类器(classifier)。例如,如果你想要构建两个单独的
构件成JAR,一个使用Java 1.4编译器,另一个使用Java 6编译器,你就可以使用分类器来生成
两个单独的JAR构件,它们有同样的groupId:artifactId:version组合。如果你的项目使用本
地扩展类库,你可以使用分类器为每一个目标平台生成一个构件。分类器常用于打包构件的源码,Ja
vaDoc或者二进制集合。
maven有自己的版本规范,一般是如下定义 <major version>.<minor version>.<i
ncremental version>-<qualifier> ,比如1.2.3-beta-01。要说明的是,maven自己判断
版本的算法是major,minor,incremental部分用数字比 较,qualifier部分用字符串比较,所以
要小心 alpha-2和alpha-15的比较关系,最好用 alpha-02的格式。
maven 在版本管理时候可以使用几个特殊的字符串 SNAPSHOT ,LATEST ,RELEASE
。比如"1.0-SNAPSHOT"。各个部分的含义和处理逻辑如下说明:
1. SNAPSHOT
如果一个版本包含字符串"SNAPSHOT",Maven就会在安装或发布这个组件的时候将该符号展
开为一个日期和时间值, 转换为UTC时间。例如,"1.0-SNAPSHOT"会在2010年5月5日
下午2点10分发布时候变成1.0-20100505-141000-1。
这个词只能用于开发过程中,因为一般来说,项目组都会频繁发布一些版本,最后实际发布的时候,
会在这些snapshot版 本中寻找一个稳定的,用于正式发布,比如1.4版本发布之前,就会有一系
列的1.4-SNAPSHOT,而实际发布的1.4,也是从中拿出来的一个稳定 版。 2. LATEST
指某个特定构件的最新发布,这个发布可能是一个发布版,也可能是一个 snapshot版,具体看哪
个时间最后。
3. RELEASE
指最后一个发布版。

四 maven的依赖管理

依赖管理一般是最吸引人使用maven的功能特性了,这个特性让开发者只需要关注代码的直
接依赖,比如我们用了spring,就加入spring依赖说明就可以了,至于spring自己还依赖哪些外
部的东西,maven帮我们搞定。
任意一个外部依赖说明包含如下几个要素:groupId, artifactId, version, scope, type,
optional。其中前3个是必须的,各自含义如下:
groupId 必须
artifactId 必须
version 必须

这里的version可以用区间表达式来表示,比如(2.0,)表 示>2.0,[2.0,3.0)表示
2.0<=ver<3.0;多个条件之间用逗号分隔,比如[1,3),[5,7]。
scope 作用域限制
type 一般在pom引用依赖时候出现,其他时候不用
optional 是否可选依赖
maven认为,程序对外部的依赖会随着程序的所处阶段和应用场景而变化,所以maven
中的依赖关系 有作用域(scope)的限制。在maven中,scope包含如下的取值:
1. compile(编译范围)
compile是默认的范围;如果没有提供一个范围,那该依赖的范围就是编译范围。编译范围依赖在
所有的 classpath中可用,同时它们也会被打包。
2. provided(已提供范围)
provided 依赖只有在当JDK或者一个容器已提供该依赖之后才使用。例如,如果你开发了一个w
eb应用,你可能在编译classpath中需要可用的Servlet API来编译一个servlet,但是你不
会想要在打包好的WAR中包含这个Servlet API;这个Servlet API JAR由你的应用服务器
或者servlet容器提供。已提供范围的依赖在编译classpath(不是运行时)可用。它们不是传递
性的,也不会被打包。
3. runtime(运行时范围)
runtime依赖在运行和测试系统的时候需要,但在编译的时候不需 要。比如,你可能在编译的时候
只需要JDBC API JAR,而只有在运行的时候才需要JDBC驱动实现。 4. test(测试范围)
test范围依赖 在一般的 编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用。测试范
围依赖在之前的???中介绍过。
5. system(系统范围)
system范围依赖与provided类似,但是你必须显式的提供一个对于本地系统中JAR文件的路径。
这么做是 为了允许基于本地对象编译,而这些对象是系统类库的一部分。这样的构件应该是一直可用
的,Maven也不会在仓库中去寻找它。 如果你将 一个依赖范围设置成系统范围,你必须同时提供
一个systemPath元素 。注意该范围是不推荐使用的(你应该一直尽量去从公共或定制的Mave
n仓库中引用依赖)。
另外,代码有代码自己的依赖,各个maven使用的插件也可以有自己的依赖关系。依赖也可
以是可选的,比如我们代码中没有任何cache依赖, 但是hibernate可能要配置cache,所以该cac
he的依赖就是可选的。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics