配置详解
由于各环境均使用snapshot做api管理,最近出现生产发布时依赖到未发布的api版本,导致生产问题。针对开发同学诉求,解决如下两个问题: 1.api环境区分,开发--snapshot,测试-release,生产-正式版 2.每次需求开发无需关注,无需改动项目pom.xml 解决思路:不同环境jar包推送不同仓库,开发-snapshot,测试-release,生产-release(但jar不带-release); 开发各分支统一使用 -SNAPSHOT,CI构建时根据不同环境传递参数覆盖环境变量促使产生 -RELEASE的jar及生产的jar,deploy到不同的环境
1. localRepository
本地仓库地址
<localRepository>D:/localRepository</localRepository>
2. pluginGroups
附加插件组
3. proxy
网络代理服务器,如不能直接访问外网,通过代理服务器访问。当然通过系统层面开代理访问也是可以的啦
<proxy>
<id>xxx-proxy</id>
<active>true</active>
<protocol>http</protocol>
<username>proxyuser</username>
<password>proxypass</password>
<host>proxy.host.net</host>
<port>80</port>
<!-- 不需要代理的站点 -->
<nonProxyHosts>local.net|some.host.com</nonProxyHosts>
</proxy>
4. servers
设置访问私服仓库的账号密码,nexus私服的账号可精确控制 读、推送等权限,可配置多组
<server>
<!-- 该id与distributionManagement中repository元素的id相匹配,也是nexus仓库中指定的仓库名称 -->
<id>maven-releases</id>
<!-- 鉴权账号 -->
<username>xxuser</username>
<!-- 密码 -->
<password>xxpassword</password>
</server>
5. mirror
镜像配置的目的是:拦截指定的远程 repository 下载构件(jar)的请求,从镜像服务中找出构件(jar)回送给客户端,避免都通过中央仓下载构建,出于下载速度考虑(中央仓慢呀...离我们太远)
<mirror>
<!-- 镜像标志,唯一,暂无关联引用 -->
<id>maven-public-mirror</id>
<!-- 镜像名称,描述 -->
<name>Maven私服类库</name>
<!-- 镜像地址(这是一个nexus私服仓库地址,可以认为公司的nexus私服即是私服仓库也是镜像) -->
<url>http://nexusIp:port/repository/maven-public/</url>
<!-- 镜像对应的 repository 的 ID,可通过正则表达式书写 -->
<mirrorOf>*</mirrorOf>
</mirror>
<mirror>
<id>alimaven-mirror</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
常用镜像地址:
| 名称 | 地址 |
|---|---|
| maven中央仓中国镜像 | maven.net.cn/content/gro… |
| 阿里云镜像 | maven.aliyun.com/repository/… |
| 网易镜像 | mirrors.163.com/maven/repos… |
| 腾讯镜像 | mirrors.cloud.tencent.com/nexus/repos… |
个人理解:
- mirror 只是远程 repository 的网络加速器
- 私服往往也提供mirror服务,Nexus 让URL即作内网仓库,也做各中央仓的镜像:因为私服可以获取到所有中央仓的构建,所以也可以理解为就是镜像
6. repository
repository是 profiles.profile.repositorys下的节点是maven去下载 构建(jar)包的仓库,如下配置可配置多份,比如maven-nexus-snapshots 可以针对不同的账号推送不同版本(snapshots、release)的构建到私服不同的仓库
<profiles>
<profile>
<id>maven-nexus-releases</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<!-- 统一配置distributionManagement 用于推送,程序pom无需再配置,maven-releases需要与servers中配置某个serverId匹配 -->
<properties>
<altReleaseDeploymentRepository>releases::default::http://nexusIp:port/repository/maven-releases</altReleaseDeploymentRepository>
</properties>
<repositories>
<repository>
<id>maven-public</id>
<name>Maven私服类库</name>
<url>http://nexusIp:port/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>maven-nexus-releases</activeProfile>
<activeProfile>maven-nexus-snapshots</activeProfile>
</activeProfiles>
7.梳理脑图
8.打包时注意事项
只推送父目录的pom: mvn clean package deploy -DskipTests -N
推送指定的项目模块:mvn deploy -pl moduleName -am
-pl, --projects
Build specified reactor projects instead of all projects
-am, --also-make
If project list is specified, also build projects required by the list
编译时动态传参覆盖:mvn clean install -D env.project.version=1.0.0-SNAPSHO
env.project.version 如果存在则覆盖pom中的值
9.多模块项目maven配置
支持统一项目版本,区分dev、test、release、prod 环境
<!-- 父模块配置-->
<groupId>com.example</groupId>
<artifactId>maven-project</artifactId>
<version>${maven-project.version}</version>
<name>maven-project</name>
<description>maven-project</description>
<packaging>pom</packaging>
<properties>
<java.version>1.8</java.version>
<env.project.version>-SNAPSHOT</env.project.version>
<maven-project.version>1.0.0${env.project.version}</maven-project.version>
<maven-demo-service.version>1.2.0${env.project.version}</maven-demo-service.version>
<maven-demo-interface.version>1.0.0${env.project.version}</maven-demo-interface.version>
<maven-demo-repository.version>1.0.0${env.project.version}</maven-demo-repository.version>
<maven-demo-model.version>1.0.0${env.project.version}</maven-demo-model.version>
<spring-boot.version>2.6.1</spring-boot.version>
</properties>
<modules>
<module>maven-demo-service</module>
<module>maven-demo-interface</module>
<module>maven-demo-repository</module>
<module>maven-demo-model</module>
</modules>
<!-- 子模块配置 -->
<parent>
<groupId>com.example</groupId>
<artifactId>maven-project</artifactId>
<version>${maven-project.version}</version>
</parent>
<groupId>com.example</groupId>
<artifactId>maven-demo-service</artifactId>
<version>${maven-demo-service.version}</version>
<name>maven-demo-service</name>
<description>maven-demo-service</description>
<properties>
<java.version>1.8</java.version>
</properties>
10.编译命令
编译打包开发jar:mvn clean install deploy -D env.project.version=-SNAPSHOT -DskipTests -X
编译打包测试jar:mvn clean install deploy -D env.project.version=-RELEASE -DskipTests -X
编译打包生产jar:mvn clean install deploy -D env.project.version= -DskipTests -X
备注:snapshot、release的仓库都设置成可覆盖推送
11.写在最后
有漏洞或理解错误之处,欢迎大家指正,手动滑稽。。。谢谢