# 第08章 Maven私服

# 8.1 需求

正式开发,不同的项目组开发不同的工程。

ssm_dao工程开发完毕,发布到私服。

ssm_service从私服下载dao

# 8.2 分析

公司在自己的局域网内搭建自己的远程仓库服务器,称为私服,私服服务器即是公司内部的maven远程仓库,每个员工的电脑上安装maven软件并且连接私服服务器,员工将自己开发的项目打成jar并发布到私服服务器,其它项目组从私服服务器下载所依赖的构件(jar)。

私服还充当一个代理服务器,当私服上没有jar包会从互联网中央仓库自动下载,如下图:

1555844341640

# 8.3 搭建私服环境

# 8.3.1 下载Nexus

Nexus 是Maven仓库管理器,通过nexus可以搭建maven仓库,同时nexus还提供强大的仓库管理功能,构件搜索功能等。

下载Nexus, 下载地址:https://www.sonatype.com/download-oss-sonatype

1555844582780

# 8.3.2 安装和启动Nexus

1555844807623

解压在F盘,进入bin目录:

1555844937237

cmd进入bin目录,执行nexus /install Nexus3

该命令将会将Nexus Repository注册成为Windows服务

1555845004741

安装成功在服务中查看有nexus服务:

1555845048276

进入windows服务管理页面,启动刚刚注册的Nexus3服务

1555845091182

等几分钟到Nexus Repository程序初始化完成,打开浏览器,输出localhost:8081,出现如下界面,安装成功。

1555845365074

# 8.3.3 Sonatype Nexus Repository OSS配置

Nexus Repository OSS默认管理员账号为admin,密码为admin123,使用管理员账号登陆系统;

1555845674321

1555845691114

在etc下有一个nexus-defauly.properties文件,是nexus的配置文件:

1555845862275

## DO NOT EDIT - CUSTOMIZATIONS BELONG IN $data-dir/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
1
2
3
4
5
6
7
8
9
10
11
12

可以在这里修改端口号或者项目的context

nexus仓库默认在sonatype-work目录中

登录之后就可以查看私服了。登录以后,最上面会有两个按钮,一个是查看仓库配置的(齿轮形状),另一个是查看仓库内容的(正方体):

1555845365074

1555845983194

我们只关心maven,所以在左侧点击maven,右面就是所有的仓库的maven的jar包。上面支持特定的搜索。第一次这个页面没有任何包。

当然我们也可以点击左侧的browse来浏览仓库

1555846099859

这是默认的仓库,当然这里我们只关心maven的,也就是前四个。name是仓库名,url是仓库的地址,会在我们的项目pom里被使用到。

  • maven-central:这是maven的中心仓库,nexus这里只是做一个代理,最后会转发到maven的central库,如下:

1555846289378

  • maven-public:这是一个仓库组,访问这个仓库组的地址其实会访问组内所有仓库

1555846366951

我们可以在配置页面看到这个public的仓库组的配置,默认是包含了members指定的三个仓库。所以在pom中使用这个仓库组的url时,实际上会从members里的所有仓库下载jar包。

1555846420180

  • maven-releases:这是nexus提供的一个默认的存放release版本jar包的仓库。

  • maven-snapshots:这是nexus提供的一个默认的存放snapshot版本jar包的仓库。

仓库的属性可以控制只存放snapshot或者release版本的jar包,当然我们可以不使用这些默认的仓库,进行自行创建。创建途径

1555846619000

1555846631156

这里可以看到nexus可以支持很多种仓库,只看maven,其实就只有三种:

  • proxy就是代理类,负责转发,比如之前的maven-central;

  • hosted就是我们常用的存放jar包的仓库,可以选择jar包的类型,release,snapshot或者mixed;

  • group可以包含多个仓库,比如之前的maven-public;

以上就是nexus3的大致使用方式,具体的可以自行了解,比较简单

# 8.4 将项目发布到私服

上传jar包需要认证,maven的认证是在settings.xml里servers标签下配置的

  <servers>
    <server>
        <id>release_user</id>
        <username>admin</username>
        <password>admin123</password>
    </server>
    <server>
        <id>snapshot_user</id>
        <username>admin</username>
        <password>admin123</password>
    </server>
  </servers>
1
2
3
4
5
6
7
8
9
10
11
12

这里配置两个用户,一个部署release类型jar包的,一个是部署snapshot类型jar包的。

id用于唯一指定一条认证配信息,之后会在pom中使用。

接着在项目的pom.xml文件中配置上传的仓库的位置

1555849569083

<?xml version="1.0" encoding="UTF-8"?>
<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">
    <parent>
        <artifactId>demo-ad</artifactId>
        <groupId>com.clare.ad</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.clare.ad</groupId>
    <artifactId>ad-eureka</artifactId>
    <packaging>jar</packaging>
    <version>1.0</version>

    <name>ad-eureka</name>
    <description>Spring Cloud Eureka</description>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
        <!--是springboot提供的微服务检测接口,默认对外提供几个接口:/info-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    </dependencies>

    <distributionManagement>
        <repository>
            <id>release_user</id>
            <name>Release Deploy</name>
            <url>http://localhost:8081/repository/maven-releases/</url>
        </repository>
        <snapshotRepository>
            <id>snapshot_user</id>
            <name>Snapshot Deploy</name>
            <url>http://localhost:8081/repository/maven-snapshots/</url>
        </snapshotRepository>
    </distributionManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54

这里配置了上传的url,具体的url可以在nexus的仓库浏览界面下点击仓库的url copy获得。使用刚才的两个认证信息,把jar包存在nexus提供的默认仓库下。id对应了setting.xml里配置的信息,name随意。

1555849636278

执行maven的deploy命令,部署到nexus上

1555849714882

此时使用的是父类的版本,即快照版本,所以可以在maven-snapshots仓库下看到:

1555849765774

选择一个项目可以在左侧看到详情

1555849828206

再打一个release的jar包,只需要把version改为1.0即可,再执行deploy命令

    <parent>
        <artifactId>demo-ad</artifactId>
        <groupId>com.clare.ad</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.clare.ad</groupId>
    <artifactId>ad-eureka</artifactId>
    <packaging>jar</packaging>
    <version>1.0</version>
1
2
3
4
5
6
7
8
9
10
11

1555849925301

所有的jar包: 1555849957485

# 8.5 从私服下载jar包

需要在pom中加入依赖,并且配置我们的nexus仓库。

1555850193552

未配置前:

1555850226548

<?xml version="1.0" encoding="UTF-8"?>
<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">
    <parent>
        <artifactId>demo-ad</artifactId>
        <groupId>com.clare.ad</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.clare.ad</groupId>
    <artifactId>ad-gateway</artifactId>
    <packaging>jar</packaging>

    <dependencies>
        <!--web应用程序-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--spring cloud eureka客户端-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        </dependency>
        <!--是springboot提供的微服务检测接口,默认对外提供几个接口:/info-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--ad-eureka-->
        <dependency>
            <groupId>com.clare.ad</groupId>
            <artifactId>ad-eureka</artifactId>
            <version>1.0</version>
        </dependency>
    </dependencies>

    <repositories>
        <repository>
            <id>nexus-public</id>
            <name>Nexus Public</name>
            <url>http://localhost:8081/repository/maven-public/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
    </repositories>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66

配置后:

1555850236276

Last Updated: 10/20/2019, 11:49:45 PM