加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

如何动态加载AttachProvider(attach.dll)

发布时间:2020-12-14 01:55:54 所属栏目:Windows 来源:网络整理
导读:我正在使用jdk的tools.jar中的com.sun.tools.attach,它需要一个指定的 java.library.path env,指向启动时的attach.dll以正确设置提供程序,如 WindowsAttachProvider.由于某些原因,我需要动态加载捆绑的attach.dll之一.我试着用这样的东西: public static vo
我正在使用jdk的tools.jar中的com.sun.tools.attach,它需要一个指定的 java.library.path env,指向启动时的attach.dll以正确设置提供程序,如 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?

解决方法

你正在使用的API是使用 loadLibrary(String).看起来你不能通过首先调用更明确的 load(String)来成功抢占(使其成功).

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

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

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

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

例如,见here:

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读