如何全局设置 jdk.attach.allowAttachSelf=true

Jul*_*ian 19 java java-9

我正在尝试将我们的一个系统从 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)