array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 CentOS8.1中搭建Nexus3服务器 - 爱码网

  今天做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的产品帮助文档和与下载链接:

CentOS8.1中搭建Nexus3服务器

CentOS8.1中搭建Nexus3服务器

  通读一遍官方帮助文档后,我们得到以下重要信息:

  1. 部署Nexus的服务器至少要有4个CPU(一个四核的CPU也可以)和至少8G的物理内存;
  2. 如果是Unix/Linux版本的Nexus包是不含JDK的,需要自行安装并配置好相应版本的JDK;
  3. Nexus在Unix/Linux上表现最佳;
  4. 在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 

CentOS8.1中搭建Nexus3服务器

  第五步:新建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仓库管理器了:

CentOS8.1中搭建Nexus3服务器

  首次访问会在登录框上面提示我们admin用户的密码保存的位置,该密码是系统生成的初始密码,后面用其登录后会立即要求修改密码,我们打开密码保存文件看看:

# cat /opt/sonatype-work/nexus3/admin.password 
0901b086-a97f-4039-bc6d-0d6d561e7895

  使用该密码登录,按着向导修改初始密码就可以了!

CentOS8.1中搭建Nexus3服务器

  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服务功能和性能的地方,各参数的配置方式和作用请自行参考官方文档。

相关文章: