在 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),我得到了这个:

-------------------------------------------------- ----- T E S T S -------------------------------------------------- ----- 运行 com.fxs.AppTest 个人资料 ID:开发 测试运行:1,失败:0,错误:0,跳过:0,经过时间:0.003 秒 - 在 com.fxs.AppTest 结果 : 测试运行:1,失败:0,错误:0,跳过:0

我们使用了mvn -P special-profile2 test,我知道了

-------------------------------------------------- ----- T E S T S -------------------------------------------------- ----- 运行 com.fxs.AppTest 配置文件 ID:special-profile2 测试运行:1,失败:0,错误:0,跳过:0,经过时间:0.002 秒 - 在 com.fxs.AppTest 结果 : 测试运行:1,失败:0,错误:0,跳过:0

这将传递第一个活动配置文件的名称。如果我们可能有多个活动配置文件,那么我们可能需要使用更多系统属性。

注意:我使用 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 的唯一方法是使用 &lt;systemPropertyVariables&gt;

以上是关于在 maven java 项目中获取运行时激活的配置文件名称列表的主要内容,如果未能解决你的问题,请参考以下文章

运行 Maven 集成测试时获取“在分支目标处期望堆栈图帧”

java开发工具学习计划

Maven:自定义 web-app 项目的 web.xml

SpringBoot 添加本地 jar 文件

求教java maven项目打包引入的问题,求大神解答

获取Maven插件中的Java文件列表