一.简介
Maven默认提供的中央仓库是在远程网络服务Appache提供的,这对于我们开发时不合理的。如果我们没网了或者什么情况,我们怎么办?我们需要的jar包中央库没有或者是要收费怎么办?也就是说我们队中央仓库的依赖性太大。而Nexus私服则可以解决我们这个问题。
这样就相当于在我们本地的局域网搭建了一个类似中央仓库的服务器,我们开始将中央仓库的一些资料下载到私服务器上,然后平时我们的maven项目就是直接访问局域网内的私服即可,既节省了网络带宽也会加速项目搭建的进程,这样对我们开发来说,对公司来说都是非常好的选择。项目内部和项目与项目之间也可以共享jar包,达到代码的最大化利用。
一般有两种情况需要我们上传jar包至nexus,一个是本地项目生成的jar包,另一个是我们从第三方拿过来的的中央库中不存在的jar包,前者采用maven工程deploy的方法,后者采用手动上传的方式。
二.手动上传jar包
GAV Parameters
GAV Parameters方式只能上传单个jar包,无法携带依赖。
示例中使用的jar包为:geogson.jar包,基本信息:
<dependency>
<groupId>com.nsn.geogson</groupId>
<artifactId>geogson</artifactId>
<version>1.0.0</version>
</dependency>
1.首先登陆nexus,进入3rd party,选择Artifact Upload
2.填写相应的信息,版本等等
3.添加后提交
4.导入成功后,search该包显示如下:
From POM
From POM方式,可以将上传jar包的依赖一起上传。例如:我们想传a.jar到私服,但是a.jar还依赖b.jar,假如只传a.jar到私服,在项目中会因为找不到a.jar的依赖(b.jar)而报错。
当需要导入DB2驱动时,需要db2jcc.jar,而db2jcc.jar又要依赖db2jcc_license_cu.jar,此时,导入方式如下
1.编写POM
手动编写db2jcc.jar的pom.xml,如下:
<project ...>
<modelVersion>4.0.0</modelVersion>
<groupId>xxx.xxx.db2driver</groupId>
<artifactId>db2jcc</artifactId>
<packaging>jar</packaging>
<version>1.0.0</version>
<name>db2jcc</name>
<dependencies>
<dependency>
<groupId>xxx.xxx.db2driver</groupId>
<artifactId>db2jcc-license-cu</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
</project>
2.在Nuxus的GUI中导入
导入方式如下:
3.导入依赖的jar
导入依赖的db2jcc_license_cu.jar,如下:
注意这里的配置必须按照1中的配置。
最后,确保所有依赖的jar全部导入进第三方宿主仓库后,就可以在工程中引入,配置如下:
<dependency>
<groupId>xxx.xxx.db2driver</groupId>
<artifactId>db2jcc</artifactId>
<version>1.0.0</version>
</dependency>
三.命令行自动上传
1.如果本机安装了Maven服务, 可在${MAVEN_HOME}/conf/setting.xml中指定私服相关的配置
<!-- 在servers标签下配置server, 包括: 私服的用户名和密码, 在deploy项目时需要用到 -->
<server>
<id>releases</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
<!-- 在profiles标签下配置profile, 包括: 私服所配的仓库、各个插件的仓库地址 -->
<profile>
<!-- profile的id -->
<id>dev</id>
<repositories>
<repository>
<!-- 仓库id, Repositories可以配置多个仓库, 要确保id不重复 -->
<id>nexus</id>
<!-- 仓库地址, 即nexus仓库组的地址 -->
<url>http://ip:port/nexus/content/groups/public/</url>
<!-- 是否下载Releases构件 -->
<releases>
<enabled>true</enabled>
</releases>
<!-- 是否下载Snapshots构件 -->
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<!-- 插件仓库, Maven的运行依赖插件, 也需要从私服下载插件 -->
<pluginRepository>
<!-- 插件仓库的id不允许重复, 如果重复, 后配置的优先 -->
<id>public</id>
<name>Public Repositories</name>
<url>http://ip:port/nexus/content/groups/public/</url>
</pluginRepository>
</pluginRepositories>
</profile>
<!-- 还需指定联网仓库, 保证本私服中没有相关jar包或插件时可联网获取 -->
<profile>
<id>internet</id>
<repositories>
<repository>
<id>nexus-aliyun</id>
<name>Nexus aliyun</name>
<layout>default</layout>
<!-- 这里配置阿里云的仓库 -->
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
</profile>
2.在项目的pom.xml中的一级标签project下添加如下内容:
<!-- 发布选项: id必须与setting.xml文件中server的id相同 -->
<distributionManagement>
<repository>
<id>releases</id>
<name>display</name>
<url>http://ip:port/nexus/content/repositories/releases/</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<name>display</name>
<url>http://ip:port/nexus/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement>
3.使用IDEA发布项目
以IDEA为例, 选中项目, 右键 -> Run Maven -> deploy
或者在右边栏选中Maven栏目, 点击项目 -> Lifecycle -> deploy, 执行即可将项目发布到仓库中去
4.使用发布项目
/usr/local/maven/bin/mvn clean deploy -e -U
注意: 仓库中不能存在与当前项目名称+版本号相同的项目, 否则将导致出错: Bad Request: 400