在用maven管理项目时,当我们使用的第三方的jar包在Maven中央仓库没有下载,这个时候有两种解决办法,第一种是将jar包直接放在工程中,以指定systemPath来引用;另一种方法就是采用架设Nexus私服,通过将jar直接发布到私服上来解决引用问题。
引用工程内的jar包
举个最常见的例子就是ojdbc的引用,maven中央仓库是没有下载,采用本地引用的配置如下:
1 2 3 4 5 6 7
| <dependency> <groupId>ojdbc</groupId> <artifactId>ojdbc</artifactId> <version>14</version> <scope>system</scope> <systemPath>${project.basedir}/lib/ojdbc14.jar</systemPath> </dependency>
|
注意:
- systemPath必须是具体的jar,而不是jar所在目录.
- groupId, artifactId, version 必须设置,否则pom语法出错
- scope必须是system,当为system的时候maven将从systemPath中查找所需jar包,而不是从repository.
- 虽然jar包的名字叫ojdbc14.jar,但打出来的包命名规则是artifactId-version.jar
Nexus引用
使用Nexus私服不仅可以管理第三方jar的发布,还可以发布自己项目中的组件,还有另外的好处就是可以节省外网带宽,加快下载速度。
Nexus搭建
网上很多教程,这里不再重复了
创建deploy用户
在nexus上创建一个专门deploy jar包的用户
修改本地maven配置,配置发布帐号
比如,我创建一个用户叫deploy,在配置文件中新增以下配置:
1 2 3 4 5 6 7
| <servers> <server> <id>xxxx-releases</id> <username>deploy</username> <password>xxxx</password> </server> </servers>
|
工程pom或者maven settings.xml中配置仓库引用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| <repositories> <repository> <id>xxxx-nexus</id> <name>xxxx nexus Repository</name> <url>http://10.19.1.22/nexus/content/groups/public</url> </repository> <repository> <id>xxxx-thirdparty</id> <name>xxxx thirdparty Repository</name> <url>http://10.19.1.22/nexus/content/repositories/thirdparty/</url> </repository> <repository> <id>xxxx-releases</id> <name>xxxx Release Repository</name> <url>http://10.19.1.22/nexus/content/repositories/releases/</url> </repository> <repository> <id>xxxx-snapshots</id> <name>xxxx Snapshot Repository</name> <url>http://10.19.1.22/nexus/content/repositories/snapshots/</url> </repository> </repositories>
|
deploy第三方jar包
最常规的做法是执行maven deploy命令
1
| mvn deploy:deploy-file -DgroupId=com.xxx -DartifactId=yyyy -Dversion=1.0.1 -Dpackaging=jar -Dfile=D:\User\Desktop\xxxx.jar -Durl=http://10.19.1.22/nexus/content/repositories/thirdparty/ -DrepositoryId=xxxx-releases
|
注意:
- 命令中的repositoryId参数值要和上面server配置中的id要对应
- url表示要发布的私服仓库地址,可以发布到thirdparty,也可以直接发到releases中
使用脚本来发布jar包
使用命令行感觉太麻烦,为此我写了一个bat脚本,通过jar包重命名成一定规则名字来完成发布,脚本如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| @echo off setlocal enabledelayedexpansion set tpath=%1 for /f %%i in ("%tpath%") do ( set tname=%%~ni ) for /f "delims=- tokens=1,*" %%i in ("%tname%") do ( set jgroup=%%i ) for /f "delims=- tokens=2,*" %%i in ("%tname%") do ( set jname=%%i ) for /f "delims=- tokens=3,*" %%i in ("%tname%") do ( set jversion=%%i ) echo 即将执行以下命令,请核对,确认请按1 echo mvn deploy:deploy-file -DgroupId=%jgroup% -DartifactId=%jname% -Dversion=%jversion% -Dpackaging=jar -Dfile=%tpath% -Durl=http://10.19.1.22/nexus/content/repositories/releases/ -DrepositoryId=xxxx-releases set /p var=是否确认: if %var%==1 ( echo deploy jar to Nexus 开始... mvn deploy:deploy-file -DgroupId=%jgroup% -DartifactId=%jname% -Dversion=%jversion% -Dpackaging=jar -Dfile=%tpath% -Durl=http://10.19.1.22/nexus/content/repositories/releases/ -DrepositoryId=xxxx-releases >deploy.log echo deploy jar to Nexus 结束... )else ( echo 取消命令,按任意键退出 ) pause
|
将代码复制到新建文件depoly.bat中。
我们将jar包重命名成groupId-artifactId-version.jar之后,直接拖到deploy.bat上,按1确认后会在当前目录中生成deploy.log日志。