Contents
Maven私有仓库权限设置
转载来源: https://liming.pub/post/nexus-maven-permission/
基于nexus3,可以做到maven仓库隔离和权限控制,配合maven工程脚手架可以实现仓库的灵活控制,本文假设maven仓库有如下需求:
- 同步中央仓库(权限:公开)
- 合作伙伴共享仓库(权限:半公开)
- 公司自有仓库(权限:私有)
仓库设计
- 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)。
-
在
<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>
-
在
<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)
-
在
<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>
-
在
<servers></servers>
标签中添加server
子节点:<server> <id>maven-private</id> <username>用户名</username> <password>密码</password> </server>
部署
-
工程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> [...]
-
在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>
-
部署命令
-
通过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>
节点即可。同时代码位置结构层级结构有如下两种:
- 目录位置同层级结构
- 目录位置与层级结构无关,这样也有两种方式告诉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
发表回复