需求来源
模拟场景是有一个服务商提供的定制包,但是公司内部又没有自建nexus仓库或者这个包不方便放到仓库中,
在我的场景是以前的老代码依赖的一个包,由于环境迁移将老的nexus仓库已经废弃了,而新的环境又拉不到这个包,此时有两个方案,一个是将生产环境里面这个包拿出来放到新的迁移环境的nexus仓库中去,或者是按照下面的方法把包放到项目内部进行管理依赖
解决方案实现
- 假设我们有一个二方或三方包长这样,但是它没有在任何公网或内网仓库内能访问到
- 这个包目前非常简单,只有一个接口待实现,实际情况下可能还有很多东西,但是不影响,我们直接进行打包,最后会得到一个jar包
- 将这个jar包通过命令打包到我们本地的maven仓库中,这一步主要是为了自动生成它对应的pom文件,参数内请注意运行位置和jar包位置,如果当前运行位置不在jar包的目录下,可以设置绝对路径,例如-Dfile=D:/projects/localFacade/target/localFacade-1.0.jar
mvn install:install-file -Dfile=localFacade-1.0.jar -DgroupId=com.xsx -DartifactId=localFacade -Dversion=1.0 -Dpackaging=jar
- 执行成功后我们可以在.m2的本地maven仓库内根据路径找到这个包,现在是长这样,我们需要拿到这个.pom文件
- 在自己的项目内创建一个文件夹,并根据groupId和artifactId以及版本号创建目录,跟.m2文件夹内的目录一致,并且将jar包和上面的.pom文件放进来,如下所示
- 在需要依赖这个包的模块内增加repository配置,层级在project下即可,project.basedir地址为当前模块的目录,不是整个项目的根目录,我放在父pom下的,所以层级中配置的是${project.basedir}/../localRepo,否则如果localRepo在模块下同级,那就不需要中间的“../
<repositories> <repository> <id>localRepo</id> <name>localRepo</name> <url>file://${project.basedir}/../localRepo</url> </repository> </repositories>
- 在dependency里面添加maven依赖,然后刷新maven配置等待加载依赖,然后项目中就可以正常引用私有包中的类
<dependency> <groupId>com.xsx</groupId> <artifactId>localFacade</artifactId> <version>1.0</version> </dependency>
- 完整目录层级如下
- 模块1(md1)中的完整pom文件如下
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.example</groupId> <artifactId>localRepoTest</artifactId> <version>1.0-SNAPSHOT</version> </parent> <artifactId>md1</artifactId> <properties> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>com.xsx</groupId> <artifactId>localFacade</artifactId> <version>1.0</version> </dependency> </dependencies> <repositories> <repository> <id>localRepo</id> <name>localRepo</name> <url>file://${project.basedir}/../localRepo</url> </repository> </repositories> </project>