Java Attach API:UnsatisfiedLinkError

时间:2013-03-08 09:20:06

标签: java linux java-native-interface dynamic-linking jvmti

使用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类?

1 个答案:

答案 0 :(得分: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 \ _服务\ com.sun.tools.attach.spi.AttachProvider中配置的(通常此文件存在于tools.jar中)。它将搜索CLASSPATH以首次出现此资源文件,并从中读取AttachProvider实现类。

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