gpt4 book ai didi

java - 无法实例化 sun.tools.attach.WindowsAttachProvider

转载 作者:行者123 更新时间:2023-12-05 03:59:37 25 4
gpt4 key购买 nike

我目前正在编写一个将代理附加到 JVM 进程的附加器,但我一直遇到这个问题。这是我的代码的简化版本:

import com.sun.tools.attach.VirtualMachine;

public class AgentAttacher {
public static void main(String[] args) {
try {
String pid = "some-pid-determined-elsewhere";
final VirtualMachine vm = VirtualMachine.attach(pid);
vm.loadAgent("agent.jar");
vm.detach();
} catch (Exception e) {
e.printStackTrace();
}
}
}

运行 java -jar AgentAttacher.jar 时,出现以下错误:

java.util.ServiceConfigurationError: com.sun.tools.attach.spi.AttachProvider: Provider sun.tools.attach.WindowsAttachProvider could not be instantiated

我尝试将我的 JDK 的 lib 目录中的 tools.jar 添加到 CLASSPATH 环境变量中,将其包含在 Class-Path 在我的 MANIFEST.MF 中,并在运行 JAR 时使用 -cp 直接指定它。我相当确定 tools.jar 正在加载,因为它在丢失时会给出不同的错误:

Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/tools/attach/VirtualMachine

我在仅使用 VirtualMachine.list() 时也遇到了 WindowsAttachProvider could not be instantiated 错误,所以我认为这与使用 attach() 使用不正确的 PID。


我尝试使用 Class.forName() 加载类:

public class AgentAttacher {
public static void main(String[] args) {
try {
Class.forName("sun.tools.attach.WindowsAttachProvider");
} catch (Exception e) {
e.printStackTrace();
}
}
}

我得到以下堆栈跟踪:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no attach in java.library.path
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
at sun.tools.attach.WindowsAttachProvider.<clinit>(WindowsAttachProvider.java:175)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at JavaAttacker.main(JavaAttacker.java:4)

如果我不在类路径中包含 tools.jar,我会在这里得到不同的堆栈跟踪,所以我确定它正在加载:

java.lang.ClassNotFoundException: sun.tools.attach.WindowsAttachProvider
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at JavaAttacker.main(JavaAttacker.java:4)

我的环境是带有 JDK 和 JRE 1.8.0_212 的 VirtualBox 上的 Windows 10 Pro (1809) VM。

最佳答案

看来问题出在 attach.dll 没有从 %JAVA_HOME%\jre\bin 加载。

运行 jar 为:

java -Djava.library.path="%JAVA_HOME%\jre\bin" -jar AgentAttacher.jar

似乎有效,只要在 Class-Path 下的我的 jar list 中指定了 tools.jar

关于java - 无法实例化 sun.tools.attach.WindowsAttachProvider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57006881/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com