如何让Maven读取指定路径的.env文件并设置测试环境变量?
实现方案
下面提供三种不同的实现方式,可根据你的需求选择:
方法一:用Maven Surefire插件直接配置(适合少量变量)
如果你的.env是简单键值对格式(和.properties兼容),可以通过Surefire插件直接加载文件并映射为测试环境变量:
在pom.xml的<build>节点下添加插件配置:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.2.5</version> <configuration> <!-- 加载指定路径的.env文件作为属性源 --> <systemPropertiesFile>/tmp/.env</systemPropertiesFile> <!-- 将需要的变量映射为测试环境变量 --> <environmentVariables> <SOME_PROPERTY_I_NEED_IN_MY_UNIT_TESTS>${SOME_PROPERTY_I_NEED_IN_MY_UNIT_TESTS}</SOME_PROPERTY_I_NEED_IN_MY_UNIT_TESTS> </environmentVariables> </configuration> </plugin>
如果有多个变量,只需在<environmentVariables>里逐个添加映射即可。
方法二:用maven-environment-plugin自动加载(适合多变量场景)
这个插件可以自动解析.env文件并批量注入环境变量,无需手动映射每个变量:
在pom.xml的<build>节点下添加插件:
<plugin> <groupId>com.github.goldin</groupId> <artifactId>maven-environment-plugin</artifactId> <version>0.9.0</version> <executions> <execution> <!-- 仅在测试资源处理阶段执行,不干扰生产构建 --> <phase>process-test-resources</phase> <goals> <goal>env</goal> </goals> </execution> </executions> <configuration> <!-- 指定.env文件的绝对路径 --> <file>/tmp/.env</file> <!-- 开启变量导出到环境变量 --> <export>true</export> <!-- 跳过非测试阶段的执行 --> <skip>!${maven.test.skip}</skip> </configuration> </plugin>
Surefire插件默认会继承Maven进程的环境变量,所以插件注入的变量会自动传递给单元测试。
方法三:测试代码手动加载(无Maven插件依赖)
如果不想依赖Maven插件,可以在测试基类中手动读取.env文件并设置JVM系统属性(大部分单元测试用此方式即可满足需求):
import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.Properties; import org.junit.jupiter.api.BeforeAll; public class BaseTest { @BeforeAll public static void loadEnvFile() throws IOException { File envFile = new File("/tmp/.env"); if (!envFile.exists()) { return; } Properties envProps = new Properties(); envProps.load(new FileInputStream(envFile)); // 将.env中的键值对设置为JVM系统属性 envProps.forEach((key, value) -> System.setProperty(key.toString(), value.toString()) ); } }
所有测试类继承这个BaseTest即可自动加载环境变量。如果需要设置真实系统环境变量(而非JVM属性),可以通过反射实现,但这种方式受JVM安全策略限制,一般不推荐。
注意事项
- 确保Maven进程有权限读取指定路径的
.env文件,避免权限报错。 - 方法二中的插件版本可根据Maven中央仓库的最新版本调整。
- 所有方案仅作用于单元测试阶段,生产构建或运行时不会加载
.env文件。
内容的提问来源于stack exchange,提问作者mikeb
相关产品推荐
相关产品推荐

