背景
接到一个项目需求,需要对接第三方的业务方,通过调他们的sdk,调用他们的接口。sdk是以一个jar包的形式提供的,并没有上传到maven中央仓库,没办法直接通过maven的方式引入
思路
遇到这种场景,通常有2种方法
1.把包给运维,帮忙发到公司内部的私有仓库,然后通过maven的方式引入
2.把包放到要引入的项目里,pom里直接引用项目里的jar包
第一种方式需要找运维沟通,如果可以,按照正常引用maven包的方式就行,所以主要说第二种方式
第二种方式首先采取的是网上最多的方式
1.在对应模块的src下新建个lib文件夹(目录可以自己定),将jar包复制进来
2.对应模块的pom文件加入依赖:
<dependency>
<groupId>sdk</groupId>
<artifactId>test</artifactId>
<version>1.0.0</version>
<scope>system</scope>
<systemPath>${pom.basedir}/src/lib/test.jar</systemPath>
</dependency>
groupId,artifactId,version都可以自己定,path为jar包复制的路径,pom.basedir和project.basedir一样,都是相对路径
到这一步,本地已经可以正常引到包了,也能正常maven打包,编译,运行代码,自测,本来以为到这就万事大吉了,发到测试环境后,maven打包部署,项目启动都没问题,但是当访问到对应的方法时,就会报错:java.lang.NoClassDefFoundError
继续解决:
经过百度搜索,发现如果要发到服务器上的,还需要在对于的pom文件里引入spring-boot-maven-plugin插件,并且includeSystemScope属性配置为true(网上基本上都是这个答案,也有很多人是通过这种方案解决的),如下:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<includeSystemScope>true</includeSystemScope>
</configuration>
</plugin>
</plugins>
</build>
于是就尝试了一下,结果发现还是不行,本地环境可以,到测试环境就不行
因为编辑和maven打包都没问题,调用的时候才会报错,怀疑测试环境没把这个jar包打进去,再进一步怀疑和jenkins部署,每次部署项目后会创建新的容器有关,于是换了一种方式:
1.使用maven-install-plugin插件,phase表示每次clean的时候会把对应的jar包部署到容器的本地仓库,参数和上面的一样
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
<executions>
<execution>
<id>install-external</id>
<phase>clean</phase>
<configuration>
<file>${project.basedir}/src/lib/test-0.1.9.jar</file>
<repositoryLayout>default</repositoryLayout>
<groupId>sdk</groupId>
<artifactId>test</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<generatePom>true</generatePom>
</configuration>
<goals>
<goal>install-file</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
2.引入对应的pom文件信息
<dependency>
<groupId>sdk</groupId>
<artifactId>test</artifactId>
<version>1.0.0</version>
</dependency>
再次发到测试环境,重新打包部署就好了,可以看到在测试环境打包的时候,将第三方的jar包打包到了本地仓库
另外:如果采用方式1,直接把包发到公司私有仓库,执行语句:
mvn deploy:deploy-file --settings /Users/zcy/tools/apache-maven-3.6.3/conf/zcy_settings.xml -DgroupId=${groupId} -DartifactId=${artifactId} -Dversion=0.1.9 -Dpackaging=jar -Dfile=${jar包的路径} -Durl=${公司仓库的url} -DrepositoryId=dev/releases