多环境构建

内置属性

${basedir}:表示项目根目录,即包含pom.xml文件的目录
${version}:表示项目的版本号

POM属性

${pom.build.sourceDirectory}:项目的主源码目录,默认为src/main/java/
${project.build.testSourceDirectory}:项目的测试源码目录,默认为src/test/java/
${project.build.directory}:项目构建输出目录,默认为target/
${project.build.outputDirectory}:项目主代码编译输出目录,默认为target/classes
${project.build.testOutputDirectory}:项目测试代码编译输出目录,默认为target/test-classes
${project.groupId}:项目的groupId
${project.artifactId}:项目的artifactId
${project.version}:项目的version,与${version}等价
${project.build.finalName}:项目打包输出文件的名称,默认为${project.artifactId}-${project.version}

Settings属性

这种属性以settings.开头来引用~/.m2/settings.xml中的内容,如:

#指向用户本地仓库的地址。
${settings.localRepository}

java系统属性

所有java系统属性都可以使用maven属性来进行引用,例如${user.home}指向了当前用户目录。

java系统属性可以通过mvn help:system命令看到。

环境变量属性

所有的环境变量都可以使用env.开头的方式来进行引用,如:

# 可以获取环境变量JAVA_HOME的值。
${env.JAVA_HOME}

用户可以使用mvn help:system命令查看所有环境变量的值。

上面的maven属性,我们在pom.xml中通过${属性名称}可以灵活的引用,对我们写pom.xml文件帮助还是比较大的。

案例

<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <!-- 配置maven编译的时候采用的编译器版本 -->
        <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
        <!-- 指定源代码是什么版本的 -->
        <maven.compiler.source>1.8</maven.compiler.source>
        <!-- maven中执行编译的时候会用到这个配置 -->
        <maven.compiler.target>1.8</maven.compiler.target>

        <!-- [maven 属性引用: 通过命令查看变量内容: mvn help:effective-pom > mvn.xml] /-->
        <!-- 项目的主源码目录,默认为src/main/java/ -->
        <a>${pom.build.sourceDirectory}</a>
        <!-- 项目的测试源码目录,默认为src/test/java/ -->
        <b>${project.build.testSourceDirectory}</b>
        <!-- 项目构建输出目录,默认为target/ -->
        <c>${project.build.directory}</c>
        <!-- 项目主代码编译输出目录,默认为target/classes -->
        <d>${project.build.outputDirectory}</d>
        <!-- 项目测试代码编译输出目录,默认为target/test-classes -->
        <e>${project.build.testOutputDirectory}</e>
        <!-- 项目的groupId -->
        <f>${project.groupId}</f>
        <!-- 项目的artifactId -->
        <g>${project.artifactId}</g>
        <!-- 项目的version,与${version}等价-->
        <h>${project.version}</h>
        <!-- 项目打包输出文件的名称,默认为${project.artifactId}-${project.version} -->
        <i>${project.build.finalName}</i>

        <!-- setting属性 -->
        <!-- 获取本地仓库地址-->
        <a1>${settings.localRepository}</a1>

        <!-- 系统属性 -->
        <!-- 用户目录 -->
        <a2>${user.home}</a2>

        <!-- 环境变量属性,获取环境变量JAVA_HOME的值 -->
        <a3>${env.JAVA_HOME}</a3>
    </properties>

多套环境构建问题

理解资源文件打包过程

resources目录中的文件一般放的都是配置文件,配置文件一般最好我们都不会写死,所以此处有几个问题:

  1. 这个插件复制资源文件如何设置编码?
  2. 复制的过程中是否能够对资源文件进行替换,比如在资源文件中使用一些占位符,然后复制过程中对这些占位符进行替换。

maven-resources-plugin这个插件也想到了这个功能,帮我们提供了这样的功能

设置资源文件复制过程采用的编码
<properties>
    <encoding>UTF-8</encoding>
</properties>
设置资源文件内容动态替换

资源文件中可以通过@maven属性@来引用maven属性中的值,打包的过程中这些会被替换掉,替换的过程默认是不开启的,需要手动开启配置。
修改src/main/resource/jdbc.properties内容如下:

jdbc.url=@jdbc.url@
jdbc.username=@jdbc.username@
jdbc.password=@jdbc.password@

在配置文件中引用 pom 中的 properties 变量时,默认使用 @ 来获取

pom.xml 中的配置

<!-- 自义定属性在配置文件 jdbc.properties 中获取 -->
        <jdbc.url>jdbc:mysql://localhost:3306/javacode2018?characterEncoding=UTF-8</jdbc.url>
        <jdbc.username>root</jdbc.username>
        <jdbc.password>root</jdbc.password>

<build> 下 <resources> 标签配置如下:

        <resources>
            <resource>
                <!-- 指定资源文件的目录 -->
                <directory>${project.basedir}/src/main/resources</directory>
                <!-- 是否开启过滤替换配置,默认是不开启的 -->
                <filtering>true</filtering>
            </resource>
        </resources>
自定义替换的分隔符

自定义分隔符,需要我们配置maven-resources-plugin插件的参数,如下:

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-resources-plugin</artifactId>
        <version>2.6</version>
        <configuration>
            <!-- 是否使用默认的分隔符,默认分隔符是${*}和@ ,这个地方设置为false,表示不启用默认分隔符配置-->
            <useDefaultDelimiters>false</useDefaultDelimiters>
            <!-- 自定义分隔符 -->
            <delimiters>
                <delimiter>$*$</delimiter>
                <delimiter>##</delimiter>
            </delimiters>
        </configuration>
    </plugin>
</plugins>

delimiters中可以配置多个delimiter,可以配置#*#,其中的*表示属性名称,那么资源文件中的#属性名#在复制的过程中会被替换掉,*前后都是#,表示前后分隔符都一样,那么可以简写为#,所以#*##写法是一样的,我们去看一下源码,delimiters的默认值如下:

AbstractMavenFilteringRequest 类

    private void initDefaults() {
        this.projectStartExpressions.add("pom");
        this.projectStartExpressions.add("project");
        this.delimiters.add("${*}");
        this.delimiters.add("@");
    }
maven resources 目标执行

maven 中执行 资源打包操作

 mvn resources:resources
maven plugin 插件debug
  1. 启动debug

    mvnDebug -Dplugin=org.apache.maven.plugins:maven-resources-plugin:3.1.0:resources
    
  2. maven plugin debug 启动配置
    在这里插入图片描述
    在这里插入图片描述

    -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000

指定需要替换的资源文件
            <resource>
                <!-- 指定资源文件的目录 -->
                <directory>${project.basedir}/src/main/resources</directory>
                <!-- 是否开启过滤替换配置,默认是不开启的 -->
                <filtering>true</filtering>
                <!--需要被处理的文件列表-->
                <includes>
                    <include>**/jdbc.properties</include>
                </includes>
                <!--排除需要被处理的资源文件列表-->
                <excludes>
                    <exclude>**/const.properties</exclude>
                </excludes>
            </resource>

上面使用includes列出需要被处理的,使用excludes排除需要被处理的资源文件列表,采用通配符的写法,**匹配任意深度的文件路径,*匹配任意个字符。

多个resource元素的使用案例
<resources>

     <!-- jdbc.properties 被复制到target下面,但是需要替换里面的内容 -->
    <resource>
        <!-- 指定资源文件的目录 -->
        <directory>${project.basedir}/src/main/resources</directory>
        <!-- 是否开启过滤替换配置,默认是不开启的 -->
        <filtering>true</filtering>
        <includes>
            <include>**/jdbc.properties</include>
        </includes>
    </resource>
    
    <!-- const.propertis只是被复制到target下面,但是不要去替换里面的内容 -->
    <resource>
        <directory>${project.basedir}/src/main/resources</directory>
        <includes>
            <include>**/const.properties</include>
        </includes>
    </resource>
</resources>
使用profiles处理多环境构建问题

maven支持让我们配置多套环境,每套环境中可以指定自己的maven属性,mvn命令对模块进行构建的时候可以通过-P参数来指定具体使用哪个环境的配置.

profiles元素支持定义多套环境的配置信息,配置如下用法:

<profiles>
    <profile>测试环境配置信息</profile>
    <profile>开发环境配置信息</profile>
    <profile>线上环境配置信息</profile>
    <profile>环境n配置信息</profile>
</profiles>

profiles中包含多个profile元素,每个profile可以表示一套环境,profile示例如下:

<profile>
    <id>dev</id>
    <properties>
        <jdbc.url>dev jdbc url</jdbc.url>
        <jdbc.username>dev jdbc username</jdbc.username>
        <jdbc.password>dev jdbc password</jdbc.password>
    </properties>
</profile>

id:表示这套环境的标识信息,properties可以定义环境中使用到的属性列表。
执行mvn命令编译的时候可以带上一个-P profileid来使用指定的环境进行构建。

指定环境进行构建

执行命令

mvn clean package  -Pdev

pom.xml 配置

<profiles>
    <!-- 开发环境使用的配置 -->
    <profile>
        <id>dev</id>
        <properties>
            <jdbc.url>dev jdbc url</jdbc.url>
            <jdbc.username>dev jdbc username</jdbc.username>
            <jdbc.password>dev jdbc password</jdbc.password>
        </properties>
    </profile>
    <!-- 测试环境使用的配置 -->
    <profile>
        <id>test</id>
        <properties>
            <jdbc.url>test jdbc url</jdbc.url>
            <jdbc.username>test jdbc username</jdbc.username>
            <jdbc.password>test jdbc password</jdbc.password>
        </properties>
    </profile>
    <!-- 线上环境使用的配置 -->
    <profile>
        <id>prod</id>
        <properties>
            <jdbc.url>test jdbc url</jdbc.url>
            <jdbc.username>test jdbc username</jdbc.username>
            <jdbc.password>test jdbc password</jdbc.password>
        </properties>
    </profile>
</profiles>

注意上面命令中多了一个-Pdev参数,-P后面跟的是pom.xmlprofile的id,表示需要使用那套环境进行构建。此时我们使用的是dev环境,即开发环境。

查看目前有哪些环境
mvn help:all-profiles
查看目前激活的是哪些环境
mvn help:active-profiles
b2b 项目多模块资源打包
mvn clean package -pl :b2b-account-service,:b2b-order-service -Pdev
profile元素更强大的功能

profile元素可以用于对不同环境的构建进行配置,project中包含的元素,在profile元素中基本上都有,所以profile可以定制更复杂的构建过程,不同的环境依赖的构件、插件、build过程、测试过程都是不一样的,这些都可以在profile中进行指定,也就是说不同的环境所有的东西都可以通过profile元素来进行个性化的设置.
在这里插入图片描述

参考

多环境构建
maven属性定义与使用
maven占位符的使用
Maven 整合 spring profile实现多环境自动切换
maven占位符官网文档
如何调试 Maven Plugin
maven插件开发官网文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值