6

使用 时Java Attach API,我仅在Linux上收到以下链接错误(在不同的机器上尝试过):

Exception in thread "main" java.lang.UnsatisfiedLinkError: sun.tools.attach.WindowsAttachProvider.tempPath()Ljava/lang/String;
        at sun.tools.attach.WindowsAttachProvider.tempPath(Native Method)
        at sun.tools.attach.WindowsAttachProvider.isTempPathSecure(WindowsAttachProvider.java:74)
        at sun.tools.attach.WindowsAttachProvider.listVirtualMachines(WindowsAttachProvider.java:58)
        at com.sun.tools.attach.VirtualMachine.list(VirtualMachine.java:134)
        at sun.tools.jconsole.LocalVirtualMachine.getAttachableVMs(LocalVirtualMachine.java:151)
        at sun.tools.jconsole.LocalVirtualMachine.getAllVirtualMachines(LocalVirtualMachine.java:110)
        ...

有趣的是,在Solaris 和 Windows 上,它开箱即用。

我尝试了几种指定java.library.path指向包含libattach.so但没有运气的目录的组合。

这里有什么问题?

还有一个额外的问题
有没有办法查看哪个本机库实际上绑定到了 java 类?

4

1 回答 1

6

在不同的平台上使用不同的 AttachProvider。在 Linux 上,它不应该使用 sun.tools.attach.WindowsAttachProvider。它适用于 Windows。

[solaris] sun.tools.attach.SolarisAttachProvider
[windows] sun.tools.attach.WindowsAttachProvider
[linux]   sun.tools.attach.LinuxAttachProvider

这是在资源文件 META-INF\services\com.sun.tools.attach.spi.AttachProvider 中配置的(通常该文件存在于 tools.jar 中)。它将搜索 CLASSPATH 以获取此资源文件的第一次出现并从中读取 AttachProvider 实现类。

因此,您可以通过在 CLASSPATH 中搜索 sun.tools.attach.WindowsAttachProvider 来解决此问题。可能您已经包含了来自 Windows 的 tools.jar。

于 2013-03-08T10:48:39.070 回答