Java如何通过Maven管理项目依赖
项目的依赖
java最大的一个优势之一应该是整个生态中无数的框架和api,我们创建实际的项目不可避免的都需要用到这些框架和api,而它们通常都是以jar包的形式提供。我们之前在编译项目的时候,需要在classpath上存放依赖的jar包。而且这些外部的jar包还会有其他依赖。我们需要递归地一个个去下载所有这些外部依赖,并且要确保下载的版本都是正确的,当项目越来越复杂的时候,这是极其麻烦的事情,比如碰到jar hell的问题。
maven现在来拯救我们了,maven可以自动帮我们做依赖管理,我们需要做的就是在pom文件里指定依赖jar包的名称、版本号,maven会自动下载,递归地去下载所有依赖,我们可以从具体的依赖添加工作解放出来了。
通过maven定义依赖
之前的例子是一个完全自包含的项目,不需要额外的包依赖,因为它实在太简单了。我们来让这个例子稍微复杂一点,在打印"hello world!"的时候同时打印出日期和时间,我们希望使用joda提供的时间库来让帮助我们简化时间相关的处理代码:
package com.tianmaying.mavendemo; import org.joda.time.localtime; public class helloworld { public static void main(string[] args) { localtime currenttime = new localtime(); system.out.println("the current local time is: " + currenttime); newcomer newcomer = new newcomer(); system.out.println(newcomer.sayhello()); } }
我们使用joda time包提供的localtime
类来获取和打印当前时间。
这时如果我们执行mvn compile
将会报出编译错误。需要将 joda time这个库添加到我们的pom依赖中:
<dependencies> ... <dependency> <groupid>joda-time</groupid> <artifactid>joda-time</artifactid> <version>2.2</version> </dependency> </dependencies>
上面这段xml定义了这个项目的依赖。在<depency>元素中,包含三个子元素:
- <groupid> 类似于项目所属的组织,所依赖的包也属于某一个组织
- <artifactid> 依赖包的名称
- <version> 依赖包的版本
依赖还有一个范围(scope)的属性,有三种取值:
- compile表示这个依赖在编译时应该存在,这是scope的默认值
- provided表示这个依赖不仅在编译时需要,同时应该在运行时也存在,比如java servlet api的依赖
- test表示依赖在编译和测试时需要,但是运行时不要求存在,比如junit的依赖,运行时是不需要的
此时运行mvn compile或者mvn package,maven应该可以解析到joda库,并将其从*仓库下载,构建成功啦!
maven仓库
maven仓库可以认为是基于maven的一个构件(主要时jar包)管理工具,你可以从里面找构件,也可以往里面增加构件。如果你用过ant就会知道,通过ant来管理项目时,我们一般都需要一个lib文件夹,各种依赖的jar包都会放进去,而且为了协作的一致性,通常还需要放到代码版本管理系统中。现在轻松简单了,基于基于依赖的信息,maven就可以自动地以递归的方式下载所有的依赖,直到整个依赖树都下载完毕并放到你的本地仓库中。maven仓库本质上存储了jar包和元数据信息,通过原信息能够准确定位到jar包,从而能够获取和修改。
maven有三种类型的仓库:
- 本地仓库:本地仓库默认在用户目录下,包含了下载的所有依赖
- *仓库:*仓库由maven自己提供的,本地仓库中的没有依赖默认都会去*仓库查找,下载后会存放到本地仓库
- 远程仓库:远程仓库是远程服务器上可访问的仓库, 本质类似于*仓库(只不过*仓库是权威罢了,而且你不能乱动:)。远程仓库可以本地网络中或者互联网上,一般团队内部会设置一个内部的远程仓库,这样可以解决安全共享,网络代理等问题。
maven首先会从本地仓库,然后是*仓库,最后如果pom文件中配置了远程仓库,会到远程仓库中查找依赖。
远程仓库需要配置.settings文件,需要加入类似这样的配置:
<repositories> <repository> <id>tianmaying</id> <url>http://tianmaying.com/maven2/lib</url> </repository> </repositories>
我们学习过程中,使用maven自带的*仓库就足以应付绝大多数情况了,不需要任何额外的配置。
快照依赖
maven还提供一个非常方便的功能:快照依赖。快照依赖指的是那些还在开发中的内部依赖包。与其经常地更新版本号来获取最新版本,不如你直接依赖项目的快照版本。快照版本的每一个build版本都会被下载到本地仓库,即使该快照版本已经在本地仓库了。总是下载快照依赖可以确保本地仓库中的每一个build版本都是最新的。这对我们快速迭代开发是一个非常酷的特性。
以上就是java如何通过maven管理项目依赖的详细内容,更多关于maven管理项目依赖的资料请关注其它相关文章!
推荐阅读
-
Java全栈程序员之06:IDEA中MAVEN项目依赖及运行
-
Java如何通过Maven管理项目依赖
-
Gradle 发布共享库——如何通过Gradle发布java依赖库(jar)到 jitpack 公共仓库(—)
-
从初识Maven到使用Maven进行依赖管理和项目构建
-
Maven:maven简介、安装与整合web项目、maven常用命令、依赖管理
-
java maven项目管理工具的介绍
-
IntelliJ IDEA如何重新导入所有maven项目依赖?
-
如何使用gradle将java项目推送至maven*仓库
-
Java Web项目中Maven管理jar包,如何用命令添加ja包!
-
通过java导入读取微软项目管理文件