参考_Maven私有仓库权限设置

Maven私有仓库权限设置

转载来源: https://liming.pub/post/nexus-maven-permission/

基于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子节点:

        <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子节点:

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

        <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子节点:

        <mirror>
            <id>maven-private</id>
            <mirrorOf>maven-private</mirrorOf>
            <url>https://repo.liming.pub/nexus/repository/maven-private/</url>
        </mirror>

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

        <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子节点:

        <server>
            <id>maven-private</id>
            <username>用户名</username>
            <password>密码</password>
        </server>

部署

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

    [...]
    <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子节点

        <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前加个!

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

    mvn help:active-profiles -Pmaven-private

附1. pom解析

<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。

删除命令如下:

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

相关文章

文章作者 liming

上次更新 2019-02-23 11:47:45

许可协议 保留署名-非商业性使用-禁止演绎 4.0-国际许可协议


评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注