背景:我们将当前项目版本设置为系统环境:
<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
答案 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
<environmentVariables>
<FOOBAR>${project.build.directory}/test.conf</FOOBAR>
</environmentVariables>
<excludedEnvironmentVariables>FOOBAR</excludedEnvironmentVariables>
需要设置期望值,否则将使用环境中的那个。