centos8搭建maven私服
简介
maven
Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具,它包含了一个项目对象模型 (Project Object Model)、一组标准集合、一个项目生命周期(Project Lifecycle)、一个依赖管理系统(Dependency Management System)和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。当你使用Maven的时候,你用一个明确定义的项目对象模型来描述你的项目,然后Maven可以应用横切的逻辑,这些逻辑来自一组共享的(或者自定义的)插件。
Maven是优秀的依赖管理工具,能轻松地解决繁杂的Java类库的依赖关系。Maven是标准化的构建流程,暴露了一组一致、简洁的操作接口,能帮助团队成员从原来的高度自定义的、复杂的构建系统中解脱出来,使用maven现有的成熟的、稳定的组件也能简化构建系统的复杂度。
Maven是项目信息管理工具,能有效管理原本分散在项目中各个角落的项目信息,包括项目描述、开发者列表、版本控制系统地址等,另外还能通过Maven自动生成项目站点、项目文档、测试报告等非常具有价值的项目信息。
maven私服
私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的用户使用。当Maven需要下载构件的时候,它从私服请求,如果私服上不存在该构件,则从外部远程仓库下载,缓存在私服上之后,再为Maven的下载请求提供服务。
私服的好处:
- 节省自己的外网带宽
- 加速Maven构建
- 部署自己内部的第三方构件
- 提高稳定性,增强控制
- 降低中央仓库的负荷
- 控制和审计
- 建立本地内部公用仓库
仓库简介
如上图所示:
对于Maven来说,仓库只分为两类:本地仓库和远程仓库。
当Maven根据坐标寻找构件的时候,它首先会查看本地仓库,如果 本地仓库存在此构件,则直接使用;如果本地仓库不存在此构件,Maven就会去远程仓库查找,发现需要的构件,下载到本地仓库再使用。如果本地仓库和远程仓库都没有,Maven就会报错。 私服仓库的工作流程如图:
Nexus仓库类型介绍
- hosted,本地仓库,通常我们会部署自己的构件到这一类型的仓库。比如公司的第二方库。
- proxy,代理仓库,它们被用来代理远程的公共仓库,如maven中央仓库。
- group,仓库组,用来合并多个hosted/proxy仓库,当你的项目希望在多个repository使用资源时就不需要多次引用了,只需要引用一个group即可。
Nexus预定义了3个本地仓库,分别是Releases、Snapshots和3rd Party。 分别讲一下这三个预置的仓库都是做什么用的:
- Releases:这里存放我们自己项目中发布的构建,通常是Release版本的,比如我们自己做了一个FTP Server的项目,生成的构件为ftpserver.war,我们就可以把这个构建发布到Nexus的Releases本地仓库。
- Snapshots:这个仓库非常的有用,它的目的是让我们可以发布那些非release版本,非稳定版本,比如我们在trunk下开发一个项目,在正式release之前你可能需要临时发布一个版本给你的同伴使用,因为你的同伴正在依赖你的模块开发,那么这个时候我们就可以发布Snapshot版本到这个仓库,你的同伴就可以通过简单的命令来获取和使用这个临时版本。
- 3rd Party:顾名思义,第三方库,你可能会问不是有中央仓库来管理第三方库吗,没错,这里的是指可以让你添加自己的第三方库,比如有些构件在中央仓库是不存在的,比如你在中央仓库找不到Oracle的JDBC驱动,这个时候我们就需要自己添加到3rdparty仓库。
私服搭建
这里简单说明 Linux 下的安装方式,如果下载的是最新版本,它对系统内存和 jdk 版本是有要求的,要求内存大于4G,jdk 最低是1.8版本。
环境
jdk:1.8.0_271
maven:Apache Maven 3.6.3
本机是安装好了jdk和maven的,如果是未安装可以参考centos8使用war包安装部署jenkins以及初始化配置 这篇文章,这个里面有详细的安装配置过程。
安装nexus
创建目录
[root@dxm28 ~]# mkdir -p /data/nexus
[root@dxm28 ~]# cd /data/nexus/
下载
从sonatype上下载特别慢,所以我把下载好的包放在了百度网盘,分享一下,有需要的可以自取。
链接: https://pan.baidu.com/s/1NZPuzDQefsCa-zwc2wHKHA
密码: 5n2t
latest-unix.tar.gz就是nexus-3.28.1-01-unix.tar.gz。
[root@dxm28 nexus]# wget https://download.sonatype.com/nexus/3/latest-unix.tar.gz
[root@dxm28 nexus]# ll -h
拷贝压缩文件至/usr/local目录下
[root@dxm28 nexus]# cp latest-unix.tar.gz /usr/local/
解压
[root@dxm28 nexus]# cd /usr/local/
[root@dxm28 local]# tar -zxvf latest-unix.tar.gz
创建用户
# 创建nexus用户
[root@dxm28 ~]# useradd nexus
修改属组和属主
[root@dxm28 local]# chown -R nexus.nexus nexus-3.28.1-01 sonatype-work
[root@dxm28 local]# ll -h
配置环境变量
[root@dxm28 ~]# vim /etc/profile
增加以下内容:
export NEXUS_HOME=/usr/local/nexus-3.28.1-01
export PATH=$PATH:$NEXUS_HOME/bin
使得配置生效:
[root@dxm28 ~]# source /etc/profile
启动
[root@dxm28 ~]# nexus start
[root@dxm28 ~]# nexus start
WARNING: ************************************************************
WARNING: Detected execution as "root" user. This is NOT recommended!
WARNING: ************************************************************
Starting nexus
启动失败,原因是不建议使用root用户执行此命令。
解决办法1:创建新的用户来执行此命令。(上面已经创建好了)
解决办法2:修改启动脚本中run_as_root=true的true改为false。
如图,将true改为false即可。
使用**./nexus start这种后台启动方式看不到实时日志**;用**./nexus run是实时启动可以看到日志,但是此启动方式不能退出回命令模式**。
./nexus status #查看启动状态,./nexus stop #停止,./nexus restart重启。
# 前台启动:
nexus console
# 以后台进程启动:
nexus start
查看输出的日志:tail -f logs/wrapper.log。
我们切换用户nexus,再启动使用nexus run,看是否有错误。
[root@dxm28 local]# su nexus
[nexus@dxm28 local]$ nexus run
看到Started Sonatype Nexus OSS 3.28.1-01说明已经启动成功。
Ctrl+C停止这个进程,然后我们再使用nexus start命令启动。
查看一下进程:
[nexus@dxm28 local]$ ps aux | grep java | grep nexus
启动成功。再看一下端口监听情况:
[nexus@dxm28 local]$ netstat -ntlp | grep 8081
查看状态:
[nexus@dxm28 local]$ nexus status
验证
浏览器访问http://IP+端口,我们这里是http://192.168.0.28:8081,出现如下界面即可。
点击sign in,看到弹出框有如下提示信息:Your admin user password is located in
/usr/local/sonatype-work/nexus3/admin.password on the server.,我们可以在服务器执行一下查看密码的命令
[nexus@dxm28 local]$ cat /usr/local/sonatype-work/nexus3/admin.password
这个就是我们的密码。admin就是我们的用户名,我们输入账号密码登录试试。
登录成功之后,我们重置一下密码。
Repositories介绍
仓库分类前面我们已经介绍过了,所以这里不难看出:
maven-central:maven中央库,默认从https://repo1.maven.org/maven2/拉取jar
maven-releases:私库发行版jar,公司或团队内部的包,正式版。
maven-snapshots:私库快照(调试版本)jar,公司或团队内部的包,开发测试版。
maven-public:仓库分组,把上面三个仓库组合在一起对外提供服务,在本地maven基础配置settings.xml中使用。它的目的就是把多个仓库组合起来,然后我们项目中只需要配置上这个类型的仓库地址,就可以把它里面组合的几个仓库都关联上。
私服配置
下面的配置都是在maven配置文件下面settings.xml 里面进行的配置。
指定本地仓库
<!--存放本地仓库的地方-->
<localRepository>/data/maven/repository</localRepository>
配置私服镜像地址
在settings.xml 文件的 mirrors 内添加以下镜像地址:
<mirror>
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<url>http://localhost:8081/repository/maven-public/</url>
</mirror>
配置阿里镜像地址
在settings.xml 文件的 mirrors 内添加以下镜像地址:
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
配置认证信息
Nexus的仓库对于匿名用户是只读的,为了能够部署构件,还需要在setting.xml中的servers配置认证信息。
<server>
<id>nexus_release</id>
<username>admin</username>
<password>admin123</password>
<filePermissions>664</filePermissions>
<directoryPermissions>775</directoryPermissions>
<configuration></configuration>
</server>
<server>
<id>nexus_snapshots</id>
<username>admin</username>
<password>admin123</password>
<filePermissions>664</filePermissions>
<directoryPermissions>775</directoryPermissions>
<configuration></configuration>
</server>
<server>
<id>central-proxy</id>
<username>admin</username>
<password>admin123</password>
<filePermissions>664</filePermissions>
<directoryPermissions>775</directoryPermissions>
<configuration></configuration>
</server>
配置profile
在profiles内添加以下Profile 配置:
<profile>
<id>nexus</id><!--和activeProfile 值一致 -->
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<repositories>
<repository>
<id>central</id>
<url>http://localhost:8081/repository/maven-central/</url>
<releases>
<enabled>true</enabled>
<updatePolicy>never</updatePolicy>
<checksumPolicy>warn</checksumPolicy>
</releases>
<snapshots>
<!--true或者false表示该仓库是否为下载某种类型构件(发布版,快照版)开启。 -->
<enabled>true</enabled>
<!--该元素指定更新发生的频率。Maven会比较本地POM和远程POM的时间戳。这里的选项是:always(一直),daily(默认,每日),interval:X(这里X是以分钟为单位的时间间隔),或者never(从不)。 -->
<updatePolicy>never</updatePolicy>
<!--当Maven验证构件校验文件失败时该怎么做-ignore(忽略),fail(失败),或者warn(警告)。 -->
<checksumPolicy>warn</checksumPolicy>
</snapshots>
<!--用于定位和排序构件的仓库布局类型-可以是default(默认)或者legacy(遗留)。Maven 2为其仓库提供了一个默认的布局;然而,Maven 1.x有一种不同的布局。我们可以使用该元素指定布局是default(默认)还是legacy(遗留)。 -->
<layout>default</layout>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>central</id>
<url>http://localhost:8081/repository/maven-central/</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
配置activeProfile
在activeProfiles内添加以下activeProfile配置:
<!--激活上面配置的仓库信息-->
<activeProfiles>
<activeProfile>nexus</activeProfile>
</activeProfiles>
添加阿里云仓库
添加阿里云仓库就是为了在私服找不到依赖包时能去阿里云找,找到后返回给依赖方并缓存到私服。
我们先Create repository。
选择maven2 proxy
我们只要改图中两个地方即可,一个是资源名字,一个是远程仓库地址,这里我们输入http://maven.aliyun.com/nexus/content/groups/public/作为yu远程仓库地址。然后点击Create repository。
接下来我们把这个仓库加入到maven-pubilc中,也就是我们配置的私服仓库地址。
然后我们给它移到右边Members中并且排在第一位。
点击保存。这样就配置好了,如果资源在私服找不到就会到阿里云找。
在项目中的使用
获取依赖包
如果是普通项目成员,不需要向私服发布包的,只需要在 pom 文件中加入以下配置即可。
<repositories>
<repository>
<id>maven-public</id>
<name>maven-public</name>
<url>http://localhost:8081/repository/maven-public/</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
其中 id 要和你的仓库名称一致,url 就是私服的仓库地址,就是type为group的那个,它组合了一个 proxy 类型的和两个 hosted 类型的仓库。设置snapshots的enabled为ture表示允许下载 snapshots版本的包。
发布包
如果需要向仓库中发布包的,首先需要对仓库有权限才可以,没有权限的用户是没办法发布的。其实就是我们在上面配置认证信息的部分内容,此处不再赘述。然后需要在pom.xml 中的 project 内添加自动部署构件配置,配置下面的内容:
<distributionManagement><!-- 远程部署管理信息 -->
<!-- 项目部署到私服配置 id和上面server中配置的id一致-->
<repository><!--部署项目产生的构件到远程仓库需要的信息 -->
<id>nexus_release</id>
<name>maven-releases</name>
<url>http://localhost:8081/repository/maven-releases/</url>
</repository>
<snapshotRepository><!-- 如果没有配置该元素,默认部署到repository元素配置的仓库 -->
<id>nexus_snapshots</id>
<name>maven-snapshots</name>
<url>http://localhost:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
我们看到上面配置了一个repository,还有一个snapshotRepository,上面表示的是releases版。注意id要和setting.xml里server下的id一致,不然会出现权限问题。url分别指定maven-releases和maven-snapshots的地址。
只要在项目中配置1.0-SNAPSHOT这样,带有SNAPSHOT的就会到snapshots仓库,如果不加 SNAPSHOT就会到releases仓库。
最后执行 mvn clean deploy 命令,即可发布包到私服仓库中。
各参数代表含义为:
参数 | 含义 |
---|---|
-Dmaven.test.skip=true | 跳过编译、测试 |
-Dfile | jar包文件地址,绝对路径 |
-DgroupId | groupId,可自定义 |
-DartifactId | artifactId,可自定义 |
-Dversion | 版本号 |
-Dpackaging | 打包方式 |
-DrepositoryId | 远程库服务器ID |
-Durl | 远程库服务器地址 |
例如我们将admin-server-0.0.1-SNAPSHOT.jar发布到私服上,命令如下:mvn clean deploy -DgroupId=com.bat -DartifactId=admin-server -Dversion=0.0.1-SNAPSHOT -Dpackaging=jar -Dfile=/data/workspace/jar/admin-server/admin-server-0.0.1-SNAPSHOT.jar -Durl=http://192.168.0.28:8081/repository/maven-snapshots/ -DrepositoryId=nexus_snapshots --settings /usr/local/maven/conf/settings.xml
[root@dxm28 admin-server]# mvn clean deploy -DgroupId=com.bat -DartifactId=admin-server -Dversion=0.0.1-SNAPSHOT -Dpackaging=jar -Dfile=/data/workspace/jar/admin-server/admin-server-0.0.1-SNAPSHOT.jar -Durl=http://192.168.0.28:8081/repository/maven-snapshots/ -DrepositoryId=nexus_snapshots --settings /usr/local/maven/conf/settings.xml
显示成功,我们接下来到私服服务器看一下。
可以看到我们的jar包已经成功发布到私服上了。
点击左边的jar文件可以在右边看到相应的依赖配置,可以直接添加到pom.xml文件中下载相应的依赖。
除了以上命令方式发布包之外,也可以在IDEA中打开maven菜单,双击deploy按钮发布包到私服仓库中。
至此我们就完成了私服的搭建以及发布包到私服的过程。
加入systemctl管理并设置开机自启动
将nexus加入systemctl管理
创建nexus.service服务文件
创建nexus.service服务文件
[root@dxm28 /]# vim /etc/systemd/system/nexus.service
内容如下:
[Unit]
Description=nexus service
After=network.target
[Service]
User=nexus
Group=nexus
Type=forking
ExecStart=/usr/local/nexus-3.28.1-01/bin/nexus start
ExecStop=/usr/local/nexus-3.28.1-01/bin/nexus stop
Restart=on-abort
[Install]
WantedBy=multi-user.target
重新加载服务列表
[root@dxm28 /]# systemctl daemon-reload
启动服务
# 停止上面手动后台启动的nexus服务
[root@dxm28 /]# ps aux | grep java | grep nexus
nexus 62192 1.2 42.8 6734716 1646016 pts/0 Sl 10:22 2:33 /usr/local/jdk/bin/java -server -Dinstall4j.jvmDir=/usr/local/jdk -Dexe4j.moduleName=/usr/local/nexus-3.28.1-01/bin/nexus -XX:+UnlockDiagnosticVMOptions -Dinstall4j.launcherId=245 -Dinstall4j.swt=false -Di4jv=0 -Di4jv=0 -Di4jv=0 -Di4jv=0 -Di4jv=0 -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 -Djava.endorsed.dirs=lib/endorsed -Di4j.vpt=true -classpath /usr/local/nexus-3.28.1-01/.install4j/i4jruntime.jar:/usr/local/nexus-3.28.1-01/lib/boot/nexus-main.jar:/usr/local/nexus-3.28.1-01/lib/boot/activation-1.1.1.jar:/usr/local/nexus-3.28.1-01/lib/boot/jakarta.xml.bind-api-2.3.3.jar:/usr/local/nexus-3.28.1-01/lib/boot/jaxb-runtime-2.3.3.jar:/usr/local/nexus-3.28.1-01/lib/boot/txw2-2.3.3.jar:/usr/local/nexus-3.28.1-01/lib/boot/istack-commons-runtime-3.0.10.jar:/usr/local/nexus-3.28.1-01/lib/boot/org.apache.karaf.main-4.2.9.jar:/usr/local/nexus-3.28.1-01/lib/boot/osgi.core-6.0.0.jar:/usr/local/nexus-3.28.1-01/lib/boot/org.apache.karaf.specs.activator-4.2.9.jar:/usr/local/nexus-3.28.1-01/lib/boot/org.apache.karaf.diagnostic.boot-4.2.9.jar:/usr/local/nexus-3.28.1-01/lib/boot/org.apache.karaf.jaas.boot-4.2.9.jar com.install4j.runtime.launcher.UnixLauncher start 9d17dc87 0 0 org.sonatype.nexus.karaf.NexusMain
[root@dxm28 /]# kill -9 62192
# 检查是否还存在nexus进程
[root@dxm28 /]# ps aux | grep java | grep nexus
# 查询所有服务单元是否有nexus
[root@dxm28 /]# systemctl list-unit-files | grep nexus
nexus.service disabled
# 存在,且非开启自启动,使用systemctl启动nexus服务
[root@dxm28 /]# systemctl start nexus.service
# 查看nexus服务状态
[root@dxm28 /]# systemctl status nexus.service
Active: active (running) 可以看到nexus服务已经启动成功。查看进程以及端口的监听情况:
[root@dxm28 /]# ps aux | grep java | grep nexus
[root@dxm28 /]# netstat -ntlp | grep 8081
浏览器访问http://192.168.0.28:8081/
将nexus设置为开机自启动
[root@dxm28 /]# systemctl list-unit-files | grep nexus
nexus.service disabled
# disabled表示非开机自启动
# 设置为开机自启动
[root@dxm28 /]# systemctl enable nexus.service
Created symlink /etc/systemd/system/multi-user.target.wants/nexus.service → /etc/systemd/system/nexus.service.
# 再次查看
[root@dxm28 /]# systemctl list-unit-files | grep nexus
nexus.service enabled
# enabled表示是开机自启动,执行重启命令
[root@dxm28 /]# reboot
#重启后再次查看nexus服务已启动完成。