Maven surefire环境变量不能在一台机器上运行

时间:2018-03-06 20:45:36

标签: java maven maven-surefire-plugin

背景:我们将当前项目版本设置为系统环境:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.19.1</version>
    <configuration>
        <forkMode>always</forkMode>
        <environmentVariables>
            <project.target>${project.build.outputDirectory}</project.target>
            <project.version>${project.version}</project.version>
        </environmentVariables>
    </configuration>
</plugin>

然后我们使用System.getenv("project.version");获得测试中的值,这在所有机器上都可以正常工作......除了一个。

问题机器是使用Ubuntu 16.04 LTS的新AWS EC2实例。设置和配置看起来不错。我检查了OpenJDK和OracleJDK,最新版本,我还检查了java和maven版本:

$ java -version
openjdk version "1.8.0_151"
OpenJDK Runtime Environment (build 1.8.0_151-8u151-b12-0ubuntu0.16.04.2-b12)
OpenJDK 64-Bit Server VM (build 25.151-b12, mixed mode)

行家

$ mvn -version
Apache Maven 3.3.9
Maven home: /usr/share/maven
Java version: 1.8.0_151, vendor: Oracle Corporation
Java home: /usr/lib/jvm/java-8-openjdk-amd64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "4.4.0-1049-aws", arch: "amd64", family: "unix"

和最新的可供下载:

$ mvn --version
Apache Maven 3.5.2 (138edd61fd100ec658bfa2d307c43b76940a5d7d; 2017-10-18T07:58:13Z)
Maven home: /usr/share/maven
Java version: 1.8.0_161, vendor: Oracle Corporation
Java home: /usr/lib/jvm/jdk1.8.0_161/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "4.4.0-1049-aws", arch: "amd64", family: "unix"

问题仍然存在。奇怪的是,启用了分叉(必需),日志条目显示正在设置变量:

[DEBUG] Setting environment variable [project.version]=[4.0.0-SNAPSHOT]

然后我们用forking进行测试执行:

[DEBUG] boot(compact) classpath:  surefire-booter-2.19.1.jar  surefire-api-2.19.1.jar  test-classes  classes  junit-4.10.jar  hamcrest-core-1.1.jar  …-4.0.0-SNAPSHOT.jar  surefire-junit4-2.19.1.jar

分叉命令行:/ bin / sh -c cd / mnt / ebsVolume /

然而System.getenv("project.version");返回null

3 个答案:

答案 0 :(得分:3)

我认为您需要使用 systemPropertyVariables 。请参阅文档here

    <systemPropertyVariables>
        <project.target>${project.build.outputDirectory}</project.target>
        <project.version>${project.version}</project.version>
    </systemPropertyVariables>

答案 1 :(得分:0)

将项目从Fedora移植到Linux Mint时,我遇到了同样的问题。我在Fedora,macOS,Windows 7和Windows 10上无休止地进行了相同的测试-从来没有任何问题。因此,令我惊讶的是,他们没有在bash命令行上执行mvn test。看到它们通过intellij测试运行程序通过时,甚至变得更加陌生。从intellij的Maven工具窗口运行test再次失败。

@ilooner的systemPropertyVariables approach可以工作,但是后来我不得不用系统属性替换环境变量,并使用System.getProperty()而不是System.getenv()。就我而言,这是不可能的。

设置始终是带有surefire插件3.0.0-M3的OpenJDK 11,junit5和Maven3.6.x。但这不是这里的问题。问题是变量的名称。我试图直接在外壳中定义它,以查看测试是否可以看到它,并且发生了这种情况:

$ export project.version=42
bash: export: `project.version=42': not a valid identifier

事实证明,由于bash 3,您无法定义包含.的环境变量!无论是cygwin,macOS还是Linux。如Allowed characters in Linux environment variable names中所述,您应该使用大写字母,数字和下划线。这似乎只是一个建议,并不适用于所有Shell,但是您永远都不知道您的应用将在哪里运行。

回到您的问题。如果您使用PROJECT_TARGET而不是project.target,则很可能会起作用。在我当前的设置中,它也可以与project_target一起使用,但这可能会在其他地方引起麻烦。

但是我没有答案,为什么surefire插件可以在Fedora 30,macOS Mojave和cygin上处理variables.with.dots,却不能在Mint 19.2或Ubuntu 18.4上处理。后两个使用bash 4.4,前两个使用bash 5.0。因此它可以连接到bash版本。 Windows允许点,因此似乎可以在其中工作。但是,仍然没有点测试environment.variables.with.dots,因为在某些系统中它们根本不存在。如果您想保持便携性,应该完全避免使用它们。

答案 2 :(得分:0)

可能不是所提出问题的答案,但是因为其他像我这样的用户正在阅读此线程,所以它可能仍然有用:我发现设置变量仅在尚未设置的情况下才有效(至少在Windows 10系统下) ),即在应用之前必须先用excludedEnvironmentVariables设置变量。示例:

  • FOOBAR已在环境中设置为C:\test.conf
  • surefire插件正在尝试将其设置为其他值:
    <environmentVariables>
        <FOOBAR>${project.build.directory}/test.conf</FOOBAR>
    </environmentVariables>
  • <excludedEnvironmentVariables>FOOBAR</excludedEnvironmentVariables>需要设置期望值,否则将使用环境中的那个。