5

我正在使用com.sun.tools.attachjdk ,它需要在启动时指向tools.jar一个指定的env才能正确地设置提供程序,例如. 由于某些原因,我需要动态加载其中一个 bundled 。我尝试使用这样的一些:java.library.pathattach.dllWindowsAttachProviderattach.dll

public static void main(String[] args) throws Exception {
    Path bin = Paths.get(System.getProperty("user.dir"),"bin").toAbsolutePath();
    switch (System.getProperty("os.arch")) {
        case "amd64":
            bin = bin.resolve("win64");
            break;
        default:
            bin = bin.resolve("win32");
    }
    // Dynamic setting of java.library.path only seems not sufficient
    System.setProperty("java.library.path", System.getProperty("java.library.path") + File.pathSeparator + bin.toString());
    // So I try to manual loading attach.dll. This is not sufficient too.
    System.load(bin.resolve("attach.dll").toString());
    // I'm using com.sun.tools.attach in my app
    new myApp();
}

如果我用 jdk 运行它(在正常的 jre 中),它会向我报告:

java.util.ServiceConfigurationError: com.sun.tools.attach.spi.AttachProvider:
Provider sun.tools.attach.WindowsAttachProvider could not be instantiated:
java.lang.UnsatisfiedLinkError: no attach in java.library.path
Exception in thread "main" com.sun.tools.attach.AttachNotSupportedException:
no providers installed
    at com.sun.tools.attach.VirtualMachine.attach(...

如何安装附加提供程序而不指定在启动-Djava.library.path时指向attach.dll

4

1 回答 1

6

您正在使用的 API 正在使用loadLibrary(String)看来您无法通过首先调用更明确的load(String)来成功地先发制人(使其成功)。

所以你必须在java.library.path.

该 System 属性在 JVM 生命周期的早期设置一次,并且不能通过标准方式进行修改。

java.library.path因此,传统的解决方案是在启动 JVM 时传递一个适当的。

或者,您可以查看在 JVM 启动后使用反射更改此属性的技巧。我没有尝试过这些。

例如,请参见此处

System.setProperty( "java.library.path", "/path/to/libs" );

Field fieldSysPath = ClassLoader.class.getDeclaredField( "sys_paths" );
fieldSysPath.setAccessible( true );
fieldSysPath.set( null, null );

顺便说一句,我建议将您的自定义路径预先挂在现有路径中,而不是替换它。

于 2012-06-21T09:24:39.827 回答