如何向maven本地仓库添加jar包

如何向maven本地仓库添加jar包,第1张

原则上Maven的设计是不需要这么做的,因为pom.xml中依赖的jar包会自动实现从中央仓库下载到本地仓库。但是公司设计了一个setting,如果本地仓库没有,就去setting指定的url中下载jar包,如果还没有就报错。

考虑到setting中url的jar包比较老,如果需要用最新的,则需要将jar包手动下载到本地仓库。

比如我下载了

lucene-queryparser-4.6.1.jar

怎么添加到本地仓库呢?

步骤:

1.cmd命令进入该jar包所在路径

2.执行命令

mvn install:install-file -Dfile=lucene-queryparser-4.6.1.jar -DgroupId=org.apache.lucene -DartifactId=lucene-queryparser -Dversion=4.6.1 -Dpackaging=jar

(不同的jar包相对应替换对应部分)

另外我尝试了下面的方法,发现不行:

直接写一个空的pom,里头包含对所需要jar包的依赖,通过这种方式希望将jar包下载到本地仓库。但是应用代码中没用到,maven命令没有下载这个jar包到本地仓库。

补充,-DgroupId和-DartifactId的作用其实是指定了这个jar包的安装在repository的安装路径,只是用来告诉项目去这个路径下寻找这个名称的jar包。比如:

mvn install:install-file -Dfile=freemarker-2.3.13.jar -DgroupId=freemarker -DartifactId=freemarker -Dversion=2.3.13 -Dpackaging=jar

就是安装到了repository\freemarker\freemarker\2.3.13目录下,如果在dependency的依赖里也这么写的话,就可以到对应的目录去寻找。

对于maven中存在classifier的,例如

<dependency>

<groupId>org.apache.hadoop</groupId>

<artifactId>hadoop-hdfs</artifactId>

<version>2.2.0</version>

<classifier>tests</classifier>

</dependency>

就加一个-D参数就可以了,如下:

mvn install:install-file -Dfile=hadoop-hdfs-2.2.0-tests.jar -DgroupId=org.apache.hadoop -DartifactId=hadoop-hdfs -Dversion=2.2.0 -Dclassifier=tests -Dpackaging=jar

一、使用Dependency声明

这个方法就是和其他maven的dependency一样,在pom.xml里声明一个dependency:

<dependency>

<groupId>org.ibm</groupId>

<artifactId>jms</artifactId>

<version>1.0.0</version>

<scope>system</scope>

<systemPath>${project.basedir}/lib/jms.jar</systemPath>

</dependency>

细心的人可能已经留意到了,这里多了两个声明:scope和systemPath。

二、创建一个Project范围的库

以上的方法是从避免安装lib到maven库方向上实现。另一种方法就是则是从构造库的方向上考虑的:创建一个虚拟的本地库,让maven到这个本地库里去查找需要的lib。

步骤大致如下:

1. 构造虚拟Maven库

这里我们需要提供一个和maven库结构一样的文件夹/文件结构,以模拟Maven库,例如假如project里lib即是一个maven库,则它的结构可能是:

如上,虚拟库中声明了两个jar:

1. com.ibm.mq-1.0.jar : groupId 是 org.ibm.jms;artifactId是com.ibm.mq;version是1.0

2. com.ibm.mqjms-1.0.jar : groupId是org.ibm.jms;artifactId是com.ibm.mqjms;version是1.0

假设以上jar是可用的maven依赖的话,那在dependency依赖里的添加项为:

<dependency>

<groupId>org.ibm.jms</groupId>

<artifactId>com.ibm.mqjms</artifactId>

<version>1.0</version>

</dependency>

<dependency>

<groupId>org.ibm.jms</groupId>

<artifactId>com.ibm.mq</artifactId>

<version>1.0</version>

</dependency>

下面的问题就是如何让Maven能找到这个虚拟Maven库。

在pom.xml里,我们使用repositories声明可能查找的、多个其他的Maven的库,例如:

<repositories>

<repository>

<releases>

<enabled>false</enabled>

<updatePolicy>always</updatePolicy>

<checksumPolicy>warn</checksumPolicy>

</releases>

<snapshots>

<enabled>true</enabled>

<updatePolicy>never</updatePolicy>

<checksumPolicy>fail</checksumPolicy>

</snapshots>

<id>codehausSnapshots</id>

<name>Codehaus Snapshots</name>

<url>http://snapshots.maven.codehaus.org/maven2</url>

<layout>default</layout>

</repository>

</repositories>

当Maven在Central库里没有找到对应的artifact,则会到这些库里去查找。所以,我们只需要如上把虚拟的Maven库的定义的添加到pom.xml里即可:

Xml代码 收藏代码

<repositories>

<repository>

<id>repo</id>

<releases>

<enabled>true</enabled>

<checksumPolicy>ignore</checksumPolicy>

</releases>

<snapshots>

<enabled>false</enabled>

</snapshots>

<url>file://${project.basedir}/lib</url>

</repository>

</repositories>

这里库的路径是:${project.basedir}/lib 。它是一个release库而不是snapshot库。

区别

方式一:会直接引用指定路径的lib,而不会把它加到本地的Maven库里去,所以它只在当前project使用,但工程可以方便的共享,且不使用额外的空间

方式二:引用的jars会首先被安装到本地的maven库里,然后再通过引用从本地的Maven库里加载,好处是一旦安装,在其他的project也可以引用,但是需要首先在本地安装,当前工程是便携的,但是直接引用而未如上声明的工程可能不是便携的。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11474142.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存