查看官方镜像说明
建议使用nexus2,可能网上的资料这个版本居多。
我选择的是nexus3,~~~
启动容器
官方说明中提到的是使用docker直接启动。我选择用docker-compose启动。
docker-compose.yml文件如下:
- mkdir -p /opt/nexus
- cd /opt/nexus
- vim docker-compose.yml
version: '2'
services:
nexus3:
image: sonatype/nexus3
container_name: nexus3
volumes:
- './nexus-data:/nexus-data:rw'
ports:
- '8081:8081'
- docker-compose up -d
- docker-compose ps #查看容器启动状态
使用supervisor管理容器进程
- vim /etc/supervisor/conf.d/nexus.conf
[program:nexus]
directory = /opt/nexus ; 程序的启动目录
command=docker-compose up ; 启动命令,可以看出与手动在命令行启动的命令是一样的
autostart = true ; 在 supervisord 启动的时候也自动启动
startsecs = 30 ; 启动 5 秒后没有异常退出,就当作已经正常启动了
autorestart = true ; 程序异常退出后自动重启
startretries = 3 ; 启动失败自动重试次数,默认是 3
user = root ; 用哪个用户启动
redirect_stderr = true ; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 20MB ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 20 ; stdout 日志文件备份数
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile = /var/log/nexus.log
- supervisorctl update #更新配置,就会启动新增的程序nexus
- supervisorctl status nexus
- cd /opt/nexus
- docker-compose ps
访问nexus3的portal
http://0.0.0.0:18081 帐号:admin
密码:admin123
默认已经有四个maven相关的仓库,分别是maven-central,maven-releases,maven-snapshots,maven-public。其中的类型的定义如下:
- proxy是远程仓库的代理。比如说在nexus中配置了一个central repository的proxy,当用户向这个proxy请求一个artifact,这个proxy就会先在本地查找,如果找不到的话,就会从远程仓库 下载,然后返回给用户,相当于起到一个中转的作用。
- hosted是宿主仓库,用户可以把自己的一些构件,deploy到hosted中,也可以手工上传构件到hosted里。比如说oracle的驱动程序,ojdbc6.jar,在central repository是获取不到的,就需要手工上传到hosted里。
- group是仓库组,在maven里没有这个概念,是nexus特有的。目的是将上述多个仓库聚合,对用户暴露统一的地址,这样用户就不需要在pom中配置多个地址,只要统一配置group的地址就可以了。
如何发布自己的构件到私有仓库中?
- 在~/.m2/settings中增加server节点,根据需要可以添加多个server
<servers>
<server>
<id>nexus-ielong</id>
<username>admin</username>
<password>admin123</password>
</server>
</servers>
- 在项目的pom.xml/build/中配置中配置maven-deploy-plugin
<!--发布到私有仓库依赖的插件-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.1</version>
<executions>
<execution>
<id>default-deploy</id>
<phase>deploy</phase>
<goals>
<goal>deploy</goal>
</goals>
</execution>
</executions>
<configuration>
<skip>false</skip>
</configuration>
</plugin>
温馨提示:如果在多模块项目中,可以将不需要发布的项目配置为skip=true。比如在parent的pom.xml中增加以下内容后,所有模块都会跳过发布。
<build>
<plugins>
<!--发布到私有仓库依赖的插件-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
- 在项目的pom.xml中配置distributionManagement
<!--发布到私有仓库的配置-->
<distributionManagement>
<repository>
<id>nexus-ielong</id>
<name>nexus-ielong-releases</name>
<url>http://0.0.0.0:18081/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>nexus-ielong</id>
<name>nexus-ielong-snapshots</name>
<url>http://0.0.0.0:18081/repository/maven-snapshots/</url>
<uniqueVersion>false</uniqueVersion>
<layout>legacy</layout>
</snapshotRepository>
</distributionManagement>
其中repository.id指~/.m2/settings.xml中配置的server.id, 这两个是同一个概念,值要一致。
- 运行pom.xml所在目录 运行发布命令
mvn clean deploy -Dmaven.test.skip=true
如何指定使用私有仓库下载maven构件?
有两种方式,建议使用第二种方式:
- 第一种方式:在需要引用构件的项目中添加repository配置
<!--在项目中指定使用私有仓库或者在~/.m2/settings.xml配置全局的mirror-->
<repositories>
<repository>
<id>nexus-ielong</id>
<name>ielong Nexus Repository</name>
<url>http://0.0.0.0:18081/repository/maven-public/</url>
</repository>
</repositories>
- 第二种方式: 在~/.m2/settings中指定mirror
<mirrors>
<!--不再使用aliyun的镜像-->
<!--<mirror>
<id>nexus-aliyun</id>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
<mirrorOf>central</mirrorOf>
</mirror>-->
<!--使用自己的私有镜像-->
<mirror>
<id>nexus-ielong</id>
<name>nexus public group</name>
<url>http://0.0.0.0:18081/repository/maven-public/</url>
<mirrorof>*</mirrorof>
</mirror>
</mirrors>