简介
前言
- 本文主要介绍,使用Docker创建一个nexus私服,然后编写一个Library,上传到私服,然后使用demo工程依赖。
- 本文不对Maven、Nexus、私服等等相关名词以及为什么要用它们进行解释。
本文环境实施是在远程Linux主机上面跑Nexus,然后本地进行开发测试。具体如下
- 远程主机环境
- 系统:CentOs 7.X
- OpenJDK:1.8.0_151
- Maven 3.0.5
- Docker 1.12.6
- 本地环境
- 系统:MacOs 10.12.6
- OpenJDK 1.8.0_152
- Maven 3.5.2
- IntelliJ IDEA 2017.3.4
实例
安装Nexus
下载一个nexus3的镜像:
docker pull sonatype/nexus3
启动容器
docker run -d -p 8081:8081 --name nexus -v /root/nexus-data:/var/nexus-data --restart=always sonatype/nexus3
使用nexus3镜像创建并启动一个容器,指定暴露8081端口到对应主机的8081端口,将容器内部/var/nexus-data挂载到主机/root/nexus-data目录。
在浏览器输入:http://ip:8081(ip为远程主机的ip地址,有的网址是:http://ip:8081/nexus/)
点击右上方的Sign in进行登录
修改账号和密码
Nexus3的初始账号密码已经不是admin/admin123。
输入 admin admin123 直接报错:
查日志 发现的确登陆不成功:
2. 后来注意到在登陆时有提示信息 ,密码保存在 /nexus-data下的 admin.password 中。
3. 进入容器:docker exec -it 容器id /bin/bash
4.进入容器后,找到admin.password ,查看并复制密码。
注意密码只有这一部分:cb424ffc-fc4b-41c1-9cbf-d7ea26efd978,紧跟后面的 bash-4.2$ 不是密码内容。
我也不清楚这里为什么没有自动换行。此密码不是密文,直接登陆时输入就行。
5.退出容器命令:exit
6. 登陆,输入密码:
直接 next,提示重置密码:
我并没有去查这个可选项是什么,只是随手勾上了。再 next 。
点击完成 。
关闭浏览器,清缓存,使用新密码登陆成功:
OK 了 。如下图:
可以看到默认情况下Nexus
会帮我们创建了几个仓库,仔细观察红色框住的地方,里面有几种仓库的类型,解释如下:
- proxy 远程仓库的代理,比如说nexus配置了一个central repository的proxy,当用户向这个proxy请求一个artifact的时候,会现在本地查找,如果找不到,则会从远程仓库下载,然后返回给用户。
- hosted 宿主仓库,用户可以把自己的一些仓库deploy到这个仓库中
- group 仓库组,是nexus特有的概念,目的是将多个仓库整合,对用户暴露统一的地址,这样就不需要配置多个仓库地址。
下面我们仔细看一下里面的一些仓库。点击maven-central仓库:
可以看到是一个proxy类型的仓库,他代理的远程仓库地址是https://repo1.maven.org/maven2/。
后退,在进入maven-public查看:
可以看到这是一个group类型的仓库,里面包含了maven-releases/maven-snapshots/maven-central仓库,意思是我们只需要在本地添加这个仓库,则可以依赖到上述3个仓库中的库了。
准备工作
为了实现本地上传代码库,并且实现依赖的示例,这里创建一个新的仓库(也可以选用已经存在的仓库)和一个用户
- 创建仓库,点击Create repository,然后选择maven2(hosted)然后输入仓库名称(test-release)。在version policy中选择这个仓库的类型,这里选择release,在Deployment policy中选择Allow redeploy(这个很重要). 创建成功如下:
- 创建用户 点击左侧菜单栏的Users菜单,然后点击Create local user.我这里创建了一个用户,账号密码都是:wangjianfeng
上传到私库
修改settings.xml
本地.m2目录下的settings.xml
<?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> <servers> <server> <id>test</id> <username>wangjianfeng</username> <password>wangjianfeng</password> </server> </servers> </settings>
上面指定私库的账号密码。
pom.xml
使用IDEA创建一个Maven项目。
pom.xml
<?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> <groupId>com</groupId> <artifactId>test-lib</artifactId> <!--注意限定版本一定为RELEASE,因为上传的对应仓库的存储类型为RELEASE--> <version>1.0-RELEASE</version> <packaging>jar</packaging> <!--指定仓库地址--> <distributionManagement> <repository> <!--此名称要和.m2/settings.xml中设置的ID一致--> <id>test</id> <url>http://xxx.xxx.xxx.xxx:8081/repository/test-release/</url> </repository> <!-- <snapshotRepository> <id>test</id> <url>http://xxx.xxx.xxx.xxx:8081/repository/test-snapshot/</url> </snapshotRepository>--> </distributionManagement> <build> <plugins> <!--发布代码Jar插件。如果是SpringBoot项目,则不用写此插件,默认就有--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-deploy-plugin</artifactId> <version>2.7</version> </plugin> <!--发布源码插件--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>2.2.1</version> <executions> <execution> <id>attach-sources</id> <phase>package</phase> <goals> <goal>jar</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
代码
简单的代码:
public class TestUtil { public static void main(String[] args) { System.out.println("I am from test-lib!"); } }
部署
mvn deploy
如无意外,上传成功,回到Nexus的网页中查看结果。
可以看到已经上传成功。
测试依赖
本地再次创建一个项目,对这个项目进行依赖。
在pom.xml添加如下代码
<dependencies> <dependency> <groupId>com</groupId> <artifactId>test-lib</artifactId> <version>1.0-RELEASE</version> </dependency> </dependencies> <repositories> <repository> <id>test</id> <url>http://xxx.xxx.xxx.xxx:8081/repository/test-release/</url> </repository> </repositories>
然后发现依赖成功了
请先
!