【Maven技术专题】「入门到精通」教你如何使用Maven中引用依赖本地Jar包,并进行打包输出

前言

在使用Maven管理Java项目时,有时需要引入一些存放在系统特定位置的JAR文件。这些JAR文件可能是你自己编写的,也可能是其他来源的。无论是哪种情况,使用 Maven 的 system 范围和 systemPath 参数,可以方便地引入这些本地依赖。

仓库分类

在Java开发中,Maven是非常重要的构建工具,他的仓库机制用于存储和管理项目的依赖。Maven仓库大致可以分为两类:本地仓库和远程仓库。
在这里插入图片描述

本地仓库

本地仓库是开发者本地机器上的仓库,所有下载的或者由Maven构建生成的项目的构件(artifact)都存储在这里。这种仓库只能被你的Maven客户端访问

本地仓库的位置

Maven本地仓库默认情况下位于当前用户的主目录下的.m2目录,即“C:\Users{用户名}.m2\repository”这个位置,这个本地仓库用于存储Maven下载的所有依赖库文件。

修改对应的本地仓库位置

通过更改Maven的全局设置文件settings.xml来改变本地仓库的位置。这个文件位于你Maven安装目录的conf目录下。在settings.xml文件中,你可以找到localRepository这个标签,该标签默认会被注释掉,移除注释并设置新的路径就可以改变本地仓库的位置。

在开发过程中,如果你有一个Java项目或模块(比如一个构建了的jar文件),想把它作为一个本地的依赖供其他项目或模块使用,你可以通过Maven的Install插件来做到这一点。Install插件负责将项目构件安装到本地仓库,《mvn clean install》这条命令将会清除目标目录下的旧版本构建文件,然后生成新的构建文件,并将其安装到本地仓库。这样,其他依赖此构件的模块便能从本地仓库中获取到这个依赖,从而进行进一步的构建和开发。

远程仓库

远程仓库是部署在web服务器上的,可以被多个构建项目共享。

远程仓库的种类

远程仓库主要包括下列三种:
在这里插入图片描述

  • 中央仓库:Maven 中央仓库是一个由Maven社区维护的,项目中通常都会用到的开源构建会被发布到此处。Maven 会默认从该仓库获取依赖包,不需要进行额外配置。

  • 私服仓库:如果发现从中央仓库下载构建过慢,或者需要存储公司内部的专有构建,可以配置私有仓库(如Nexus或Artifactory)。

  • 其他仓库:除了Maven中央仓库以外还有其他第三方维护的公共库,这些库里面可能会包含中央仓库中没有的一些依赖包。

依赖搜索顺序

Maven的搜索顺序是先本地仓库,然后再远程仓库,而远程仓库中,先搜索私服,其次才是中央仓库和其他公共库,这样的安排既保证了优先使用本地资源,节省了宽带,也能保证依赖库的及时更新。
在这里插入图片描述

使用system scope+systemPath

Maven使用system范围与systemPath参数来引用本地的JAR文件。

system scope的作用

当使用 system scope 指定依赖时,Maven会在系统中查找已经存在的该依赖,如果存在则直接使用,避免再次去远程仓库中查找。然而,如果该依赖在系统中不存在,后续操作依然会失败。因此,在使用 system 范围引入依赖之前,确保该依赖在你的系统中存在。这是一个需要注意的问题。

systemPath的作用

systemPath 参数用于指定依赖在系统中的绝对路径,这样 Maven 在编译时就可以直接使用这个路径来查找依赖。如果同一个依赖在工程中多次使用,重复指定 systemPath 参数比较繁琐。为了避免这种情况,可以考虑使用 Maven 的 project.parent 或 dependencyManagement 来进行统一管理。这样可以将依赖的版本、scope 等信息放在一个地方进行管理,使得项目结构更加清晰和易于维护。在实际项目中,这种方式往往会提高开发效率,减少错误的发生。

使用案例

Maven项目中的一个 dependencies 配置,用于指定项目需要依赖的外部 jar 包。具体来说,这个配置中指定了一个 groupId 为 com.liboware,artifactId 为 my-jar,version 为 1.0 的外部 jar 包,并且给这个依赖设置了系统作用域(scope),同时指定了这个 jar 包在本地文件系统中的路径。

依赖的引入

  <dependencies><dependency><groupId>com.liboware</groupId><artifactId>my-jar</artifactId><version>1.0</version><scope>system</scope><systemPath>${project.basedir}/lib/my-jar.jar</systemPath></dependency></dependencies>

scope属性的取值分别有 compile、provided、runtime、test 和 system,分别表示依赖在编译、运行、测试中的作用域,而 system 则表示不需要从 Maven 仓库中下载,而是直接使用本地系统中 jar 包的路径,适用于一些本地 jar 包的使用场景。在本例中,使用了 system 作用域,并指定了本地 jar 包的路径为 ${project.basedir}/lib/my-jar.jar

所引发的隐患问题

这种配置方式比较灵活,适用于一些需要使用本地 jar 包的场景,但同时也存在一些问题。由于使用 system 作用域时,Maven 不再管理依赖 jar 包的版本信息,这可能会导致不同版本的 jar 包之间冲突的问题,因此需要额外的注意依赖 jar 包的版本号和文件路径的正确性。

打包处理插件

当使用 Maven 的打包插件 jar-with-dependencies 打包时,使用system作用域引入的依赖包将不会被包含在输出的可执行 jar 文件中。如果需要将本地依赖包打入可执行 jar 文件中,可以通过 Maven 的resources标签进行配置。

<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><executions><execution><id>make-assembly</id><phase>package</phase><goals><goal>shade</goal></goals><configuration><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs><finalName>xxx-jar-with-dependencies</finalName></configuration></execution></executions></plugin></plugins><resources><resource><targetPath>lib/</targetPath><directory>lib/</directory><includes><include>**/*.jar</include></includes></resource></resources></build>

这段 Maven 配置主要实现了使用 maven-shade-plugin 插件打包项目,并将依赖的第三方库和应用程序代码打包在一个可执行的 jar 文件中。同时,还将本地依赖包 *.jar 打包进可执行 jar 文件中。

具体来说,该配置包含以下内容:

  • maven-shade-plugin 插件配置:该插件用于打包和重写 jar 文件
    • descriptorRefs:指定打包类型,这里配置为 jar-with-dependencies,表示打出包含依赖的 jar 包
    • finalName:指定可执行 jar 包的文件名
  • resources 配置:将本地依赖包打包进 jar 文件中
    • targetPath:指定本地依赖包在 jar 中的存储路径
    • directory:指定本地依赖包的存储路径
    • includes:指定需要打包进 jar 文件中的本地依赖包

总的来说,这个配置文件展示了一个简单的 Maven 打包过程的流程,通过 maven-shade-plugin 插件实现了将项目及其依赖(包括本地依赖包)打包在一个 jar 文件中的需求。

打包结果以及效果

生成的 xxx-jar-with-dependencies.jar 将会包含 lib 目录以及其中的 *.jar 文件,该 jar 包在执行时可以找到这些依赖包。

但有时这种方法可能会失效,比如在声明 JDBCDriver 时,使用 Class.forName("xxx.Driver") 时可能会报类找不到的错误。此时可以使用以下两种方法来解决:

  • 将依赖的 JDBC 驱动包作为单独的依赖项,在运行时通过 -cp 参数指定类路径,例如:java -cp xxx-jar-with-dependencies.jar:mysql-connector-java-8.0.25.jar com.example.Main
  • 将依赖的 JDBC 驱动包打包进 xxx-jar-with-dependencies.jar,并在运行时手动调用 ClassLoader 加载该依赖包中的类。

使用mvn install:install-file

可以使用以下命令将 .jar 包安装到本地 Maven 仓库中:

mvn install:install-file -Dfile=my-jar.jar -DgroupId=com.liboware -DartifactId=my-jar -Dversion=1.0 -Dpackaging=jar

其中:

  • -Dfile:指定要安装的 .jar 文件的位置和文件名。
  • -DgroupId:指定 Maven 项目的 GroupId。
  • -DartifactId:指定 Maven 项目的 ArtifactId。
  • -Dversion:指定 Maven 项目的版本号。
  • -Dpackaging:指定 Maven 项目的打包方式(例如:jar、war、pom 等)。

添加 in project repository

如果你希望在一个新机器上执行 Maven 项目时不用运行 mvn install:install-file 命令,你可以将你的 .jar 包添加到项目的本地仓库中。

在项目的 pom.xml 文件中,可以声明一个 <repositories> 元素来定义项目的本地仓库。例如:

<repositories><repository><id>my-local-repository</id><url>file://${project.basedir}/lib</url></repository>
</repositories>

在上面的示例中,我们定义了一个 my-local-repository 的仓库,它的 URL 是 ${project.basedir}/lib,也就是项目的 lib 文件夹。

现在,你可以将你的 .jar 包放到项目的 lib 文件夹下,当你执行 Maven 命令时,Maven 就会从这个 my-local-repository 仓库中查找你的 .jar 包了。

<dependency><groupId>com.liboware</groupId><artifactId>my-jar</artifactId><version>1.0</version>
</dependency>

你的jar包及路径必须严格遵循格式:

/groupId/artifactId/version/artifactId-verion.jar

本例中:lib/com/liboware/my-jar/1.0/my-jar-1.0.jar

内容总结

Maven中,可用system范围和systemPath参数引用本地.jar文件,或使用mvn install:install-file命令安装到本地仓库。为了省去在新机器上安装的麻烦,需在pom.xml文件中声明<repositories>元素指定本地仓库路径,以便Maven自动查找依赖。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/216936.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Logstash输入Kafka输出Es配置

Logstash介绍 Logstash是一个开源的数据收集引擎&#xff0c;具有实时管道功能。它可以从各种数据源中动态地统一和标准化数据&#xff0c;并将其发送到你选择的目的地。Logstash的早期目标主要是用于收集日志&#xff0c;但现在的功能已经远远超出这个范围。任何事件类型都可…

Python从入门到精通九:Python异常、模块与包

了解异常 什么是异常 当检测到一个错误时&#xff0c;Python解释器就无法继续执行了&#xff0c;反而出现了一些错误的提示&#xff0c;这就是所谓的“异常”, 也就是我们常说的BUG bug单词的诞生 早期计算机采用大量继电器工作&#xff0c;马克二型计算机就是这样的。 19…

理解排序算法:冒泡排序、选择排序与归并排序

简介&#xff1a; 在计算机科学中&#xff0c;排序算法是基础且重要的概念。本文将介绍三种常见的排序方法&#xff1a;冒泡排序、选择排序和归并排序。我们将探讨它们的工作原理、特点和适用场景&#xff0c;以帮助读者更好地理解和选择合适的排序方法。 冒泡排序 冒泡排序是…

logback日志框架使用

依赖引入 <dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.1.7</version> </dependency> 使用logback日志框架只需要引入以上即可&#xff0c;(我们平时使用较多的Slf4j…

浏览器提示不安全

当我们使用浏览器访问一个网站时&#xff0c;如果该网站使用的是HTTPS连接&#xff0c;那么浏览器会对其进行安全性的检查。其中一项重要的检查就是确认该网站是否拥有有效的SSL证书。然而&#xff0c;有时我们会在浏览器中看到“不安全”的警告&#xff0c;这通常是由于SSL证书…

三天精通Selenium Web 自动化 - Selenium(Java)环境搭建

1 下载JDK JDK下载地址&#xff1a;http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 2 安装和配置JDK 安装目录尽量不要有空格 D:\Java\jdk1.8.0_91; D:\Java\jre8设置环境变量&#xff1a; “我的电脑”->右键->“属性”->…

C.小苯的排列构造

C-小苯的排列构造_北京信息科技大学第十五届程序设计竞赛&#xff08;同步赛&#xff09; (nowcoder.com) 凑2很容易想出来&#xff0c;但是2 4 1 3 这个内核不好想&#xff0c;算是一种尝试和经验吧 #include<bits/stdc.h> using namespace std;int n;int main() {cin&g…

今天公司来了个拿 30K 出来的测试,算是见识到了基础的天花板

今天上班开早会就是新人见面仪式&#xff0c;听说来了个很厉害的大佬&#xff0c;年纪还不大&#xff0c;是上家公司离职过来的&#xff0c;薪资已经达到中高等水平&#xff0c;很多人都好奇不已&#xff0c;能拿到这个薪资应该人不简单&#xff0c;果然&#xff0c;自我介绍的…

CPU、内存与硬盘及IO操作

目录 1、概念简介 1.1 CPU&#xff08;Central Processing Unit&#xff0c;中央处理器&#xff09; 1.2 硬盘&#xff08;Hard Disk Drive&#xff09; 1.3 内存&#xff08;Memory&#xff09; 2、计算机程序在进行io读写操作时&#xff0c;这三者的功能和实现原理 1、概…

【C语言】结构体实现位段

引言 对位段进行介绍&#xff0c;什么是位段&#xff0c;位段如何节省空间&#xff0c;位段的内存分布&#xff0c;位段存在的跨平台问题&#xff0c;及位段的应用。 ✨ 猪巴戒&#xff1a;个人主页✨ 所属专栏&#xff1a;《C语言进阶》 &#x1f388;跟着猪巴戒&#xff0c;…

使用paddleocr识别图片文本的一种方案

pdf文本分为两种&#xff0c;一种是标准的pdf格式的文本&#xff0c;这种无需利用ocr识别&#xff0c;另外一种就是图片文本&#xff0c;这种需要进行ocr的识别。 OCR 识别文本和文本区域 ppstructure是paddleocr里面的一个子库&#xff0c;可以识别文档的页眉页脚、正文、标…

从手工测试进阶中高级测试?如何突破职业瓶颈...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、手工测试如何进…

Linux:gdb的简单使用

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》 文章目录 前言一、前置理解二、使用总结 前言 gdb是Linux中的调试代码的工具 一、前置理解 我们都知道要调试一份代码&#xff0c;这份代码的发布模式必须是debug。那你知道在li…

jquery实现省市区三级联动

一、技术: 前端采用的是jsp页面 后端采用springmvc+mybatis+mysql8 效果图 二、cascadeSelect.jsp页面 <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%String path = request.getContextPath();String basePath = r…

YOLOv8改进 | 2023主干篇 | 利用RT-DETR特征提取网络PPHGNetV2改进YOLOv8(超级轻量化精度更高)

一、本文介绍 本文给大家带来利用RT-DETR模型主干HGNet去替换YOLOv8的主干&#xff0c;RT-DETR是今年由百度推出的第一款实时的ViT模型&#xff0c;其在实时检测的领域上号称是打败了YOLO系列&#xff0c;其利用两个主干一个是HGNet一个是ResNet&#xff0c;其中HGNet就是我们…

Mybatis映射接口的动态代理实现原理

Mybatis映射接口的动态代理实现原理 在上一节中&#xff0c;我们介绍了MyBatis的核心配置文件加载流程&#xff0c;Mybatis核心配置文件加载流程详解 在文中&#xff0c;我们介绍了MyBatis在加载配置文件的过程中会针对每个接口类都生成一个相应的MapperProxyFactory动态代理工…

【上海大学数字逻辑实验报告】六、时序电路

一、 实验目的 掌握同步二进制计数器和移位寄存器的原理。学会用分立元件构成2位同步二进制加计数器。学会在Quartus II上设计单向移位寄存器。学会在Quartus II上设计环形计数器。 二、 实验原理 同步计数器是指计数器中的各触发器的时钟脉冲输入端连接在一起&#xff0c;接…

FL Studio Producer Edition 21.2.2.3914中文汉化破解版新功能介绍及下载安装教程

FL Studio Producer Edition 21.2.2.3914中文汉化破解版 也就是 Image-Line 出品的一款功能强大的编曲软件&#xff0c;全名 Fruity Loops Studio 简称“FL Studio”今天突然的发现我们经常使用的水果音乐制作软件 FL STUDIO 居然从FL STUDIO 21.1.1 一下子跨越了版本号到了FL …

【产品经理】需求池和版本树

在这个人人都是产品经理的时代&#xff0c;每位入行的产品人进阶速度与到达高度各有不同。本文作者结合自身三年产品行业的经历&#xff0c;根据案例拆解产品行业的极简研发过程、需求池、版本树、产品自我优化等相关具体方法论。 一、产品研发的极简过程 1. 产品概述 产品就…

Server check fail, please check server xxx.xxx.xxx.xxx,port 9848 is available

记录一次服务调用中的错误 背景&#xff1a;我使用了nacos2.x的版本&#xff0c;同时在同一台服务器的三个docker容器中部署了nacos1、2、3&#xff0c;并将它们连接到了同一个docker网络 错误&#xff1a;Server check fail, please check server xxx.xxx.xxx.xxx,port 9848 …