Maven私有仓库权限设置
文章目录
基于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
子节点: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>
在
<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)
在
<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>
在
<servers></servers>
标签中添加server
子节点:1 2 3 4 5
<server> <id>maven-private</id> <username>用户名</username> <password>密码</password> </server>
部署
工程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> [...]
在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>
部署命令
通过maven 的-P参数激活指定的profile
参数的值是profile的id,多个profile以逗号分割,如果不想激活某个默认的profile,就在它的id前加个!1
mvn deploy -Pmaven-private
查看当前生效的profile:
1
mvn help:active-profiles -Pmaven-private
附1. pom解析
|
|
一些节点的理解:
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。
删除命令如下:
1
|
find ~/.m2/ -name _maven.repositories | xargs rm |