maven入门--简介

来源:互联网 发布:小猪cms微电商系统 编辑:程序博客网 时间:2024/06/05 15:56

Maven是一个很好的项目管理工具。

一、maven概要

1、版本

Maven有自己的版本定义和规则。

2、构建

 Maven支持许多种应用程序类型,对于每一种支持的应用程序类型都定义好了一组构建规则和工具集。

3、输出物管理

Maven可以管理项目构建的额外产物,并将其加入到用户库中。这个功能可以用于项目组合其他部门之间的交付行为(target下的资源文件)。

4、依赖管理

Maven对依赖关系的特性进行细致的分析和划分,避免开发过程中的依赖混乱和相互污染行为。

5、项目关系

一个大型项目通常由几个小项目或者模块组成,用maven可以很方便地管理(多项目管理功能)。

6、移植性管理

Maven可以针对不同的开发场景,输出不同种类的输出结果。

二、maven的生命周期

maven把项目的构建划分为不同的生命周期(lifecycle) 。包括:编译、测试、打包、集成测试、验证、部署。maven中所有的执行动作(goal)都需要指明自己在这个过程中的执行位置,然后maven执行的时候,就依照过程的发展依次调用这些goal进行各种处理。

三、maven的“约定由于配置”

所谓的"约定优于配置",在maven中并不是完全不可以修改的,他们只是一些配置的默认值而已。但是使用者除非必要,并不需要去修改那些约定内容。maven默认的文件存放结构如下:

/项目目录

pom.xml 用于maven的配置文件

/src 源代码目录

/src/main 工程源代码目录

/src/main/java 工程java源代码目录

/src/main/resource 工程的资源目录

/src/test 单元测试目录

/src/test/java

每一个阶段的任务都知道怎么正确完成自己的工作,比如compile任务就知道从src/main/Java下编译所有的java文件,并把它的输出class文件存放到target/classes中。

对maven来说,采用"约定优于配置"的策略可以减少修改配置的工作量,也可以降低学习成本,更重要的是,给项目引入了统一的规范。

三、maven的版本规范

maven使用如下几个要素来唯一定位某一个输出物: groupId:artifactId:packaging:version 。比如org.springframework:spring:2.5 。每个部分的解释如下:

groupId 
团体,公司,小组,组织,项目,或者其它团体。团体标识的约定是,它以创建这个项目的组织名称的逆向域名(reverse domain name)开头。来自Sonatype的项目有一个以com.sonatype开头的groupId,而Apache Software的项目有以org.apache开头的groupId。

artifactId 
在groupId下的表示一个单独项目的唯一标识符。比如我们的tomcat, commons等。不要在artifactId中包含点号(.)。

version 
一个项目的特定版本。发布的项目有一个固定的版本标识来指向该项目的某一个特定的版本。而正在开发中的项目可以用一个特殊的标识,这种标识给版本加上一个"SNAPSHOT"的标记。
虽然项目的打包格式也是Maven坐标的重要组成部分,但是它不是项目唯一标识符的一个部分。一个项目的 groupId:artifactId:version使之成为一个独一无二的项目;你不能同时有一个拥有同样的groupId, artifactId和version标识的项目。

packaging 
项目的类型,默认是jar,描述了项目打包后的输出。类型为jar的项目产生一个JAR文件,类型为war的项目产生一个web应用。

classifier 
很少使用的坐标,一般都可以忽略classifiers。如果你要发布同样的代码,但是由于技术原因需要生成两个单独的构件,你就要使用一个分类器(classifier)。例如,如果你想要构建两个单独的构件成JAR,一个使用Java 1.4编译器,另一个使用Java 6编译器,你就可以使用分类器来生成两个单独的JAR构件,它们有同样的groupId:artifactId:version组合。如果你的项目使用本地扩展类库,你可以使用分类器为每一个目标平台生成一个构件。分类器常用于打包构件的源码,JavaDoc或者二进制集合。

maven在版本管理时候可以使用几个特殊的字符串 SNAPSHOT ,LATEST ,RELEASE 。比如"1.0-SNAPSHOT"。各个部分的含义和处理逻辑如下说明:

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,也是从中拿出来的一个稳定版。

LATEST (特定构件的最新版本)
指某个特定构件的最新发布,这个发布可能是一个发布版,也可能是一个snapshot版,具体看哪个时间最后。

RELEASE (最后一个发布版本)
指最后一个发布版。

四、 maven的组成部分

Maven把整个项目分成几个部分:

项目源代码:包括源代码和资源文件。

单元测试代码。

Maven配置文件。

Target输出文件。

五、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包含如下的取值:

compile(编译范围) 
compile是默认的范围;如果没有提供一个范围,那该依赖的范围就是编译范围。编译范围依赖在所有的classpath中可用,同时它们也会被打包。

provided(已提供范围) 
provided依赖只有在当JDK或者一个容器已提供该依赖之后才使用。例如,如果你开发了一个web应用,你可能在编译classpath中需要可用的Servlet API来编译一个servlet,但是你不会想要在打包好的WAR中包含这个Servlet API;这个Servlet API JAR由你的应用服务器或者servlet容器提供。已提供范围的依赖在编译classpath(不是运行时)可用。它们不是传递性的,也不会被打包。

runtime(运行时范围) 
runtime依赖在运行和测试系统的时候需要,但在编译的时候不需要。比如,你可能在编译的时候只需要JDBCAPI JAR,而只有在运行的时候才需要JDBC驱动实现。

test(测试范围) 
test范围依赖 在一般的 编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用。

system(系统范围) 
system范围依赖与provided类似,但是你必须显式的提供一个对于本地系统中JAR文件的路径。这么做是为了允许基于本地对象编译,而这些对象是系统类库的一部分。这样的构件应该是一直可用的,Maven也不会在仓库中去寻找它。如果你将一个依赖范围设置成系统范围,你必须同时提供一个systemPath元素 。注意该范围是不推荐使用的(你应该一直尽量去从公共或定制的Maven仓库中引用依赖)。

另外,代码有代码自己的依赖,各个maven使用的插件也可以有自己的依赖关系。依赖也可以是可选的,比如我们代码中没有任何cache依赖,但是hibernate可能要配置cache,所以该cache的依赖就是可选的。

六、 多项目管理

maven的多项目管理也是非常强大的。一般来说,maven要求同一个工程的所有子项目都放置到同一个目录下,每一个子目录代表一个项目,比如

总项目/

pom.xml 总项目的pom配置文件

子项目1/

pom.xml 子项目1的pom文件

子项目2/

pom.xml 子项目2的pom文件

按照这种格式存放,就是继承方式,所有具体子项目的pom.xml都会继承总项目pom的内容,取值为子项目pom内容优先

<modules>
     <module>simple-weather</module>
     <module>simple-webapp</module>
</modules>

复制代码

        

其次在每个子项目中加入

<parent>
     <groupId>org.sonatype.mavenbook.ch06</groupId>
     <artifactId>simple-parent</artifactId>
     <version>1.0</version>
</parent> 

复制代码

即可。

当然,继承不是唯一的配置文件共用方式,maven还支持引用方式。引用pom的方式更简单,在依赖中加入一个type为pom的依赖即可。

 

<project>
     <description>This is a project requiring JDBC</description>
    ... 
     <dependencies>
        ... 
         <dependency>
             <groupId>org.sonatype.mavenbook</groupId>
             <artifactId>persistence-deps</artifactId>
             <version>1.0</version>
             <type>pom</type>
         </dependency>
    </dependencies>
</project>

复制代码

七、 属性

用户可以在maven中定义一些属性,然后在其他地方用${xxx}进行引用。比如:

<project>
     <modelVersion>4.0.0</modelVersion>
    ... 
     <properties>
         <var1>value1</var1>
     </properties>
</project>

复制代码

0 0
原创粉丝点击