Maven surefire environmentVariables 在一台机器上不起作用

Maven surefire environmentVariables doesn't work on one machine

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

<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]

然后我们用分叉进行测试执行:

[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"); returns null

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

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

我刚刚将一个项目从 Fedora 转移到 Linux Mint 时遇到了同样的问题。我 运行 在 Fedora、macOS、Windows 7 和 Windows 10 上进行了无数次相同的测试——从来没有任何问题。所以我很惊讶地看到他们在 bash 命令行上执行 mvn test 失败。当使用 intellij test-运行ner 执行时,它甚至让 st运行ger 看到它们通过了。 运行 test 来自 intellij 中的 maven 工具 window 再次失败。

@ilooner 的 有效,但后来我不得不用系统属性替换环境变量并使用 System.getProperty() 而不是 System.getenv()。这对我来说是不可能的。

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

$ 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-plugin 在 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,因为在某些系统中它们根本不存在。如果你想保持便携,你应该完全避免使用它们。

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

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

unix进程的环境变量名称中不能包含某些特定字符。请参阅文档 here。很快,你的环境变量不遵守这个命名规则,maven 根本不会在 运行 你测试用例期间注册它们,你可以像这样更改名称:

  • project.target --> PROJECT_TARGET
  • project.version --> PROJECT_VERSION

它会起作用的。可悲的是,maven surefire 插件似乎甚至没有警告您某些环境变量的名称语法不正确。希望对你有帮助,祝你有个愉快的一天!