基于nexus3,可以做到maven仓库隔离和权限控制,配合maven工程脚手架可以实现仓库的灵活控制,本文假设maven仓库有如下需求:

  1. 同步中央仓库(权限:公开)
  2. 合作伙伴共享仓库(权限:半公开)
  3. 公司自有仓库(权限:私有)

仓库设计

  • maven-central
    用于同步中央仓库(https://repo1.maven.org/maven2/)或者(https://maven.aliyun.com/repository/central)
  • maven-spring
    用于同步中央仓库(https://repo.spring.io/milestone)或者(https://maven.aliyun.com/repository/spring)
  • maven-protect-releases
    共享正式版本部署仓库,仓库类型:hosted,meven类型:Release,部署策略:Disable redeploy
  • maven-protect-snapshots
    共享开发版本部署仓库,仓库类型:hosted,meven类型:Snapshot,部署策略:Allow redeploy
  • maven-private-releases
    私有正式版本部署仓库,仓库类型:hosted,meven类型:Release,部署策略:Disable redeploy
  • maven-private-snapshots
    私有开发版本部署仓库,仓库类型:hosted,meven类型:Snapshot,部署策略:Allow redeploy
  • maven-protect
    合作伙伴共享访问仓库,仓库类型:group,聚合仓库:maven-central、maven-spring、maven-protect-releases、maven-protect-snapshots
  • maven-private
    公司内部访问仓库,仓库类型:group,聚合仓库:maven-central、maven-spring、maven-protect-releases、maven-protect-snapshots、maven-private-releases、maven-private-snapshots

角色设计

  • maven.protect.download 共享库只读,有如下权限:
    • nx-repository-view-maven2-maven-protect-read
    • nx-repository-view-maven2-maven-protect-browse
  • maven.private.download 私有库只读,有如下权限:
    • nx-repository-view-maven2-maven-private-read
    • nx-repository-view-maven2-maven-private-browse
  • maven-private-deploy 私有库部署,有如下权限:
    • nx-repository-view-maven2-maven-private-releases-add
    • nx-repository-view-maven2-maven-private-releases-edit
    • nx-repository-view-maven2-maven-private-releases-read
    • nx-repository-view-maven2-maven-private-snapshots-add
    • nx-repository-view-maven2-maven-private-snapshots-edit
    • nx-repository-view-maven2-maven-private-snapshots-read
  • maven-protect-deploy 共享库部署,有如下权限:
    • nx-repository-view-maven2-maven-protect-releases-add
    • nx-repository-view-maven2-maven-protect-releases-edit
    • nx-repository-view-maven2-maven-protect-releases-read
    • nx-repository-view-maven2-maven-protect-snapshots-add
    • nx-repository-view-maven2-maven-protect-snapshots-edit
    • nx-repository-view-maven2-maven-protect-snapshots-read

设置方法示例: Security->Roles->Create Role: maven.protect.download,Given Privilege:nx-repository-view-maven2-maven-protect-browse\nx-repository-view-maven2-maven-protect-read

NOTE: 只读权限是view不是admin

用户设置

Security->Users->Create User:xxx,授予角色:maven.protect.download

访问

合作伙伴

修改maven的配置文件(windows机器一般在maven安装目录的conf/settings.xml,mac/linux一般在~/.m2/settings.xml)。

  1. <mirrors></mirrors>标签中添加mirror子节点:

    1
    2
    3
    4
    5
    
        <mirror>
            <id>maven-xxx-protect</id>
            <mirrorOf>maven-xxx-protect</mirrorOf>
            <url>https://repo.liming.pub/nexus/repository/maven-protect/</url>
        </mirror>

    或者在<prifiles><profile></profile></prifiles>标签中增加增加repositories子节点:

    1
    2
    3
    4
    5
    6
    
    <repositories>
        <repository>
            <id>maven-xxx-protect</id>
            <url>https://repo.liming.pub/nexus/repository/maven-protect/</url>
        </repository>
    </repositories>
  2. <servers></servers>标签中添加server子节点:

    1
    2
    3
    4
    5
    
        <server>
            <id>maven-xxx-protect</id>
            <username>分发给合作伙伴的用户名</username>
            <password>密码</password>
        </server>

公司员工

修改maven的配置文件(windows机器一般在maven安装目录的conf/settings.xml,mac/linux一般在~/.m2/settings.xml)

  1. <mirrors></mirrors>标签中添加mirror子节点:

    1
    2
    3
    4
    5
    
        <mirror>
            <id>maven-private</id>
            <mirrorOf>maven-private</mirrorOf>
            <url>https://repo.liming.pub/nexus/repository/maven-private/</url>
        </mirror>

    或者在<prifiles></prifiles>标签中增加增加profile子节点:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    
        <profile>
            <id>maven-private</id>
            <repositories>
                <repository>
                    <id>maven-private</id>
                    <url>https://repo.liming.pub/nexus/repository/maven-private/</url>
                    <snapshots>
                        <updatePolicy>always</updatePolicy>
                    </snapshots>
                </repository>
            </repositories>
        </profile>
  2. <servers></servers>标签中添加server子节点:

    1
    2
    3
    4
    5
    
        <server>
            <id>maven-private</id>
            <username>用户名</username>
            <password>密码</password>
        </server>

部署

  1. 工程pom中增加发布仓库配置

     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
    
    [...]
    <profiles>
        <profile>
            <id>maven-protect</id>
            <distributionManagement>
                <repository>
                    <id>maven-protect-releases</id>
                    <url>https://repo.liming.pub/nexus/repository/maven-protect-releases/</url>
                </repository>
                <repository>
                    <id>maven-protect-snapshots</id>
                    <url>https://repo.liming.pub/nexus/repository/maven-protect-snapshots/</url>
                </repository>
            </distributionManagement>
        </profile>
        <profile>
            <id>maven-private</id>
            <distributionManagement>
                <repository>
                    <id>maven-private-releases</id>
                    <url>https://repo.liming.pub/nexus/repository/maven-private-releases/</url>
                </repository>
                <repository>
                    <id>maven-private-snapshots</id>
                    <url>https://repo.liming.pub/nexus/repository/maven-private-snapshots/</url>
                </repository>
            </distributionManagement>
        </profile>
    </profiles>
    [...]
  2. 在setting.xml的<servers></servers>标签中添加server子节点

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    
        <server>
            <id>maven-private-snapshots</id>
            <username>用户名</username>
            <password>密码</password>
        </server>
        <server>
            <id>maven-private-releases</id>
            <username>用户名</username>
            <password>密码</password>
        </server>
  3. 部署命令

  • 通过maven 的-P参数激活指定的profile
    参数的值是profile的id,多个profile以逗号分割,如果不想激活某个默认的profile,就在它的id前加个!

    1
    
    mvn deploy -Pmaven-private
  • 查看当前生效的profile:

    1
    
    mvn help:active-profiles -Pmaven-private

附1. pom解析

 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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
<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>...</groupId>

    <artifactId>...</artifactId>

    <version>...</version>

    <packaging>...</packaging>

 

 

    <!-- 依赖配置 -->

    <dependencies>...</dependencies>

    <parent>...</parent>

    <dependencyManagement>...</dependencyManagement>

    <modules>...</modules>

    <properties>...</properties>

 

    <!-- 构建配置 -->

    <build>...</build>

    <reporting>...</reporting>

 

    <!-- 项目信息 -->

    <name>...</name>

    <description>...</description>

    <url>...</url>

    <inceptionYear>...</inceptionYear>

    <licenses>...</licenses>

    <organization>...</organization>

    <developers>...</developers>

    <contributors>...</contributors>

 

    <!-- 环境设置 -->

    <issueManagement>...</issueManagement>

    <ciManagement>...</ciManagement>

    <mailingLists>...</mailingLists>

    <scm>...</scm>

    <prerequisites>...</prerequisites>

    <repositories>...</repositories>

    <pluginRepositories>...</pluginRepositories>

    <distributionManagement>...</distributionManagement>

    <profiles>...</profiles>

</project>

一些节点的理解:

  • parent.relativePath:
    Maven首先在当前项目的找父项目的pom,然后在文件系统的这个位置(relativePath),然后在本地仓库,再在远程仓库找。

  • dependencyManagement:
    一般在父模块中定义,子模块不会直接引用,但是在引用相同依赖的时候可以不加版本号。

附2 maven常见问题

maven多模块层级结构设计

经常会有继承父pom的这种写法,只需要在子pom里什么<paren></paren>节点即可。同时代码位置结构层级结构有如下两种:

  1. 目录位置同层级结构
  2. 目录位置与层级结构无关,这样也有两种方式告诉maven去哪获取父类:
    • 通过 parent.relativePath 申明父pom位置,这样maven就可以通过源码找到并自动判断依赖进行安装,好处是从源码打包方便,问题是,其他没有父pom源码的工程当把该子类作为父类时会找不到。
    • 通过maven仓库来找到依赖,好处是使用方简单,问题是第一次源码打包上传仓库时不能自动判断依赖,需要手工判断依赖并依次打包部署到仓库。

maven离线使用

要在无网络访问的环境下使用maven,由于私有仓库无法同步中央仓库,这种情况下,可以将本地仓库整个打包拷贝过去。注意要将各个目录下的 _remote.repositories 文件删除,否则maven也不会使用本地仓库的jar。

删除命令如下:

1
find ~/.m2/ -name _maven.repositories | xargs rm

相关文章