在 maven java 项目中获取运行时激活的配置文件名称列表
Posted
技术标签:
【中文标题】在 maven java 项目中获取运行时激活的配置文件名称列表【英文标题】:Get list of activated profile name during run time in maven java project 【发布时间】:2016-04-05 12:23:34 【问题描述】:我需要能够使用在 JUnit 测试运行时激活的配置文件。 我想知道是否有任何方法可以做类似的事情:
String str = System.getProperty("activated.profile[0]");
或任何其他相对方式...
我意识到有一个选项可以使用 $project.profiles[0].id
bu,但不知何故它不起作用。
有什么想法吗?
【问题讨论】:
为什么在单元测试中需要关于配置文件的信息? 这听起来确实像一个典型的 XY 问题。您在这里真正想要达到什么目的? 我一直在使用不同类别的分析来运行 junit 测试套件。我需要确定运行的套件是否在 Sanity、回归、slowTests 等范围内,而我想通过以下方式从配置文件 id 中获取这个:System.getProperty(profiles).contains("Sanity")。我想避免在 pom 中使用属性,因为它会让我重复一些我不喜欢的行。 我认为没有一种简单而优雅的方法可以做到这一点。如果我在这里尝试有点创意,那么将一个特定文件(属性文件)作为测试资源,该文件将包含一个值(属性),可以在运行测试之前替换(资源替换) .每个配置文件都可以将属性值设置为对您有意义的值,然后您的测试代码可以在目标文件夹中查找此文件并读取此值。 我只是认为有一种简单的方法可以获取当前激活的个人资料的 Id。 【参考方案1】:我在 pom 文件中使用的其他情况:
<profiles>
<profile>
<id>a-profile-id</id>
<properties>
<flag>a-flag-value</flag>
</properties>
</profile>
</profiles>
在java中:
String flagValue = System.getenv("flag");
【讨论】:
【参考方案2】:当使用 surefire 运行单元测试时,它通常会生成一个新的 JVM 来运行测试,我们必须将信息传递给新的 JVM。这通常可以使用“systemPropertyVariables”标签来完成。
我能够使用快速入门 Java 项目来练习这个,我将它添加到 POM:
我声明了以下配置文件
<profiles>
<profile>
<id>special-profile1</id>
</profile>
<profile>
<id>special-profile2</id>
</profile>
</profiles>
这是确保配置:
<build>
<plugins>
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19</version>
<configuration>
<systemPropertyVariables>
<profileId>$project.activeProfiles[0].id</profileId>
</systemPropertyVariables>
</configuration>
</plugin>
...
</plugins>
</build>
在我的单元测试中,我添加了这个:
/**
* Rigourous Test :-)
*/
public void testApp()
System.out.println("Profile ID: " + System.getProperty("profileId"));
当调用没有配置文件的“测试”命令时(即使用mvn test
),我得到了这个:
我们使用了mvn -P special-profile2 test
,我知道了
这将传递第一个活动配置文件的名称。如果我们可能有多个活动配置文件,那么我们可能需要使用更多系统属性。
注意:我使用 Maven 3.1.1 对此进行了测试
【讨论】:
这与我正在寻找的非常接近。我可以:/** public void testApp() System.out.println("Profile ID:" + System.getProperty("project.activeProfile[0].id"));当我尝试这个时,从 intelij 运行它时它给了我一个 null 我认为您不能在单元测试中像这样引用projcect.activeProfile[0].id
。当测试执行时,它由一个新的 JVM 运行,该 JVM 由来自 maven 的 Surefire 测试插件启动。这个新的 JVM 看不到运行 maven 的父 JVM 中可见的内容。 (此外,要使用这样的表达式引用数据模型,需要一个表达式求值器,它仅在 maven 中可用)。 AFAIK,将事物传递给子 JVM 的唯一方法是使用 <systemPropertyVariables>
。以上是关于在 maven java 项目中获取运行时激活的配置文件名称列表的主要内容,如果未能解决你的问题,请参考以下文章