无法从pom获取<systempropertyvariables>变量值</systempropertyvariables>

时间:2014-10-21 04:30:56

标签: java eclipse windows maven pom.xml

您好我正在开发一个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>

要尝试访问my.value变量,我使用的是以下Java代码。

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

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

有谁可以指出这里有什么问题?

提前致谢。

编辑:我也尝试在systemPropertyVariables下声明maven-failsafe-plugin,但没有任何变化。

注意:当我尝试按如下方式转换testdata代码行时,

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

我在上面的行中得到一个NullPointer异常。

编辑:很抱歉之前发布此答案..

我使用您提供的插件... /插件代码将其作为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

我正在尝试从pom.xml文件中检索URL,我写的条件是

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

所以,如果你能指出我错在哪里

3 个答案:

答案 0 :(得分:4)

maven-3.2.3 WindowsJDK 1.6.0_67

一起为我工作

使用maven-archetype-quickstart ...

创建了一个项目

添加了相关的pom行......将surefire example与上述问题中的特定行相结合。

<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

Here是github中的项目。

答案 1 :(得分:0)

您在Eclipse IDE的known limitation上偶然发现了这个问题(问题标记为eclipse)。

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

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

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

您有什么解决方案:

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

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

    • 它不是免费的
    • 学习新的IDE
  • 使用Eclipse外部的终端运行测试具有以下缺点:

    • 您会错过可加快故障排除速度的IDE功能
    • 您无法像在IDE中那样习惯进行调试

答案 2 :(得分:-2)

@Raghuram感谢您的帮助。

我找到了解决这个问题的方法。

在我的java文件中,在@Before注释中,我将变量的值设置如下

 System.setProperty("my.value","this value");

现在它的工作正常。

干杯。

注意:伙计们,我很抱歉发布另一个问题作为答案.. :(