Java附加API:动态更改Java.library.path

Java附加API:动态更改Java.library.path,java,windows,jvm,Java,Windows,Jvm,在我的Windows计算机上使用com.sun.tools.attach API时,调用时出现以下错误 VirtualMachine.list() java.lang.UnsatifiedLink错误:java.library.path中没有附加 原因是缺少attach.dll。attach.dll位于$JRE/bin/中。使用-Djava.library.path=[attach.dll的目录]启动Java程序时,一切正常,输出无误 现在,我不想添加每个Java程序来启动这个丑陋的JVM参数

在我的Windows计算机上使用com.sun.tools.attach API时,调用时出现以下错误

VirtualMachine.list()
java.lang.UnsatifiedLink错误:java.library.path中没有附加

原因是缺少attach.dll。attach.dll位于
$JRE/bin/
中。使用
-Djava.library.path=[attach.dll的目录]
启动Java程序时,一切正常,输出无误

现在,我不想添加每个Java程序来启动这个丑陋的JVM参数。因此,我的问题是:

  • 我的机器是否配置不正确,并且
    $JRE/bin/
    仍应位于库路径中

  • 如果没有,如何动态添加路径<代码>System.setProperties(“java.library.path”,StringOfPathToTheAttach.dll)不起作用。库路径已更改,但仍会出现错误。这与SecurityManager或JVM启动有关吗


  • 您的
    System.setProperty(“java.library.path”,stringofpathtotheatch.dll)应该可以工作。我猜你说得太晚了。换句话说,在设置属性之前,有人试图访问DLL

    您能否在代码中设置属性之后,在有问题的方法调用之前,输出java.library.path的当前值

    i、 e.如果您在看到“设置属性后”之前看到“在attach.dll调用之前”输出,您就知道问题所在

    编辑:


    指向本机库的更好方法是使用
    System.load(StringOfPathToTheatch.dll)
    ——同样,在出现问题的代码行之前。

    刚刚找到一个可能回答您问题的链接

    System.setProperty("java.library.path", System.getProperty("java.library.path") + File.pathSeparator + FOLDER_THAT_CONTAINS_ATTACH_DLL);
    
    JVM启动时,java.library.path只读取一次。如果使用System.setProperty更改此属性,则不会有任何区别


    更改库路径后,是否使用新的类加载器?@joseph ottinger:不,我想我应该这样做?@Teddy yueh我不确定加载dll文件是否是我的任务。毕竟在我的Ubuntu机器上,attach.so库路径已经链接到了。我猜我的windows计算机只是配置得很差。如果不向右滚动,这是一个非常糟糕的解决方案;)