AttachNotSupportedException: 未安装Java代理程序提供程序

4

我遇到了将我的Java应用程序附加到远程Java虚拟机的问题。 我在Windows 7上使用Java 8u45,我的附加代码非常简单。

import java.io.IOException;
import java.util.List;
import java.util.Scanner;

import com.sun.tools.attach.AttachNotSupportedException;
import com.sun.tools.attach.VirtualMachine;
import com.sun.tools.attach.VirtualMachineDescriptor;
import com.sun.tools.attach.spi.AttachProvider;

public class AgentLoader
{
    public static void main(String[] args)
    {
        Scanner s = new Scanner(System.in);
        String pid = s.next();

        try
        {
            VirtualMachine vm = VirtualMachine.attach(pid);
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
        }
    }
}

当调用attach时,我遇到了AttachNotSupportedException错误,并且提示没有安装提供程序。 我查看了一些网上的答案,发现有几个解决方案对我无效。 例如,确保在同一台机器上不要混合使用几个Java版本。 将PATH变量设置为指向位于%JAVA_HOME%\jre\bin中的attach.dll库等。 但是这些都没有对我起作用。 你有什么想法是问题所在吗? 谢谢。

你所说的远程是指同一台机器上的还是不同的机器? - Akash Yadav
在同一台机器上但不同的Java进程中 - stylo
并且您正在传递正在运行的进程的正确PID,我尝试了相同的代码并传递了正在运行的Eclipse的pid,我可以看到它被附加。 - Akash Yadav
是的,进程 ID 与所需进程相同。请记住,我不想将其附加到自己的进程(从 Eclipse 运行),而是要附加到另一个 Java 进程。 - stylo
我已经发现,只有在使用Eclipse调试进程时才会出现问题。 - stylo
显示剩余3条评论
2个回答

1

将您的IDE的jre依赖项从jre更改为jdk。 对于eclipse,选择 Window -> Preferences -> Java -> Installed JREs,将 jre 替换为 jdk。


1

包含以下代码行,它应该可以工作。它需要attach.dll文件才能工作。

static
{
   System.loadLibrary("attach");
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接