Nexus搭建
一、前言
- 总结一下搭建的Nexus 3.0 过程,和遇到的各种坑
- 参考资料:官方帮助文档
二、搭建Nexus
2.1 环境
- 官方系统要求,大家一定要仔细看一下这篇文档,Nexus默认配置Java虚拟机内存较大,如果部署机器配置较低,可能会启动不了, 这是一个大坑。
系统环境 | 软件版本 |
---|---|
Centos | Nexus 3.20.1-01 |
2.2 下载、解压 Nexus
tar xzvf nexus-3.20.0-04-unix.tar.gz -C /usr/local/
2.3 Nexus的目录结构
nexus-3.20.0-04-unix.tar.gz # 主要目录
├── nexus-3.20.0-04
├──bin # nexus的启动命令,虚拟机配置文件
etc # nexus 配置文件,更改端口
└── sonatype-work
├── nexus3
├── admin.password # nexus 系统默认密码
├── log # nexus 系统日志文件
2.4 安装Nexus
- 在官方文档,大致意思我们在生产环境中搭建成系统服务,搭建系统服务的官方教程:https://help.sonatype.com/repomanager3/installation/run-as-a-service
2.4.1 创建nexus
用户
Nexus
不建议使用root
用户运行软件,所以我们首先是创建nexus
用户
useradd nexus
chown -R nexus:nexus /usr/local/nexus-3.20.0-04
chown -R nexus:nexus /usr/local/sonatype-work
2.4.2 修改Nexus
启动文件
- 编辑
nexus
文件,添加jdk
路径,在文件14的行的位置(费)
vim /usr/local/nexus-3.20.0-04/bin/nexus
INSTALL4J_JAVA_HOME_OVERRIDE=/usr/local/jdk1.8.0_221 # 14行的位置添加jdk路径
# 使用sed命令直接修改
sed -i '14s/$/\/usr\/local\/jdk1.8.0_221/g' /usr/local/nexus-3.20.0-04/bin/nexus && sed -i '14s/.*INS/INS/g' /usr/local/nexus-3.20.0-04/bin/nexus
- 编辑
nexus.rc
文件,修改用户为nexus
vim /usr/local/nexus-3.20.0-04/bin/nexus.rc
run_as_user="nexus"
2.4.3 配置Nexus
系统服务
- 官方提供了三种方式搭建系统服务,因为
centos7
已经使用systemctl
代替service
,所以我们使用systemd
模式启动 - 创建
nexus.service
文件vim /etc/systemd/system/nexus.service
,写入如下内容
[Unit]
Description=nexus service
After=network.target
[Service]
Type=forking
LimitNOFILE=65536
ExecStart=/usr/local/nexus-3.20.0-04/bin/nexus start
ExecStop=/usr/local/nexus-3.20.0-04/bin/nexus stop
User=nexus
Restart=on-abort
[Install]
WantedBy=multi-user.target
-
重新加载服务
systemctl daemon-reload
2.4.4 启动Nexus
服务
systemctl enable nexus.service # 开启开机自动启用
systemctl start nexus.service
- 打开浏览器输入
http://[ip]:8081/
,出现如下图所示页面表示启动成功
-
点击登录,提示我们到指定文件夹查询初始化密码
cat /usr/local/sonatype-work/nexus3/admin.password
472c8232-538f-49ca-97f4-8e008ca7bbaf
- 登录成功,我们nexus就部署完成了
三、Nexus
配置
3.1 仓库类型说明
3.1.1 Hosted Repository(托管仓库)
官方解释:A repository with the type hosted, also known as a hosted repository, is a repository that stores components in the repository manager as the authoritative location for these components.
大致含义:一个托管仓库,用于放置组件
系统默认的托管Maven
仓库:
- maven-releases 用于发布正式版本的仓库
- maven-snapshots 用于发布快照本的仓库
3.1.2 Proxy Repository(代理仓库)
官方解释:A repository with the type proxy, also known as a proxy repository, is a repository that is linked to a remote repository. Any request for a component is verified against the local content of the proxy repository. If no local component is found, the request is forwarded to the remote repository. The component is then retrieved and stored locally in the repository manager, which acts as a cache. Subsequent requests for the same component are then fulfilled from the local storage, therefore eliminating the network bandwidth and time overhead of retrieving the component from the remote repository again.
大致含义:代理仓库,是一个可以连接远端仓库,任何对于库的请求都会被在本地仓库进行验证,如果本地仓库不不能在,会转发改请求到远端仓库,将请求回来的库放置到本地管理,仓库作为一个缓冲,避免了多次远端服务请求
系统默认的代理Maven
仓库:
- maven-central
设置远端中央仓库,这里我们可以原有的仓库改成ali
的仓库地址http://maven.aliyun.com/nexus/content/groups/public或者着可以添加的新的proxy
代理仓库
自定义代理Maven
仓库:
- maven-ali
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V4yWl1Jz-1578296169971)(C:\Users\warren\AppData\Roaming\Typora\typora-user-images\image-20191227142630360.png)]
3.1.3 Repository Group(仓库组)
官方解释:A repository with the type group, also known as repository group, represents a powerful feature of Nexus Repository Manager. They allow you to combine multiple repositories and other repository groups in a single repository. This in turn means that your users can rely on a single URL for their configuration needs, while the administrators can add more repositories and therefore components to the repository group.
大致含义:仓库组是Nexus仓库管理的一个特性,允许你结合不同到仓库到一个简单仓库,然后一个url来满足访问不同的仓库的需求,同样可以在里面添加库
3.2 是否允许匿名访问
3.2.1 匿名访问
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gV9DOU8O-1578296169972)(C:\Users\warren\AppData\Roaming\Typora\typora-user-images\image-20191227145236228.png)]
3.2.2 非匿名访问
-
项目
pom.xml
加入仓库配置,我们也可以在maven
<repositories> <repository> <id>nexus</id> <name>nexus Releases</name> <url>http://10.18.0.200:8081/repository/maven-public/</url> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>nexus</id> <name>nexus Releases</name> <url>http://10.18.0.200:8081/repository/maven-public/</url> </pluginRepository> </pluginRepositories>
-
在本地
maven
中conf/settings.xml
添加server
节点
<server>
<!--必须与repository的id一直-->
<id>nexus</id>
<username>my_login</username>
<password>my_password</password>
</servce>
4.2 发布jar
到Nexus
上
- 在
pom.xml
添加如下节点
<distributionManagement><!-- mvn site:deploy 部署的位置 -->
<site>
<id>local</id>
<name>filesystem</name>
<url>file:${project.basedir}/site</url>
</site>
<repository>
<id>releases</id><!--正式版本的地址-->
<name>Internal Releases</name>
<url>http://10.18.0.220:8081/repository/kcwl-release/</url>
</repository>
<snapshotRepository>
<id>snapshots</id><!--快照版本-->
<name>Internal Releases</name>
<url>http://10.18.0.220:8081/repository/kcwl-snapshot/</url>
</snapshotRepository>
</distributionManagement>
-
使用
maven deploy
命令,打包发布版本,如果需要其他组的成员使用的时候,可以看到源码和注释,可以添加源码插件<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>3.0.1</version> <executions> <execution> <id>attach-sources</id> <goals> <goal>jar</goal> </goals> </execution> </executions> </plugin>
四、安装Nexus
遇到的问题
4.1 Nexus
服务启动失败
-
Nexus
需要的官方配置非常高,建议都是CPU
4+,内存8G
起,参见系统配置说明的文档:https://help.sonatype.com/repomanager3/system-requirements,这里有一个大坑是当你配置服务使用的nexus start
命令,如果是因为你的内存不够启动不了系统,这里不会出现任何错误的提示,只会显示服务没有启动成功,也不会写入日志 -
我们在刚开始启动
Nexus
的时候,可以先使用Nexus run
在前台运行服务,如果启动失败,这里会在控制台打出相应的错误信息,比如提示你内存不足Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x0000000717000000, 945094656, 0) failed; error='Cannot allocate memory' (errno=12)
-
Nexus
建议部署到配置较高的电脑上,但如果你的服务器是在没有空余的高配置的服务器,我们可以修改/usr/local/nexus-3.20.0-04/bin/nexus.vmoptions
,调低相应的JVM
参数-Xms2703m # 默认jvm最小内存,我们可以调整成256m -Xmx2703m # 默认jvm最大内存,我们可以调整成256m -XX:MaxDirectMemorySize=2703m # 同样需要调小 -XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=../sonatype-work/nexus3/log/jvm.log -XX:-OmitStackTraceInFastThrow -Djava.net.preferIPv4Stack=true -Dkaraf.home=. -Dkaraf.base=. -Dkaraf.etc=etc/karaf -Djava.util.logging.config.file=etc/karaf/java.util.logging.properties -Dkaraf.data=../sonatype-work/nexus3 -Dkaraf.log=../sonatype-work/nexus3/log -Djava.io.tmpdir=../sonatype-work/nexus3/tmp -Dkaraf.startLocalConsole=false # # additional vmoptions needed for Java9+ # # --add-reads=java.xml=java.logging # --add-exports=java.base/org.apache.karaf.specs.locator=java.xml,ALL-UNNAMED # --patch-module=java.base=lib/endorsed/org.apache.karaf.specs.locator-4.2.6.jar # --patch-module=java.xml=lib/endorsed/org.apache.karaf.specs.java.xml-4.2.6.jar # --add-opens=java.base/java.security=ALL-UNNAMED # --add-opens=java.base/java.net=ALL-UNNAMED # --add-opens=java.base/java.lang=ALL-UNNAMED # --add-opens=java.base/java.util=ALL-UNNAMED # --add-opens=java.naming/javax.naming.spi=ALL-UNNAMED # --add-opens=java.rmi/sun.rmi.transport.tcp=ALL-UNNAMED # --add-exports=java.base/sun.net.www.protocol.http=ALL-UNNAMED # --add-exports=java.base/sun.net.www.protocol.https=ALL-UNNAMED # --add-exports=java.base/sun.net.www.protocol.jar=ALL-UNNAMED # --add-exports=jdk.xml.dom/org.w3c.dom.html=ALL-UNNAMED # --add-exports=jdk.naming.rmi/com.sun.jndi.url.rmi=ALL-UNNAMED # # comment out this vmoption when using Java9+ # -Djava.endorsed.dirs=lib/endorsed
4.2 在pom.xml
或者setting.xml
中配置nexus
仓库地址无效
<mirrors>
<mirror>
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<name>Nexus osc</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
-
如果之前我们在
setting.xml
中阿里云的maven
镜像,并设置mirrorOf
为*
,这时候不管配置什么仓库,所有请求都会被映射到ali
的私服地址上 -
mirrorOf
的标签应该与repository
的id
值想匹配,但是mirrorOf
是支持正则表达式的,可以动态映射镜像地址,官网举例:* = everything external:* = everything not on the localhost and not file based. repo,repo1 = repo or repo1 *,!repo1 = everything except repo1