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 插件似乎甚至没有警告您某些环境变量的名称语法不正确。希望对你有帮助,祝你有个愉快的一天!
背景:我们正在将当前项目版本设置为系统环境:
<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 插件似乎甚至没有警告您某些环境变量的名称语法不正确。希望对你有帮助,祝你有个愉快的一天!