今天做Java開發的同學應該都用過Maven,知道Maven中有倉庫這個角色的存在,比如Maven官方中央倉庫(http://repo1.maven.org/maven2)、國內阿里雲中央倉庫(http://maven.aliyun.com/nexus/content/groups/public),日常開發也經常從這些國內外的中央倉庫中下載jar包(國外的倉庫由於網絡原因一般都非常慢,所以國內的一些公司提供了國際庫的鏡像倉庫)。有些公司也會搭一個自己公司的私有倉庫,一來可以統一管理全公司的jar包獲取與下發,二來也方便自己公司開發的jar包的內部分發。今天就來講一下Maven倉庫管理器服務的搭建!Maven倉庫管理器有很多,接下來要講的就是這眾多倉庫管理器中的獨秀——Nexus Repository Manager。如果你認真看過剛剛阿里雲中央倉庫的地址,你會發現其中也有一個nexus!沒有錯,阿里雲中央倉庫就是使用Nexus搭建的(新地址:https://maven.aliyun.com/repository/public)!
Nexus是Sonatype公司的一個產品,我們試着去打開它的官網首頁發現很難打開的,但是它的官方幫助文檔首頁卻能打開,里面有Nexus的產品幫助文檔和與下載鏈接:
通讀一遍官方幫助文檔后,我們得到以下重要信息:
- 部署Nexus的服務器至少要有4個CPU(一個四核的CPU也可以)和至少8G的物理內存;
- 如果是Unix/Linux版本的Nexus包是不含JDK的,需要自行安裝並配置好相應版本的JDK;
- Nexus在Unix/Linux上表現最佳;
- 在Unix/Linux上為了安全起見,不要使用root賬號運行Nexus服務;
官方都建議將Nexus部署在Unix/Linux上,那我們就來在Linux上部署一下!
第一步:新建並配置好一台4核、8G內存和60G硬盤的CentOS8.1虛擬機(CentOS8.1的基本安裝和配置);
第二步:安裝JDK,可以使用包管理工具安裝(例如yum包管理器),也可以使用二進制包手工安裝:
- 通過yum包管理器安裝JDK
可以先通過 # yum list java* 命令查看一下系統yum源識別到的JDK有哪些:
# yum list java* Last metadata expiration check: 0:59:24 ago on Mon 08 Jun 2020 09:44:52 PM CST. Available Packages java-1.8.0-openjdk.x86_64 1:1.8.0.252.b09-2.el8_1 AppStream java-1.8.0-openjdk-accessibility.x86_64 1:1.8.0.252.b09-2.el8_1 AppStream java-1.8.0-openjdk-demo.x86_64 1:1.8.0.252.b09-2.el8_1 AppStream java-1.8.0-openjdk-devel.x86_64 1:1.8.0.252.b09-2.el8_1 AppStream java-1.8.0-openjdk-headless.x86_64 1:1.8.0.252.b09-2.el8_1 AppStream java-1.8.0-openjdk-javadoc.noarch 1:1.8.0.252.b09-2.el8_1 AppStream java-1.8.0-openjdk-javadoc-zip.noarch 1:1.8.0.252.b09-2.el8_1 AppStream java-1.8.0-openjdk-src.x86_64 1:1.8.0.252.b09-2.el8_1 AppStream java-11-openjdk.x86_64 1:11.0.7.10-1.el8_1 AppStream java-11-openjdk-demo.x86_64 1:11.0.7.10-1.el8_1 AppStream java-11-openjdk-devel.x86_64 1:11.0.7.10-1.el8_1 AppStream java-11-openjdk-headless.x86_64 1:11.0.7.10-1.el8_1 AppStream java-11-openjdk-javadoc.x86_64 1:11.0.7.10-1.el8_1 AppStream java-11-openjdk-javadoc-zip.x86_64 1:11.0.7.10-1.el8_1 AppStream java-11-openjdk-jmods.x86_64 1:11.0.7.10-1.el8_1 AppStream java-11-openjdk-src.x86_64 1:11.0.7.10-1.el8_1 AppStream java-atk-wrapper.x86_64 0.33.2-6.el8 AppStream javapackages-filesystem.noarch 5.3.0-1.module_el8.0.0+11+5b8c10bd AppStream javapackages-tools.noarch 5.3.0-1.module_el8.0.0+11+5b8c10bd AppStream
發現都是openjdk系列的版本,因為openjdk開源免費,而Oracle JDK在jdk-8u201之后的版本就開始收費了~
如果確認使用openjdk的話(其實功能上與Oracle JDK相應的版本沒啥區別),只要使用命令# yum -y install XXX 安裝相應的版本就可以了:
# yum -y install java-1.8.0-openjdk.x86_64
由yum包管理工具會將JDK直接安裝到 /usr/lib/jvm 目錄下,並在/usr/bin目錄中創建java可執行程序的軟鏈接, 而/usr/bin目錄是操作系統PATH變量中預設的值,所以裝完之后就不需要再做環境變量配置就能使用了!
裝完即可通過 # java -version查看一下是否安裝成功:
# java -version openjdk version "1.8.0_252" OpenJDK Runtime Environment (build 1.8.0_252-b09) OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)
可以看到,已經裝好了!yum包管理工具安裝JDK簡單方便,但它是需要服務器能聯網來下載JDK包的,如果服務器不能聯網,那就得用事先下載好的離線二進制JDK包進行手工安裝了!
一會我們再演示一下手工通過離線二進制包來安裝JDK的方法,先將前面yum包管理工具安裝的JDK卸載(參數最后的*號是匹配所有的):
# yum -y remove java-1.8.0-openjdk*
同樣,卸載完后你也可以 # java -version查看一下是否真的卸載完成了:
# java -version -bash: /usr/bin/java: No such file or directory
- 手工通過離線二進制包來安裝JDK
這次我們使用Oracle最后一個免費版的JDK(jdk-8u201)來做安裝演示,先在服務器的 /usr/local 目錄下創java目錄:
# mkdir /usr/local/java
然后上傳下載好的JDK包(jdk-8u201-linux-x64.tar.gz)到服務器的 /usr/local/java目錄下,並使用 tar 命令解壓:
# tar -vxf /usr/local/java/jdk-8u201-linux-x64.tar.gz -C /usr/local/java
解壓完后,用vi或vim打開 /etc/profile 文件配置系統環境變量,在文件的最后新加三行:
export JAVA_HOME=/usr/local/java/jdk1.8.0_201 export CLASSPATH=$:CLASSPATH:$JAVA_HOME/lib/ export PATH=$PATH:$JAVA_HOME/bin
保存並退 /etc/profile 文件,接着使用 source 命令使配置生效:
# source /etc/profile
最后,同樣可通過 # java -version查看一下是否安裝完成:
# java -version java version "1.8.0_201" Java(TM) SE Runtime Environment (build 1.8.0_201-b09) Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)
第三步:將下載好的Linux版本的Nexus安裝包(latest-unix.tar.gz)上傳到服務器的 /opt 目錄下(Linux服務器文件上傳與下載、Linux系統目錄說明);
第四步:使用 tar 命令解壓 latest-unix.tar.gz ,得到 nexus-3.23.0-03和sonatype-work兩個目錄,前者為Nexus軟件本身,后者為Nexus工作目錄:
# tar -vxf /opt/latest-unix.tar.gz
第五步:新建nexus用戶組和nexus用戶,並授以其第四步中解壓出來的Nexus相關目錄的權限:
# groupadd nexus # useradd nexus -d /home/nexus -s /bin/sh -g nexus # chown -R nexus:nexus /opt/nexus-3.23.0-03 # chmod -R 750 /opt/nexus-3.23.0-03/ # chown -R nexus:nexus /opt/sonatype-work/ # chmod -R 750 /opt/sonatype-work/
第六步:配置Nexus以新建的nexus用戶來運行服務(否則將以root賬號運行),編輯Nexus的解壓安裝目錄下的 bin/nexus.rc 運行配置文件,指明運行Nexus服務的用戶:
# vim /opt/nexus-3.23.0-03/bin/nexus.rc run_as_user="nexus"
第七步:配置Nexus使用的JDK或JRE路徑,該配置項的參數名為 INSTALL4J_JAVA_HOME_OVERRIDE ,它就在Nexus的可執行文件bin/nexus中 ,該文件非常大,不方便直接用vi或vim編輯目標參數項,所以先用grep命令篩選一下
# grep -i "INSTALL4J_JAVA_HOME_OVERRIDE" /opt/nexus-3.23.0-03/bin/nexus # INSTALL4J_JAVA_HOME_OVERRIDE= test_jvm "$INSTALL4J_JAVA_HOME_OVERRIDE"
從結果中可以看出就是被注釋掉的那行 # INSTALL4J_JAVA_HOME_OVERRIDE= ,我們將其替換成去掉注釋並帶上參數值便可,但替換前我們得先備份一下(養成高風險操作前備份的習慣):
# cp /opt/nexus-3.23.0-03/bin/nexus /opt/nexus-3.23.0-03/bin/nexus.bak
確認備份好后,接着用sed命令以替換字符串的方式改變配置(sed參數字符串表達式里的分隔符有多種,比如%、#,要視情況用),並重新過濾INSTALL4J_JAVA_HOME_OVERRIDE參數相關內容,發現已經替換好了:
# sed -i "s%# INSTALL4J_JAVA_HOME_OVERRIDE=%INSTALL4J_JAVA_HOME_OVERRIDE=/usr/local/java/jdk1.8.0_201%g" /opt/nexus-3.23.0-03/bin/nexus
# grep -i "INSTALL4J_JAVA_HOME_OVERRIDE" /opt/nexus-3.23.0-03/bin/nexus INSTALL4J_JAVA_HOME_OVERRIDE=/usr/local/java/jdk1.8.0_201 test_jvm "$INSTALL4J_JAVA_HOME_OVERRIDE"
第八步:將Nexus服務配置為操作系統systemd類的服務:
使用命令 # vim /etc/systemd/system/nexus.service 創建Nexus服務單元配置文件,並填入以下配置信息,注意ExecStart和ExecStop的值是你自己的nexus可執行程序路徑:
[Unit] Description=nexus service After=network.target [Service] Type=forking LimitNOFILE=65536 ExecStart=/opt/nexus-3.23.0-03/bin/nexus start ExecStop=/opt/nexus-3.23.0-03/bin/nexus stop User=nexus Restart=on-abort TimeoutSec=600 [Install] WantedBy=multi-user.target
第九步:重新載入 systemctl 控制器並啟用nexus.service服務單元,最后嘗試啟動nexus.service服務(注意Nexus服務啟動很花時間,要多等等):
# systemctl daemon-reload # systemctl enable nexus.service # systemctl start nexus.service
如果發現啟動命令瞬間完成,也沒有任何輸出,可以到 /opt/sonatype-work/nexus3/log/ 目錄看看是否有nexus.log日志文件生成,如果沒有,那么可能是Nexus服務的PID文件無法寫入的原因,Nexus服務的PID文件生成在系統的 /tmp 目錄中,文件名的格式是下面的形式:
文件名前綴:"i4jdaemon_"
文件名后綴:是nexus可執行程序完整路徑將斜杠替換為下划線形成的字符串,例如:opt_nexus_nexus-3.14.0-04_bin_nexus
最后形成的Nexus服務的PID文件名可能是這形式的 i4jdaemon__opt_nexus-3.23.0-03_bin_nexus
將該文件刪除,再使用命令 # systemctl start nexus.service 重新嘗試啟動!
再次查看 /opt/sonatype-work/nexus3/log/ 中是否有nexus.log日志文件生成,如果有,那么查看下該文件的末尾(注意Nexus服務啟動很花時間,要多等等):
# tail -f /opt/sonatype-work/nexus3/log/nexus.log
-------------------------------------------------
Started Sonatype Nexus OSS 3.23.0-03
-------------------------------------------------
如果能看到 “Started Sonatype Nexus OSS”字樣(日常啟動時也可能看到“state change RUNNING -> WAITING (OK)”),則表示Nexus服務啟動成功了!默認的訪問端口是8081!不要忘了將你使用的端口在防火牆中開放:
# firewall-cmd --add-port=8081/tcp --permanent success # firewall-cmd --reload
現在可以從外部宿主機訪問一下我們的Nexus倉庫管理器了:
首次訪問會在登錄框上面提示我們admin用戶的密碼保存的位置,該密碼是系統生成的初始密碼,后面用其登錄后會立即要求修改密碼,我們打開密碼保存文件看看:
# cat /opt/sonatype-work/nexus3/admin.password 0901b086-a97f-4039-bc6d-0d6d561e7895
使用該密碼登錄,按着向導修改初始密碼就可以了!
Nexus服務的默認訪問端口由數據目錄下的nexus屬性配置文件($data-dir/etc/nexus.properties)的 application-port 配置項配置,而數據目錄又由Nexus服務的JVM配置文件($install-dir/bin/nexus.vmoptions)中的-Dkaraf.data參數指定:
# ls /opt/nexus-3.23.0-03/bin/ contrib nexus nexus.bak nexus.rc nexus.vmoptions # cat /opt/nexus-3.23.0-03/bin/nexus.vmoptions -Xms2703m -Xmx2703m -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
# ls /opt/sonatype-work/nexus3/etc/ logback nexus.properties # cat /opt/sonatype-work/nexus3/etc/nexus.properties # Jetty section # application-port=8081 # application-host=0.0.0.0 # nexus-args=${jetty.etc}/jetty.xml,${jetty.etc}/jetty-http.xml,${jetty.etc}/jetty-requestlog.xml # nexus-context-path=/ # Nexus section # nexus-edition=nexus-pro-edition # nexus-features=\ # nexus-pro-feature # nexus.hazelcast.discovery.isEnabled=true
$install-dir/bin/nexus.vmoptions配置文件和$data-dir/etc/nexus.properties配置文件是Nexus服務的主要配置文件,是調節Nexus服務功能和性能的地方,各參數的配置方式和作用請自行參考官方文檔。