如何加载AttachProvider(attach.dll)动态(How to load Attac

2019-07-30 01:42发布

我使用com.sun.tools.attach从JDK的tools.jar ,它需要一个指定java.library.path ENV指向attach.dll在启动时正确instatiate提供商,如WindowsAttachProvider 。 对于一些原因,我需要动态加载捆绑的一个attach.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(在normall 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在启动?

Answer 1:

您正在使用的API使用调用LoadLibrary(字符串) 。 看来你不能成功地越俎代庖(因为它的成功)这通过调用更明确的负载(串)第一。

所以你必须在指定路径java.library.path

该系统属性设置一次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 );

顺便说一句,我会建议前等待您的自定义路径到现有路径,而不是取代它。



文章来源: How to load AttachProvider (attach.dll) dynamically
标签: java dll