使用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但没有运气的目录。

这是怎么了?
还有一个额外的问题:有没有办法查看哪个本地库实际上绑定(bind)到java类?

最佳答案

不同的平台上使用了不同的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。

10-02 02:42