maven用“坐标(Coordinate)”这个词来唯一标识一个库文件,所谓“坐标”就是库文件的“主键”(借用一下数据库的概念),而且这个“主键”是个复合组件,包含四个部分:groupId, artifactId, version和packaging,分别对应pom文件中的下面四个结点:
<groupId>com.zhlwish</groupId> 项目开发组织标识
<artifactId>simple</artifactId> 项目标识(一般是项目名称)
<packaging>jar</packaging> 打包类型(可能是jar、war、ear)
<version>1.0-SNAPSHOT</version> 版本(按照apache版本命名规则来命名,一般为“主版本.次版本.增量版本-限定版本号”)
snapshot、release、latest是maven中常用的三个“限定版本号”,snapshot表示项目正处于活动的开发状态;latest是指项目的最新的发布版,或者最近被发布到仓库的快照版(snapshot);release是指仓库中的最后一个非快照版本。
maven最强大的地方就是能够对库文件(俗称“包、package”)的依赖进行管理。对于一个应用项目而言,不可避免的会引入很多第三方的类库。如一个项目采用struts2开发,使用struts2的2.1.6版本,而这个struts2又依赖于apache commons的某些包,如果我们不使用maven开发的话,需要下载这么多库文件,然后全部copy到项目的classpath路径下面,当依赖的第三方库越来越多,而且很多还有传递依赖,每当Java虚拟机抛出class not found exceptions时头都大了,而且一旦库升级,随之而来的又是一大堆问题。另外,如果我们将库文件纳入到版本库的管理中,也会造成版本库的急剧增大。
maven的出现解决了这个问题。她可以很好的管理这些问题,包括传递依赖。我们在pom文件里面加入:
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.14</version>
</dependency>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependencies>
上面代码的意思是我们为项目添加了log4j和dom4j以及junit的依赖,我们不用去找这些jar文件然后复制到classpath里面了,maven会自动去找这些包(本地或者远程仓库),每个dependency结点下面就是一个库文件的“主键”。
对于最后一个还有一个scope结点,标识了这个库文件的使用范围,有如下五种,其中compile是默认的:
compile:编译需要,在pachakge生命周期阶段如果使用”mvn assembly:assembly”命令,所有的包都会一起导出
provided:编译期间需要,但是由于部署环境中已经存在,打包时就不用输出了,如servlet.jar,在开发时编译需要的,但是部署到servlet容器中后,servlet容器肯定有这个库文件,所以就不用打包输出。
test:编译测试代码和运行测试期间需要
runtime:运行期间需要,但是编译期间不需要
system:表示这个包由jvm或者jdk提供
关于scope的详细说明请参考《Maven dependency and repository》
No Comments yet »