Maven环境配置你都知道了吗?

1.Maven属性

  1. 自定义属性
<properties>
    <spring.verion>5.2.1.RELEASE</spring.verion>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring.verion}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>${spring.verion}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>${spring.verion}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>${spring.verion}</version>
    </dependency>
</dependencies>
  1. 内置属性
${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}
${basedir} 项目路径
  1. Settings属性
// ${父标签.子标签}
${settings.localRepository}
  1. java系统属性
// 查看命令
mvn help:system
  1. 环境变量属性
// 所有的环境变量都可以使用env.开头的方式来进行引用,如:
${env.JAVA_HOME}
  1. 实操

pom中输入

<properties>
        <!-- 项目的主源码目录,默认为src/main/java/ -->
        <a>${project.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>

到项目根目录执行如下命令

mvn help:effective-pom -pl :maven-nexu-test > finally.xml

项目根目录会出现一个 finally.xml 内容如下(注意 : maven-nexu-test 改为自己的项目名)

  <properties>
    <a>C:\Users\LENOVO\Desktop\apache-tomcat-8.5.56-src\maven-nexu-test\src\main\java</a>
    <a1>${settings.localRepository}</a1>
    <a2>C:\Users\LENOVO</a2>
    <a3>C:\JDK\Java\jdk1.8.0_202</a3>
    <b>C:\Users\LENOVO\Desktop\apache-tomcat-8.5.56-src\maven-nexu-test\src\test\java</b>
    <c>C:\Users\LENOVO\Desktop\apache-tomcat-8.5.56-src\maven-nexu-test\target</c>
    <d>C:\Users\LENOVO\Desktop\apache-tomcat-8.5.56-src\maven-nexu-test\target\classes</d>
    <e>C:\Users\LENOVO\Desktop\apache-tomcat-8.5.56-src\maven-nexu-test\target\test-classes</e>
    <f>com.wang</f>
    <g>maven-nexu-test</g>
    <h>1.0</h>
    <i>maven-nexu-test-1.0</i>
    <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

2.Maven多环境

抛出问题:

我们写的项目会操作数据库,所以我们需要一个配置文件来放数据库的配置信息,配置文件一般都放在src/main/resources中,在这个目录中新建一个jdbc.properties文件

上面jdbc的配置的是开发库的db信息,打包之后生成的jar中也是上面开发环境的配置,那么上测试环境是不是我们需要修改上面的配置,最终上线的时候,上面的配置是不是又得重新修改一次,相当痛苦的。

我们能不能写3套环境的jdbc配置,打包的时候去指定具体使用那套配置?

还是你们聪明,maven支持这么做,pom.xml的project元素下面提供了一个profiles元素可以用来对多套环境进行配置。

maven中设置 maven-resources-plugin:2.6插件复制 resources资源文件时的编码格式
<properties>
    <encoding>UTF-8</encoding>
</properties>
设置资源文件内容动态替换

资源文件中可以通过${maven属性}来引用maven属性中的值,打包的过程中这些会被替换掉,替换的过程默认是不开启的,需要手动开启配置

<build>
    <resources>
        <resource>
            <!-- 指定资源文件的目录 -->
            <directory>${project.basedir}/src/main/resources</directory>
            <!-- 是否开启过滤替换配置,默认是不开启的 -->
            <filtering>true</filtering>
        </resource>
    </resources>
    <testResources>
        <testResource>
            <!-- 指定资源文件的目录 -->
            <directory>${project.basedir}/src/test/resources</directory>
            <!-- 是否开启过滤替换配置,默认是不开启的 -->
            <filtering>true</filtering>
        </testResource>
    </testResources>
</build>
自定义替换的分隔符
// 配置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>
指定需要替换的资源文件
// 指定resources那些文件会被复制
<resources>
    <resource>
        <!-- 指定资源文件的目录 -->
        <directory>${project.basedir}/src/main/resources</directory>
        <!-- 是否开启过滤替换配置,默认是不开启的 -->
        <filtering>true</filtering>
        <includes>
            <include>**/jdbc.properties</include>
        </includes>
        <excludes>
            <exclude>**/const.properties</exclude>
        </excludes>
    </resource>
</resources>

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

使用profiles处理多环境构建问题
    <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>

输入如下命令指定环境

mvn clean package -pl :maven-nexu-test -Pdev

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

开启默认环境配置
<profile>
    <id>dev</id>
    <activation>
        <activeByDefault>true</activeByDefault>
    </activation>
    <properties>
        <jdbc.url>dev jdbc url</jdbc.url>
        <jdbc.username>dev jdbc username</jdbc.username>
        <jdbc.password>dev jdbc password</jdbc.password>
    </properties>
</profile>

没有指定环境时默认是dev

通过maven属性来控制环境的开启(自定义属性)
<!-- 配置多套环境 -->
<profiles>
    <!-- 开发环境使用的配置 -->
    <profile>
        <id>dev</id>
        <activation>
            <activeByDefault>true</activeByDefault>
            <!-- 构建时指定该命令可激活此环境 -->
            <property>
                <name>env</name>
                <value>env_dev</value>
            </property>
        </activation>
        <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>
        <activation>
            <property>
                <name>env</name>
                <value>env_test</value>
            </property>
        </activation>
        <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>
        <activation>
            <property>
                <name>env</name>
                <value>env_prod</value>
            </property>
        </activation>
        <properties>
            <jdbc.url>prod jdbc url</jdbc.url>
            <jdbc.username>prod jdbc username</jdbc.username>
            <jdbc.password>prod jdbc password</jdbc.password>
        </properties>
    </profile>
</profiles>

输入命令

mvn clean package -pl :项目名 -Denv=env_prod
启动的时候指定多个环境
mvn clean package -pl :项目名称 -Pdev,test,prod

可以在-P参数后跟多个环境的id,多个之间用逗号隔开,当使用多套环境的时候,多套环境中的maven属性会进行合并,如果多套环境中属性有一样的,后面的会覆盖前面的。

查看目前有哪些环境
mvn help:all-profiles
// 当前激活的环境
mvn help:active-profiles
配置分散问题

背景:父模块b2b下存在两个子模块b2b-account-service ,b2b-order-service
两个子模块都有各自不同环境的数据库配置,dev test prod 这样数据库配置存在6份如果更多的模块数据库配置将增加。

解决方案:将数据库配置统一放到b2b中给子模块引用

实现步骤:
b2b中创建3个(dev test prod)如下文件

b2b/config/dev.properties

# b2b-account-service jdbc配置信息
b2b-account-service.jdbc.url=dev_account_jdbc_url
b2b-account-service.jdbc.username=dev_account_jdbc_username
b2b-account-service.jdbc.password=dev_account_jdbc_password

# b2b-order-service jdbc配置信息
b2b-order-service.jdbc.url=dev_order_jdbc_url
b2b-order-service.jdbc.username=dev_order_jdbc_username
b2b-order-service.jdbc.password=dev_order_jdbc_password

b2b/config/test.properties

# b2b-account-service jdbc配置信息
b2b-account-service.jdbc.url=test_account_jdbc_url
b2b-account-service.jdbc.username=test_account_jdbc_username
b2b-account-service.jdbc.password=test_account_jdbc_password

# b2b-order-service jdbc配置信息
b2b-order-service.jdbc.url=test_order_jdbc_url
b2b-order-service.jdbc.username=test_order_jdbc_username
b2b-order-service.jdbc.password=test_order_jdbc_password

b2b/config/prod.properties

# b2b-account-service jdbc配置信息
b2b-account-service.jdbc.url=prod_account_jdbc_url
b2b-account-service.jdbc.username=prod_account_jdbc_username
b2b-account-service.jdbc.password=prod_account_jdbc_password

# b2b-order-service jdbc配置信息
b2b-order-service.jdbc.url=prod_order_jdbc_url
b2b-order-service.jdbc.username=prod_order_jdbc_username
b2b-order-service.jdbc.password=prod_order_jdbc_password

b2b-account-service 增加配置文件jdbc.properties:

jdbc.url=${b2b-account-service.jdbc.url}
jdbc.username=${b2b-account-service.jdbc.username}
jdbc.password=${b2b-account-service.jdbc.password}

b2b-order-service 增加配置文件jdbc.properties:

jdbc.url=${b2b-order-service.jdbc.url}
jdbc.username=${b2b-order-service.jdbc.username}
jdbc.password=${b2b-order-service.jdbc.password}

b2b-account/pom.xml内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<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>com.javacode2018</groupId>
    <artifactId>b2b-account-service</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>com.javacode2018</groupId>
            <artifactId>b2b-account-api</artifactId>
            <version>${project.version}</version>
        </dependency>
    </dependencies>

    <properties>
        <!-- 指定资源文件复制过程中采用的编码方式 -->
        <encoding>UTF-8</encoding>
    </properties>

    <!-- 配置多套环境 -->
    <profiles>
        <!-- 开发环境使用的配置 -->
        <profile>
            <id>dev</id>
            <activation>
                <activeByDefault>true</activeByDefault>
                <property>
                    <name>env</name>
                    <value>env_dev</value>
                </property>
            </activation>
            <build>
                <filters>
                    <filter>../../config/dev.properties</filter>
                </filters>
            </build>
        </profile>
        <!-- 测试环境使用的配置 -->
        <profile>
            <id>test</id>
            <activation>
                <property>
                    <name>env</name>
                    <value>env_test</value>
                </property>
            </activation>
            <build>
                <filters>
                    <filter>../../config/test.properties</filter>
                </filters>
            </build>
        </profile>
        <!-- 线上环境使用的配置 -->
        <profile>
            <id>prod</id>
            <activation>
                <property>
                    <name>env</name>
                    <value>env_prod</value>
                </property>
            </activation>
            <build>
                <filters>
                    <filter>../../config/prod.properties</filter>
                </filters>
            </build>
        </profile>
    </profiles>

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

</project>

b2b-order/pom.xml内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<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>com.javacode2018</groupId>
    <artifactId>b2b-order-service</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>b2b-account-api</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>b2b-order-api</artifactId>
            <version>${project.version}</version>
        </dependency>
    </dependencies>

    <properties>
        <!-- 指定资源文件复制过程中采用的编码方式 -->
        <encoding>UTF-8</encoding>
    </properties>

    <!-- 配置多套环境 -->
    <profiles>
        <!-- 开发环境使用的配置 -->
        <profile>
            <id>dev</id>
            <activation>
                <activeByDefault>true</activeByDefault>
                <property>
                    <name>env</name>
                    <value>env_dev</value>
                </property>
            </activation>
            <build>
                <filters>
                    <filter>../../config/dev.properties</filter>
                </filters>
            </build>
        </profile>
        <!-- 测试环境使用的配置 -->
        <profile>
            <id>test</id>
            <activation>
                <property>
                    <name>env</name>
                    <value>env_test</value>
                </property>
            </activation>
            <build>
                <filters>
                    <filter>../../config/test.properties</filter>
                </filters>
            </build>
        </profile>
        <!-- 线上环境使用的配置 -->
        <profile>
            <id>prod</id>
            <activation>
                <property>
                    <name>env</name>
                    <value>env_prod</value>
                </property>
            </activation>
            <build>
                <filters>
                    <filter>../../config/prod.properties</filter>
                </filters>
            </build>
        </profile>
    </profiles>

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

</project>

执行命令

mvn clean package -pl :b2b-account-service,:b2b-order-service -Pdev
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值