Maven私服Nexus3
Maven和Nexus3简介
Maven是一个采用纯java编写的开源项目管理工具
采用一种被称之为Project Object Model(POM)概念来管理项目,所有的项目配置信息都被定义在一个pom.xml
的文件中,通过该文件Maven可以管理项目的整个生命周期,包括清除、编译、测试、报告、打包、部署等等
目前Apache下绝大多数项目都已经采用Maven进行管理,而Maven本身还支持多种插件,可以方便灵活的控制项目,开发人员的主要任务应该是关注商业逻辑并去实现它,而不是把时间浪费在学习如何在不同的环境中去依赖jar包,项目部署等
Maven和ant都是软件构件工具(软件管理工具),Maven比Ant更加强大,已经取代了ant.jar包等声明式依赖描述。Maven有jar包的仓库
私服是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件。有了私服之后,当Maven需要下载构件时,直接请求私服,私服上存在则下载到本地仓库,否则,私服请求外部的远程仓库,将构件下载到私服,再提供给本地仓库下载,公司如果没有maven私服,则需要用手动打jar包的方式添加依赖
安装Maven
下载maven
下载地址:https://maven.apache.org/download.html
wget https://dlcdn.apache.org/maven/maven-3/3.9.2/binaries/apache-maven-3.9.2-bin.tar.gz
解压安装
tar -zxvf apache-maven-3.9.2-bin.tar.gz -C /usr/local/
安装java环境
# 上传到虚拟机
scp jdk-8u333-linux-aarch64.tar.gz root@192.168.64.9:~/
# 解压到指定目录下
tar -zxvf jdk-8u333-linux-aarch64.tar.gz -C /usr/local/
添加环境变量
vi /etc/profile
添加如下内容
# JAVA_HOME
export JAVA_HOME=/usr/local/jdk1.8.0_333
export JRE_HOME=/usr/local/jdk1.8.0_333/jre
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
#MAVEN_HOME
export MAVEN_HOME=/usr/local/apache-maven-3.9.2
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$MAVEN_HOME/bin:$PATH
重载环境变量
source /etc/profile
验证maven安装
mvn -v
mvn -version
安装Nexus3
下载
下载地址(此地址需要注册账号):https://www.sonatype.com/products/sonatype-nexus-oss-download
另外一个地址(可能需要vpn,切换到usa节点):https://help.sonatype.com/repomanager3/product-information/download/download-archives—repository-manager-3
解压
# 上传到虚拟机
scp nexus-3.56.0-01-unix.tar.gz root@192.168.64.9:~
# 创建目录
mkdir /usr/local/nexus
# 解压到指定目录
tar -zxvf nexus-3.56.0-01-unix.tar.gz -C /usr/local/nexus/
启动
# 切换目录
cd /usr/local/nexus/nexus-3.56.0-01/bin/
# 启动nexus
./nexus start
WARNING: ************************************************************
WARNING: Detected execution as "root" user. This is NOT recommended!
WARNING: ************************************************************
Starting nexus
# 查看是否启动成功
ps -ef | grep nexus
root 10467 1 17 18:40 pts/1 00:01:20 /usr/local/jdk1.8.0_333/bin/java -server -Dinstall4j.jvmDir=/usr/local/jdk1.8.0_333 -Dexe4j.moduleName=/usr/local/nexus/nexus-3.56.0-01/bin/nexus -......
# 查看nexus端口占用,pid为10467
netstat -tunlp | grep 10467
# 开放8081端口,访问虚拟机 http://192.168.64.9:8081
firewall-cmd --zone=public --add-port=8081/tcp --permanent
# 默认访问读端口为8081,自定义端口需要修改nexus-3.56.0-01/etc/nexus-default.properties文件
vi /usr/local/nexus/nexus-3.56.0-01/etc/nexus-default.properties
使用Nexus
登录nexus
查看密码
cat /usr/local/nexus/sonatype-work/nexus3/admin.password
c85b22f4-ba97-4014-8dd0-d29fcc05fac9
仓库介绍
点击“设置-Repositories”,就可以看到仓库,分三种类型
-
proxy:是远程仓库的代理。比如说在nexus中配置了一个
central repository
的proxy,当用户向这个proxy请求一个artifact,这个proxy就会先在本地查找,如果找不到的话,就会从远程仓库下载,然后返回给用户,相当于起到一个中转的作用 -
Hosted:是宿主仓库,用户可以把自己的一些构件,deploy到hosted中,也可以手工上传构件到hosted里。
-
Group:是仓库组,在maven里没有这个概念,是nexus特有的。目的是将上述多个仓库聚合,对用户暴露统一的地址,这样用户就不需要在pom中配置多个地址,只要统一配置group的地址就可以了右边那个Repository Path可以点击进去,看到仓库中artifact列表。不过要注意浏览器缓存,当项目希望在多个repository使用资源时就不需要多次引用了,只需要引用一个group即可
maven-public:maven-central、maven-release和maven-snapshot三个库的合集
maven-release:用来存放release版本的jar包
maven- snapshot:用来存放snapshot版本的jar包
关于maven的snapshot版本与release版本
- snapshot:代表不稳定、尚处于开发中的版本
- release:代表稳定的版本
- Q:什么情况下该用SNAPSHOT?
- A:协同开发时,如果A依赖构件B,由于B会更新,B应该使用SNAPSHOT来标识自己,反例如下:
- 如果B不用SNAPSHOT,而是每次更新后都使用一个稳定的版本,那版本号就会升得太快,每天一升甚至每小时一升,这是对版本号的滥用
- 如果B不用SNAPSHOT,但一直使用一个单一的release版本号,那当B更新后,A可能并不会接收到更新。因为A使用的repository一般不会频繁更新release版本的缓存(即本地repository),所以B以不换版本号的方式更新后,A在拿B时发现本地已有这个版本,就不会去远程Repository下载最新的包
- Q:不用Release版本,在所有地方都用SNAPSHOT版本行不行?
- A:不行,原因如下:
- 正式环境中不得使用SNAPSHOT版本的库,比如说,今天依赖某个SNAPSHOT版本的第三方库成功构建了自己的应用,明天再构建时可能就会失败,因为今晚第三方可能已经更新了它的SNAPSHOT库。再次构建时,Maven会去远程Repository下载SNAPSHOT的最新版本,构建时用的库就是新的jar文件了,这时正确性就很难保证了
创建阿里云代理仓库
远程地址:http://maven.aliyun.com/nexus/content/groups/public
修改仓库组
选择阿里云代理仓库添加到右边仓库组
移动到最上边
上传依赖
修改本地maven配置
# 查看maven信息
mvn -v
Apache Maven 3.8.6 (84538c9988a25aec085021c365c560670ad80f63)
Maven home: /usr/local/maven/apache-maven-3.8.6
Java version: 1.8.0_321, vendor: Oracle Corporation, runtime: /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home
Default locale: zh_CN, platform encoding: UTF-8
OS name: "mac os x", version: "12.3", arch: "x86_64", family: "mac"
修改配置文件vi /usr/local/maven/apache-maven-3.8.6/conf/settings.xml
<!-- 修改servers标签 -->
<servers>
<server>
<id>deploymentRepo-nexus</id>
<username>nexus用户名</username>
<password>nexus密码</password>
</server>
</servers>
maven项目配置
复制仓库地址
找到pom.xml,添加标签配置
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.gtahub</groupId>
<artifactId>test-spring-boot-starter-autoconfig</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
<relativePath/>
</parent>
<name>test-spring-boot-starter-autoconfig</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure-processor</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<!-- 添加以下配置 -->
<distributionManagement>
<!-- release版本仓库 -->
<repository>
<!-- id填写本地maven配置文件中servers>>server>>id配置的内容 -->
<id>deploymentRepo-nexus</id>
<!-- 地址填刚刚在nexus界面上复制的地址 -->
<url>http://192.168.64.9:8081/repository/maven-releases/</url>
</repository>
<!-- snapshots版本仓库 -->
<snapshotRepository>
<id>deploymentRepo-nexus</id>
<url>http://192.168.64.9:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
</project>
上传到nexus
打开右侧maven选项卡,点击deploy
查看nexus仓库
release仓库设置允许重新发布
设置为Allow redeploy
代表允许对仓库中的依赖维护升级新版本,如果设置为disable redeploy
意味着无法将升级版本上传上来
下载依赖
修改本地maven配置
vi /usr/local/maven/apache-maven-3.8.6/conf/settings.xml
注释版
<!-- 修改mirrors标签 -->
<mirrors>
<mirror>
<!-- 指定之前添加server的id -->
<id>deploymentRepo-nexus</id>
<!-- *代表所有的依赖都从私服找 -->
<mirrorOf>*</mirrorOf>
<!-- 找到 nexus>>Browse>>maven-public 复制url -->
<url>http://192.168.64.9:8081/repository/maven-public/</url>
</mirror>
</mirrors>
<!-- 修改profiles标签 -->
<profiles>
<profile>
<id>nexus</id>
<!-- 声明远程仓库 -->
<repositories>
<!-- 声明Nexus私服上的仓库 -->
<repository>
<!-- 仓库id -->
<id>nexus</id>
<!-- 仓库地址 -->
<url>http://192.168.64.9:8081/repository/maven-public/</url>
<!-- 是否开启该仓库的release版本下载支持 -->
<releases>
<enabled>true</enabled>
</releases>
<!-- 是否开启该仓库的snapshot版本下载支持 -->
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<!-- 声明远程插件仓库 -->
<pluginRepositories>
<!-- 声明Nexus私服上的插件仓库 -->
<pluginRepository>
<!-- 插件仓库id -->
<id>nexus</id>
<!-- 配置的插件仓库的地址 -->
<url>http://192.168.64.9:8081/repository/maven-public/</url>
<!-- 是否开启该插件仓库的release版本下载支持 -->
<releases>
<enabled>true</enabled>
</releases>
<!-- 是否开启该插件仓库的snapshot版本下载支持 -->
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<activeProfiles>
<!-- 激活profile -->
<activeProfile>nexus</activeProfile>
</activeProfiles>
无注释版
<mirrors>
<mirror>
<id>deploymentRepo-nexus</id>
<mirrorOf>*</mirrorOf>
<url>http://192.168.64.9:8081/repository/maven-public/</url>
</mirror>
</mirrors>
<profiles>
<profile>
<id>nexus</id>
<repositories>
<repository>
<id>nexus</id>
<url>http://192.168.64.9:8081/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>nexus</id>
<url>http://192.168.64.9:8081/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>nexus</activeProfile>
</activeProfiles>
pom.xml方式
<repositories>
<repository>
<id>nexus</id>
<name>nexus maven</name>
<url>http://192.168.64.9:8081/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>nexus</id>
<name>nexus maven</name>
<url>http://192.168.64.9:8081/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
下载私服依赖到本地
删除本地依赖,默认位置在${user.home}/.m2/repository
路径下,如果配置了localRepository
,可通过查看配置文件方式找到本地依赖cat /usr/local/maven/apache-maven-3.8.6/conf/settings.xml
备注
- starter是一个空项目,其中只引用了starter-autoconfig的依赖。当starter依赖下载完成后,尝试去引入starter-autoconfig中的类时,并不能找到相关的类。在
pom.xml
中再多引用一下starter-config才能使用其中的类。目前这个算是遗留问题,后续解决会改掉- 问题解决:starter中引用的starter-autoconfig的配置如下
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> <!-- 问题出现在optional这个选项: 当其它项目通过pom引入该项目时,就不会将该项目中的这个依赖被传递依赖引入进去,当你依赖某各工程很庞大或很可能与其他工程的jar包冲突的时候建议加上该选项,可以节省开销,同时减少依赖冲突 --> <optional>true</optional> <scope>compile</scope> </dependency>
- 问题解决:starter中引用的starter-autoconfig的配置如下