【问题标题】:Maven surefire environmentVariables doesn't work on one machineMaven surefire environmentVariables 在一台机器上不起作用
【发布时间】:2018-03-06 20:45:36
【问题描述】:

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

<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"); 返回 null

【问题讨论】:

    标签: java maven maven-surefire-plugin


    【解决方案1】:

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

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

    【讨论】:

    • 好的,我将其标记为已接受的解决方案,因为它解决了我的问题,但是我认为仍然可以使用 environmentVariables 并且它们应该可以工作——Maven 中的一个错误?跨度>
    【解决方案2】:

    我刚刚将一个项目从 Fedora 转移到 Linux Mint 时遇到了同样的问题。我在 Fedora、macOS、Windows 7 和 Windows 10 上进行了无数次相同的测试——从来没有任何问题。因此,看到他们在 bash 命令行上执行 mvn test 失败,我感到非常惊讶。当使用 intellij 测试运行程序执行时,看到它们通过,就更奇怪了。从 intellij 中的 maven 工具窗口运行 test 再次失败。

    @ilooner 的systemPropertyVariables approach 有效,但后来我不得不用系统属性替换环境变量并使用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 仍然没有意义,因为在某些系统中它们根本不存在。如果你想保持便携,你应该完全避免它们。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        • project.target --&gt; PROJECT_TARGET
        • project.version --&gt; PROJECT_VERSION

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-03-07
          • 2022-07-14
          • 2022-01-08
          • 1970-01-01
          • 2022-07-15
          • 1970-01-01
          • 2016-07-15
          相关资源
          最近更新 更多