我正在尝试将我们的一个系统从 java 8 移动到 java 9,并且大约三分之一在 java 8 中正常工作的单元测试失败并出现以下错误:
java.io.IOException: Can not attach to current VM
Run Code Online (Sandbox Code Playgroud)
Google 带我看了几页,我很快就明白在 Java 9 中,默认行为已更改,以防止附加到当前 VM 并返回到您需要将系统属性设置jdk.attach.allowAttachSelf为 true的旧方式。
在 IntelliJ 中设置时,测试工作正常。更改 build.gradle 以包含此内容时,同样有效:
test {
jvmArgs '-Djdk.attach.allowAttachSelf=true'
}
Run Code Online (Sandbox Code Playgroud)
但是,我更喜欢全局设置此设置,因此我不需要破解我的 build.gradle 和 IntelliJ。
我在 ubuntu 上运行 java 9 并更改/etc/profile.d/jdk.sh为包含以下内容:
export JDK_JAVA_OPTIONS="-Djdk.attach.allowAttachSelf=true"
Run Code Online (Sandbox Code Playgroud)
当运行我的 Gradle 构建时,我可以看到设置被拾取,因为我在构建输出中低于:
NOTE: Picked up JDK_JAVA_OPTIONS: -Djdk.attach.allowAttachSelf=true
Run Code Online (Sandbox Code Playgroud)
但是,测试不断失败,并出现相同的 IOException。
那么我做错了什么,我该如何解决?
预先感谢您的意见。
小智 3
我的测试正在使用 Surefire 插件运行,如果在 argline 中添加了所述 vm 参数,则测试开始工作。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.14.1</version>
<configuration>
<argLine>-Djdk.attach.allowAttachSelf=true </argLine>
</configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)