【问题标题】:how to set jdk.attach.allowAttachSelf=true globally如何全局设置 jdk.attach.allowAttachSelf=true
【发布时间】:2018-11-03 00:25:28
【问题描述】:

我正在尝试将我们的一个系统从 java 8 迁移到 java 9,并且在 java 8 中运行正常的单元测试中约有三分之一失败并出现以下错误:

java.io.IOException: Can not attach to current VM

Google 带我看了几页,我很快就明白,在 java 9 中,默认行为已更改,以防止附加到当前 VM,并返回到您需要将系统属性 jdk.attach.allowAttachSelf 设置为 true 的旧方式.

在 IntelliJ 中设置此项时,测试工作正常。将 build.gradle 更改为包含以下内容时同样有效:

test {
    jvmArgs '-Djdk.attach.allowAttachSelf=true'
}

但是,我宁愿在全局范围内使用此设置,这样我就不需要破解我的 build.gradle 和 IntelliJ。

我在 ubuntu 上运行 java 9,我更改了 /etc/profile.d/jdk.sh 以包含以下内容:

export JDK_JAVA_OPTIONS="-Djdk.attach.allowAttachSelf=true"

运行我的 Gradle 构建时,我可以看到设置被拾取,因为我在构建输出中低于:

NOTE: Picked up JDK_JAVA_OPTIONS: -Djdk.attach.allowAttachSelf=true

但是,测试不断失败并出现相同的 IOException。

那么我做错了什么,我应该如何解决它?

提前感谢您的意见。

【问题讨论】:

  • 难以置信。 2 年,甚至无法从官方消息中理解。
  • 如果有人仍然有这个问题,请确保您使用--no-daemon 进行测试,因为未设置JDK_JAVA_OPTIONS 时可能已经启动了守护进程。

标签: java java-9


【解决方案1】:

我在构建 gradle 项目时遇到了同样的问题。很多虚拟机绑定问题。添加

JDK_JAVA_OPTIONS=-Djdk.attach.allowAttachSelf=true

在环境变量的“修改配置”窗格中确实解决了这个问题。但是,向“VM 选项”添加任何内容都无济于事。

【讨论】:

    【解决方案2】:

    我的测试是使用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>
    

    【讨论】:

      猜你喜欢
      • 2013-06-29
      • 2011-07-09
      • 1970-01-01
      • 2013-04-22
      • 1970-01-01
      • 1970-01-01
      • 2022-10-23
      • 2015-01-09
      • 1970-01-01
      相关资源
      最近更新 更多