Maven学习之三:创建一个简单的Maven项目
? xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
? <modelVersion>4.0.0</modelVersion>
? <groupId>org.sonatype.mavenbook.ch03</groupId>
? <artifactId>simple</artifactId>
? <version>1.0-SNAPSHOT</version>
? <packaging>jar</packaging>
? <name>simple</name>
? <url>http://maven.apache.org</url>
? <properties>
??? <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
? </properties>
? <dependencies>
??? <dependency>
????? <groupId>junit</groupId>
????? <artifactId>junit</artifactId>
????? <version>3.8.1</version>
????? <scope>test</scope>
??? </dependency>
? </dependencies>
</project>
GroupId:团体,公司,小组,组织,项目,或者其它团体。groupId是一个工程的在全局中唯一的标识符,一般 地,它就是工程名。groupId有利于使用一个完全的包名,将一个工程从其它有类似名称的工程里区别出来。
Artifact:在groupId下的表示一个单独项目的唯一标识符。artifact是工程将要产生或需要使用的文件,它可以是 jar文件,源文件,二进制文件,war文件,甚至是pom文件。每 个artifact都由groupId和artifactId组合的标识符唯一识别。需要 被使用(依赖)的artifact都要放在仓库(见Repository)中,否则 Maven无法找到(识别)它们。
version:一个项目的特定版本。发布的项目有一个固定的版本标识来指向该项目的某一个特定的版本。而正在开发中的项目可以用一个特殊的标识,这种标识给版本加上一个“SNAPSHOT”的标记。
项目的打包格式也是Maven坐标的重要组成部分,但是它不是项目唯一标识符的一个部
分。一个项目的groupId:artifactId:version使之成为一个独一无二的项目;你不能同
时有一个拥有同样的groupId, artifactId和version标识的项目。
packaging项目的类型,默认是jar,描述了项目打包后的输出。类型为jar的项目产生一个JAR文件,类型为war的项目产生一个web应用。包括EAR、WAR、JAR、ZIP、EJB几种类型。
Dependency:为了能够build或运行,一个典型的Java工程会 依赖其它的包。在Maven中,这些被依赖的包就被称为
??? dependency。dependency一般是其它工程的artifact。
Plug-in:Maven是由插件组织的,它的每一个功能都是由插件 提供的。插件提供goal(类似于Ant中的target),并根据在POM中? 找到的元数据去完成工作。主要的Maven插件要是由Java写成 的,但它也支持用Beanshell或Ant脚本写成的插件。
Repository:仓库用于存放artifact,它可以是本地仓库,也可? 以是远程仓库。Maven有一个默认的远程仓库--central,可以下载其中的artifact。在Windows? 平台上,本地仓库的默认地址是User_Home.m2 epository。
Snapshot:工程中可以(也应该)有一个特殊版本,它的版本号 包括SNAPSHOT字样。该版本可以告诉Maven,该工程正处于开发阶段,会经常更新(但还未发布)。当其它工程使用此类型版本的artifact时,Maven会在仓库中寻找该artifact的最新版本,并自动下载、使用该最新版。
(2)Maven仓库(Repositories)
当你第一次运行Maven的时候,你会注意到Maven从一个远程的Maven仓库下载了许多文件。如果这个简单的项目是你第一次运行Maven,它首先会做的事情是去下载最新版本的Resources插件。在Maven中,构件和插件是在它们被需要的时候从远程的仓库取来的。Maven自带了一个用来下载Maven核心插件和依赖的远程仓库地址(http://repo1.maven.org/maven2),现已变更到http://search.maven.org/。
Maven仓库是通过结构来定义的在一个Maven仓库中,所有的东西存储在一个与Maven项目坐标十分匹配的目录结构中。
你可以访问Maven仓库http://search.maven.org/,搜索commons-io,你能在结果中找到相应的commons-io所对应的pom.xml,将该配置拷贝到你本地的pom即可在Windows XP上,你的本地仓库在C:\Documents and Settings\USERNAME\.m2\repository,在Unix系统上,你的本地仓库在~/.m2/repository。
当你执行mvn install时,把你项目的构件安装到你的本地仓库。Maven会从远程仓库下载构件和插件到你本机上,存储在你的本地Maven仓库里。一旦Maven已经从远程仓库下载了一个构件,它将永远不需要再下载一次,因为maven会首先在本地仓库查找插件,然后才从其他设置的仓库获取。
(3)Maven依赖管理
?????? 上面的例子中,Maven处理了JUnit依赖的坐标——junit:junit:3.8.1,指向本地Maven仓库中的/junit/junit/3.8.1/junit-3.8.1.jar。这种基于Maven坐标的定位构件的能力能让我们在项目的POM中定义依赖。如果你检查simple项目的pom.xml文件,你会看到有一个文件中有一个段专门处理dependencies,那里面包含了一个单独的依赖——JUnit。
????? 一个复杂的项目将会包含很多依赖,也有可能包含依赖于其它构件的依赖。这是Maven最强大的特征之一,它支持了传递性依赖(transitive dependencies)。假如你的项目依赖于一个库,而这个库又依赖于五个或者十个其它的库(就像Spring或者
Hibernate那样)。你不必找出所有这些依赖然后把它们写在你的pom.xml里,你只需要加上你直接依赖的那些库,Maven会隐式的把这些库间接依赖的库也加入到你的项目中。Maven也会处理这些依赖中的冲突,同时能让你自定义默认行为,或者排除一些特定的传递性依赖。