Java通过Maven实现管理项目依赖
创始人
2024-11-16 14:22:49
0次

项目的依赖

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依赖中:

  

    ...

    
      joda-time
      joda-time
      2.2
    
  

上面这段XML定义了这个项目的依赖。在元素中,包含三个子元素:

  • 类似于项目所属的组织,所依赖的包也属于某一个组织
  • 依赖包的名称
  • 依赖包的版本
     

依赖还有一个范围(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文件,需要加入类似这样的配置:


  
    tianmaying
    http://tianmaying.com/maven2/lib
  

快照依赖

Maven还提供一个非常方便的功能:快照依赖。快照依赖指的是那些还在开发中的内部依赖包。与其经常地更新版本号来获取最新版本,不如你直接依赖项目的快照版本。快照版本的每一个build版本都会被下载到本地仓库,即使该快照版本已经在本地仓库了。总是下载快照依赖可以确保本地仓库中的每一个build版本都是最新的。这对我们快速迭代开发是一个非常酷的特性。

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...