Nexus - 基于docker搭建Maven私服
1 关于Nexus和Maven
1.1 Nexus
Nexus 是 Sonatype 公司发布的一款仓库(Repository)管理软件,常用来搭建 Maven 私服,所以也有人将 Nexus 称为“Maven仓库管理器”。
Maven 私服其实并不是 Maven 的核心概念,它仅仅是一种衍生出来的特殊的仓库,但这并不代表它不重要,相反由于私服具有降低中央仓库负荷、节省外网带宽、以及提高项目稳定性等优点,使得私服在实际开发过程中得到了相当普遍地使用。
能够帮助我们建立私服的软件被称为 Maven 仓库管理器,主要有以下 3 种:
- Apache Archiva
- JFrog Artifactory
- Sonatype Nexus
其中,Sonatype Nexus 是当前最流行,使用最广泛的 Maven 仓库管理器。Nexus 分为开源版和专业版,其中开源版足以满足大部分 Maven 用户的需求。
Nexus 开源版具有以下特性:
占用内存小(28 M 左右)
具有基于 ExtJs 得操作界面,用户体验较好
使用基于 Restlet 的完全 REST API
支持代理仓库、宿主仓库和仓库组
基于文件系统,不需要依赖数据库
支持仓库索引以及搜索
支持在界面上上传构件
安全控制
1.2 Maven
参考 Maven
Maven是一个项目管理工具,它包含了
- 一个项目对象模型 (Project Object Model)
- 一组标准集合
- 一个项目生命周期(Project Lifecycle)
- 一个依赖管理系统(Dependency Management System)
- 和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。
Maven能够很方便的帮你管理项目报告,生成站点,管理JAR文件
Maven用途
- a) 优秀的构建工具
通过简单的命令,能够完成清理、编译、测试、打包、部署等一系列过程 - b) 依赖管理工具
项目依赖的第三方的开源类库,都可以通过依赖的方式引入到项目中来 - c) 项目信息管理工具
能够管理项目描述、开发者列表、版本控制系统地址、许可证等一些比较零散的项目信息
Maven帮助我们解决的问题
1.构建工程
2.管理jar
3.编译代码
4.自动运行单元测试
5.打包
6.生成报表
7.部署项目,生成web站点
Maven项目是啥?
我们这样来理解maven项目,就是在java项目和web项目上裹了一层maven,本质上java项目还是java项目,web项目还是web项目,但是包裹了maven之后,就可以使用maven提供的一些功能,即通过pom.xml添加jar包 就像在蜜汁鸡外面裹了一层面粉油炸一下变成了炸鸡,但是他还是一只鸡
Maven和nexus关系
Nexus仅仅是私服的一种
当Maven根据坐标寻找构件时,它首先会查看本地仓库,如果本地仓库存在此构件,则直接使用;如果本地仓库不存在此构件,或者需要查看是否有更新的构件版本,Maven会去远程仓库查找(默认找的是中央仓库),发现需要的构件之后,下载到本地仓库再使用。
在局域网内架设一个私有的仓库服务器,用其代理所有外部的远程仓库。当本地Maven项目需要下载构件时,先去私服请求,如果私服没有,则再去远程仓库请求,从远程仓库下载构件后,把构件缓存在私服上。
使用maven私服的好处
- 节省自己的外网带宽:利用私服代理外部仓库后,对外的重复构件下载得以消除,即降低外网带宽的压力。
- 加速maven的构建:Maven的一些内部机制(如快照检测)要求Maven在执行构建的时候不停地检查远程仓库的数据。
- 部署第三方构建
- 提高稳定性,增强控制:私服后即使暂时没有Internet连接Maven也可以正常运行,因为私服中缓存了大量的构件
- 降低中央仓库的负荷:数百万的请求,存储数T的数据,需要相相当大的财力。使用私服可以避免很多对中央仓库的重复请求。
2. 部署Nexus
2.1 启动nexus
docker pull sonatype/nexus3 #从dockerhub拉取nexus3镜像
mkdir -vp /server/docker/nexus/nexus-data
chmod 777 /server/docker/nexus/nexus-data
docker run -p 8081:8081 --name nexus \-v /server/docker/nexus/nexus-data:/nexus-data \-v /etc/localtime:/etc/localtime:ro \--restart=always \-itd sonatype/nexus3
如果是在虚拟机部署,内存不足,可以使用如下命令
[root@nexus-254 ~]# docker run -d --restart=always --name=nexus3 -p8081:8081 --privileged=true -e INSTALL4J_ADD_VM_PARAMS="-Xms512M -Xmx512M -XX:MaxDirectMemorySize=512M" -v /docker/nexus:/var/nexus-data sonatype/nexus3
2.2 登录nexus
浏览器中打开http://192.168.70.249:8081/
点击上图右上角的 Sign in ,输入用户名和密码,nexus默认用户名是 admin,密码是第一次启动的时候生成的,密码位于下面的文件中:安装目录/nexus-data/admin.password。
[root@nexus-254 ~]# docker exec -it 29b /bin/bash
bash-4.4$ cat /nexus-data/admin.password
4365bede-84f4-47dc-b2aa-a36e3e3453c9
登录成功后,即提示修改密码,按照指示修改即可
2.3 Nexus中仓库的分类
nexus中有个默认自带的仓库列表,里面包含了各种各样的仓库。
这些仓库主要分为三类,代理仓库、宿主仓库和仓库组。
-
代理仓库:代理仓库主要是让使用者通过代理仓库来间接访问外部的第三方远程仓库的。代理仓库会从被代理的仓库中下载构件,缓存在代理仓库中以供maven用户使用。
-
宿主仓库: 宿主仓库主要是给我们自己用的,主要有2点作用:
- 将私有的一些构件通过nexus中网页的方式上传到宿主仓库中给其他同事使用
- 将自己开发好的一些构件发布到nexus的宿主仓库中以供其他同事使用。 -
仓库组:(默认maven-public)仓库组中可以有多个代理仓库和宿主仓库,而maven用户只用访问一个仓库组就可以间接地访问这个组内所有的仓库,仓库组中多个仓库是有顺序的,当maven用户从仓库组下载构件时,仓库组会按顺序依次在组内的仓库中查找组件,查找到了立即返回给本地仓库,所以一般情况我们会将速度快的放在前面。仓库组内部实际上是没有构件内容的,他只是起到一个请求转发的作用,将maven用户下载构件的请求转发给组内的其他仓库处理。
2.4 创建仓库
Nexus仓库列表中点击create repository按钮
我们创建一个maven代理仓库:选择"maven2(proxy)",输入远程仓库信息:(阿里云仓库)
- 第一个红框中输入仓库名称:maven-aliyun
- 第二个红框选择:Release,表示从这个仓库中下载稳定版的构件
- 第三个红框输入阿里云仓库地址:https://maven.aliyun.com/repository/public
点击底部的create repository按钮,创建完成。
2.5 配置仓库组(maven-public)
URL:本地的maven可以通过这个url来从仓库组中下载构件至本地仓库。
Group Members:仓库组成员,第1个是宿主的release版本仓库,第2个是宿主的快照版本仓库,第3个是代理仓库(maven社区中央仓库的代理)
#可以将新增的maven-aliyun加入仓库组,放到第3个位置,这个仓库的速度比maven-central要快一些,能加速我们下载maven构件的速度。
2.6 本地Maven从nexus下载构件(两种方式)
获取仓库组对外的地址,点击下图中的 copy 按钮,获取仓库组的地址。
1 配置pom.xml的方式
配置pom.xml的方式跟配置远程仓库类似,把远程仓库的URL改成仓库组的URL。不同的是登录私服需要账户密码,可以在maven配置文件settings.xml中加入以下内容:
<servers>
<server>
<id>maven-public</id>
<username>admin</username>
<password>Newm123@</password>
</server>
<server>
<id>maven-releases</id>
<username>admin</username>
<password>Newm123@</password>
</server>
<server>
<id>maven-snapshots</id>
<username>admin</username>
<password>Newm123@</password>
</server>
</servers>
配置完成后,进入项目目录,执行 mvn complie 命令
2 配置镜像的方式
修改Maven配置文件settings.xml,加入以下内容:
<mirrors>
<mirror>
<id>maven-public</id>
<name>maven public</name>
<url>http://192.168.17.133:8081/repository/maven-public/</url>
<mirrorOf>*</mirrorOf>
</mirror>
<mirror>
<id>maven-releases</id>
<name>maven relesases</name>
<url>http://192.168.17.133:8081/repository/maven-releases/</url>
<mirrorOf>*</mirrorOf>
</mirror>
<mirror>
<id>maven-snapshots</id>
<name>maven snapshot</name>
<url>http://192.168.17.133:8081/repository/maven-snapshots/</url>
<mirrorOf>*</mirrorOf>
</mirror>
</mirrors>
上面mirror配置的*,说明远程仓库都通过该镜像下载构件,url是仓库组的地址
配置完成后,进入项目目录,执行 mvn complie 命令,就可以从nexus下载构件了。
2.7 本地构件发布到nexus(可以用做jenkins构建的版本管理)
常用的有两种方式:
- 使用maven部署构件到nexus私服
- 手动部署第三方构件到nexus私服
1 使用maven部署构件到nexus私服
修改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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>MyJava</artifactId>
<packaging>war</packaging>
<version>${project.release.version}</version>
<name>MyJava Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<!--根据个人需要自己修改-->
<source>11</source>
<target>11</target>
<webResources>
<resource>
<directory>src/main/webapp</directory>
<targetPath>/</targetPath>
</resource>
</webResources>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.4.3</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</build>
<!--
<properties>
<project.release.version>0.1-SNAPSHOT</project.release.version>
</properties>
-->
<profiles>
<profile>
<id>maven-releases</id>
<properties>
<project.release.version>0.1</project.release.version>
</properties>
</profile>
</profiles>
<distributionManagement>
<repository> <!-- release 版本上传用的仓库 -->
<id>maven-releases</id> <!-- server 的 id -->
<url>http://192.168.17.133:8081/repository/maven-releases/</url> <!-- 仓库的 URL -->
</repository>
<snapshotRepository> <!-- snapshot 版本上传用的仓库 -->
<id>maven-snapshots</id>
<url>http://192.168.17.133:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
</project>
修改Maven配置文件settings.xml,加入以下内容:
<mirrors>
<mirror>
<id>maven-public</id>
<name>maven public</name>
<url>http://192.168.17.133:8081/repository/maven-public/</url>
<mirrorOf>*</mirrorOf>
</mirror>
<mirror>
<id>maven-releases</id>
<name>maven relesases</name>
<url>http://192.168.17.133:8081/repository/maven-releases/</url>
<mirrorOf>*</mirrorOf>
</mirror>
<mirror>
<id>maven-snapshots</id>
<name>maven snapshot</name>
<url>http://192.168.17.133:8081/repository/maven-snapshots/</url>
<mirrorOf>*</mirrorOf>
</mirror>
</mirrors>
<servers>
<server>
<id>maven-public</id>
<username>admin</username>
<password>Newm123@</password>
</server>
<server>
<id>maven-releases</id>
<username>admin</username>
<password>Newm123@</password>
</server>
<server>
<id>maven-snapshots</id>
<username>admin</username>
<password>Newm123@</password>
</server>
</servers>
修改完成后,执行mvn deploy
命令,执行这个命令的时候,会对构件进行打包,然后上传到私服中
访问私服快照版本仓库地址:http://192.168.70.249:8082/repository/maven-snapshots/
点击browse连接,就可以看见上传成功了
如果其他同事需要使用上面这个构件,只需要点击下图中的pom文件,右边会显示构件的坐标,然后可以拿去使用了,如下图:
注意:snapshot属于快照版本,同一个snapshot版本的构件可以重复部署到私服中,如果私服中已经存在了则会进行覆盖掉,而release是稳定版本的构件,重复部署会报错。
2 手动部署第三方构件到nexus私服
手动上传只支持发布稳定版本的构件,操作如下:
图中第一行 maven-releases 宿主仓库就是存放用户自己构件的仓库,点击上图中列表中的第一行,进入上传页面,如下图:
上面页面中点击 Browse 选择本地的构件,然后输入其他坐标信息,点击 Upload 完成上传操作。
访问http://10.48.14.50:8082/#brose/browse:maven-releases,可以看到上传好的构件,如下图:
3. jar包和war包的区别
主要体现在文件扩展名、目的和运作方式、文件结构这几个方面。jar包扩展名为.jar,war包扩展名为.war;jar包可打包多个文件,以便用于库、插件或任何类型的应用程序,war包仅用于web应用程序,即web项目;jar包里没有静态资源的文件,war包里有。