Maven setting.xml配置详解

982 阅读3分钟

配置详解

由于各环境均使用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.梳理脑图

Maven.png

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.写在最后

有漏洞或理解错误之处,欢迎大家指正,手动滑稽。。。谢谢