Maven进阶-多环境开发与跳过测试
一、多环境配置
1、简述
多环境开发的设置是为了能让 Maven 构建项目时,根据不同的环境采用不同的配置。
例如项目在开发时与项目上线时使用的数据库可能不是同一个数据库,我们可以把数据库的信息设置成两个环境,这样 maven 就会根据环境采用对应的配置
项目开发时通常会有三种环境:开发环境(env.development),生产环境(env.prodction),测试环境(env_test),之后的样例中也会以这三种环境为示例
2、设置不同的环境配置
多环境的设置在 profiles 标签内,其中包含若干个 profile 标签,每个 profile 对应一种环境,其中包含 id 属性,表示该环境的唯一标识。
profile 中可以设置此环境的各种配置,比如 properties(属性),dependencies(依赖),以及 modules,build 等等
下面以不同环境的数据库连接属性为例,配置了三种环境:
<profiles>
<profile>
<!-- 开发环境 -->
<id>env_development</id>
<properties>
<jdbc.url>jdbc:mysql://localhost:3306/db</jdbc.url>
<jdbc.username>root</jdbc.username>
<jdbc.password>123456</jdbc.password>
</properties>
</profile>
<profile>
<!-- 生产(正式)环境 -->
<id>env_production</id>
<properties>
<jdbc.url>jdbc:mysql://192.168.56.1:3306/db</jdbc.url>
<jdbc.username>root</jdbc.username>
<jdbc.password>147258369</jdbc.password>
</properties>
</profile>
<profile>
<!-- 测试环境 -->
<id>env_test</id>
<properties>
<jdbc.url>jdbc:mysql://192.168.56.1:3306/test_db</jdbc.url>
<jdbc.username>for-test</jdbc.username>
<jdbc.password>123456</jdbc.password>
</properties>
</profile>
</profiles>
如此配置之后,Maven 构建项目时就会采用对应环境的数据库连接属性,配合使用过滤资源文件,让资源文件能够引用环境中的属性,切换环境时就不用更改各种配置文件了,只需指定环境即可
二、环境的激活
引言
做好上面的多环境配置之后,此时我们构建项目,发现没有任何效果……
原因很简单,没有任何环境被激活,Maven 也就没有采用任何一个环境配置,接下来看一下激活环境的几种方法
1. 命令行激活
使用命令构建项目时,用 -P 来指定环境,如下:
mvn compile -P env_production
指定多个环境时用逗号分隔即可(不能有空格),如下:
mvn compile -P env_production,env_test
2. 设置默认环境
在 profile 中,activation 内设置 activeByDefault 属性为 true,该环境就被设为了默认环境,不指定环境时就会采用默认环境中的配置,如下例:
<profiles>
<profile>
<id>env_development</id>
<!-- 省略了环境配置 -->
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
</profiles>
将多个环境同时设为默认环境也是可以的,不指定环境时这些默认环境都会被激活
3. activation 根据条件自动激活
activation 激活环境的条件多种多样,可以按操作系统激活,也可以按 jdk 版本激活,按照系统参数激活,按照是否存在某个文件激活,等等
这些激活条件都是 Maven 自动检测并激活的,无需手动指定
下面是一个简单的示例
<profiles>
<profile>
<id>env_production</id>
<!-- 省略了环境配置 -->
<activation>
<jdk>1.8</jdk> <!-- jdk1.8 时激活 -->
<os>
<family>linux</family> <!-- 操作系统为 linux 时激活 -->
</os>
</activation>
</profile>
</profiles>
其他激活条件的设置可以参考这篇文章:Maven profile配置管理及激活profile的几种方式(非常非常详细)
补充
(1)激活的规则
我们可以将激活分为三类:命令行指定激活,activation 自动激活,activeByDefault 默认激活
指定激活与自动激活之间互不干扰,而只要有任何一个环境被指定或自动激活,默认激活就会失效
也就是说,只有当所有环境都未被激活时才会采用默认激活
(2)多个环境激活时的属性冲突
不同环境可以同时被激活,这些被激活的环境配置都会被采用
而不同的环境中可能对同一属性配置了不同的值,此时先声明的环境中的属性会被后声明的所覆盖,不同版本的依赖同理
三、跳过测试
引言
Maven 进行打包之前都需要先测试,比如 package 和 install 都包含了 test 环节,而 compile 不会 test(声明周期中 compile 在 test 之前)
但有的时候我们想跳过测试阶段直接打包,比如项目还没完全开发时,或者单纯想要快速打包时
接下来看一下跳过测试的几种方法
1. 命令行跳过测试
加入属性 -D skipTests 即可(skipTests 区分大小写)
mvn package -D skipTests
2. 配置测试插件
maven 测试用的插件是 maven-surefire-plugin,对这个插件进行配置
(1)直接跳过
设置 skip 属性为 true 即可,效果同命令行指令跳过
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
<configuration>
<!-- 跳过测试 -->
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
(2)引入与排除
利用 includes 和 excludes 将指定文件引入或排除,最终引入的文件会被测试执行,达到只对部分文件测试的效果
此时 skip 的值应该为 false,不能直接跳过测试阶段,否则这部分设置就没有意义了
和 resources 中一样,includes 和 excludes 可以单独使用也可以放在一起使用
没有 includes 标签时,默认引入 src/test 文件夹中所有文件
excludes 对已经引用的文件进行排除
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
<configuration>
<skip>false</skip>
<includes>
<include>**/Book*Test.java</include>
</includes>
<excludes>
<exclude>**/User*Test.java</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
3. IDEA 跳过测试
IDEA 的 Maven 面版中,有一个小闪电的按钮,点击之后可以看到声明周期中的 test 划了线
此时再点击 package 或者 install 就会跳过测试了
但这只是属于 IDEA 的设置,如果在命令行里输入命令打包,依然会进行测试