热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

Java如何通过Maven管理项目依赖

这篇文章主要介绍了Java如何通过Maven管理项目依赖,帮助大家更好的理解和使用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依赖中:

  

    ...

    
      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自带的中央仓库就足以应付绝大多数情况了,不需要任何额外的配置。

快照依赖

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

以上就是Java如何通过Maven管理项目依赖的详细内容,更多关于Maven管理项目依赖的资料请关注其它相关文章!


推荐阅读
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 禁止程序接收鼠标事件的工具_VNC Viewer for Mac(远程桌面工具)免费版
    VNCViewerforMac是一款运行在Mac平台上的远程桌面工具,vncviewermac版可以帮助您使用Mac的键盘和鼠标来控制远程计算机,操作简 ... [详细]
  • 本文详细介绍了云服务器API接口的概念和作用,以及如何使用API接口管理云上资源和开发应用程序。通过创建实例API、调整实例配置API、关闭实例API和退还实例API等功能,可以实现云服务器的创建、配置修改和销毁等操作。对于想要学习云服务器API接口的人来说,本文提供了详细的入门指南和使用方法。如果想进一步了解相关知识或阅读更多相关文章,请关注编程笔记行业资讯频道。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文讨论了B360主板是否可以安装win7系统的问题。由于B360主板不支持win7系统且缺乏官方驱动的支持,安装win7系统可能存在兼容性和稳定性问题。然而,通过借助USB3.0转接卡,B360主板仍然可以安装win7系统,但USB接口无法使用。相比之下,B365主板可以直接支持win7系统,并提供了相应的驱动,具有更好的稳定性和兼容性。选择合适的主板对于安装win7系统至关重要。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 本文详细介绍了解决全栈跨域问题的方法及步骤,包括添加权限、设置Access-Control-Allow-Origin、白名单等。通过这些操作,可以实现在不同服务器上的数据访问,并解决后台报错问题。同时,还提供了解决second页面访问数据的方法。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 本文介绍了如何使用iptables添加非对称的NAT规则段,以实现内网穿透和端口转发的功能。通过查阅相关文章,得出了解决方案,即当匹配的端口在映射端口的区间内时,可以成功进行端口转发。详细的操作步骤和命令示例也在文章中给出。 ... [详细]
author-avatar
寤丨惘_191
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有