无法从 pom 获取<系统属性变量>变量值

2022-09-02 04:54:27

嗨,我正在开发一个java maven项目,其中我必须在pom.xml文件中定义一些变量。

我已经在我的pom.xml文件中定义了一个变量,如下所示。

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.16</version>
        <configuration>
            <includes>
                <include>**/*Test*.java</include>
                <include>**/*Tests*.java</include>
                <include>**/Test*.java</include>
            </includes>
            <systemPropertyVariables>
                <my.value>NOTNULL</my.value>
            </systemPropertyVariables>
        </configuration>
    </plugin>

为了尝试访问该变量,我使用以下Java代码。my.value

    String testdata = System.getProperty("my.value");
    System.out.println(testdata);

但是,即使我设置了变量的值,控制台输出也始终显示我。null

谁能指出这里出了什么问题?

提前致谢。

编辑:我也尝试过声明下,但没有变化。systemPropertyVariablesmaven-failsafe-plugin

注意:当我尝试转换测试数据行代码时,如下所示,

   String testdata = System.getProperty("my.value").toString();

我在上面的行得到一个空点异常。

编辑:很抱歉之前将此作为答案发布。

我正在使用插件运行它作为JUnit测试.../插件代码,但这是我的控制台输出。

21 Oct 2014 12:36:56,973 main                                     INFO  s.MyClass                  - Default Implicit timeout set in Driver to: 100  
21 Oct 2014 12:36:56,973 main                                     INFO  s.MyClass                  - Default URL for server is set to: http://localhost:8080
 ---- null

URL是我试图从pom.xml文件中检索的内容,我编写的条件是

如果变量中的值为空,则以 ${ 开头,则返回 localhost:8080 否则返回 url。

所以如果你能指出我在这里出了什么问题


答案 1

为我工作与 on 与maven-3.2.3WindowsJDK 1.6.0_67

创建了一个项目...maven-archetype-quickstart

添加了相关的绒球线...将 surefire 示例与上述问题中的特定行相结合。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.16</version>
    <configuration>
      <systemPropertyVariables>
        <my.value>NOTNULL</my.value>
        <buildDirectory>${project.build.directory}</buildDirectory>
      </systemPropertyVariables>
    </configuration>
  </plugin>

AppTest 中的相关行.java

/**
 * Rigourous Test :-)
 */
public void testApp()
{
    System.out.println(System.getProperty("my.value"));
    System.out.println(System.getProperty("buildDirectory"));
    assertTrue( true );
}

相关输出mvn test

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running com.mycompany.app.AppTest
NOTNULL
C:\Users\raghu\Documents\GitHub\mvn-examples\test-properties\target
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.003 sec - in c
om.mycompany.app.AppTest

这是github中的项目。


答案 2

您偶然发现了 Eclipse IDE 的一个已知限制(该问题标记为 )。eclipse

虽然 Eclipse 外部的命令的工作方式类似于 Eclipse IDE 中的“Maven test”运行配置,但“JUnit Test”运行配置是 Eclipse IDE 运行测试代码的完全不同的部分。而JUnit Eclipse集成(至少到我正在运行的JUnit版本4)没有与M2Eclipse插件(将Maven功能带入Eclipse的插件)集成。因此,Eclipse 中的 JUnit 功能不知道 Maven 的功能,反之亦然。因此:mvn test

  • 您无法在 JUnit 测试结果视图中看到结果Maven test
  • JUnit 不会读取您的 Maven 配置文件或任何其他特定于 Maven 的配置(如 surefire 配置)systemPropertyVariables

在@Raghuram的答案中,他之所以成功,是因为他正在运行(在Eclipse之外)或“Maven test”(在Eclipse内部)。如果他还使用 JUnit Eclipse 集成运行测试代码,他也将获得这些属性的值。mvn testnull

您有什么解决方案:

  • 正如@Raghuram的答案所指出的,使用Maven运行具有以下缺点的测试:

    • 您无法轻松地从ui运行单个测试或一组测试;您必须编辑Maven运行配置并在其中提供测试过滤参数。我想你会比在Eclipse外部使用终端更快
    • 您不会在JUnit视图中看到“Maven测试”结果(它本身具有一些方便的功能)
  • 使用另一个IDE(如InteliJ IDEA),具有以下缺点:

    • 它不是免费的
    • 学习新的 IDE
  • 使用 Eclipse 外部的终端来运行测试,但存在以下缺点:

    • 你会想念你 IDE 功能,加快故障排除
    • 您无法像在 IDE 中习惯的那样进行调试

推荐