Java Attach API:动态更改java.library.path

时间:2011-04-06 11:09:54

标签: java windows jvm

在我的Windows机器上使用com.sun.tools.attach API时,在调用

时出现以下错误
VirtualMachine.list()

java.lang.UnsatisfiedLinkError:java.library.path中没有附件

原因是缺少attach.dll。 attach.dll位于$JRE/bin/。用-Djava.library.path=[Directory to the attach.dll]启动我的Java程序时,一切都没有错误输出。

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

  1. 我的机器配置不正确,$JRE/bin/应该在库路径中吗?

  2. 如果没有,我该如何动态添加路径? System.setProperties("java.library.path",StringOfThePathToTheAttach.dll);无法解决问题。库路径已更改,但无论如何都会出现错误。这与SecurityManager或JVM的启动有关吗?

3 个答案:

答案 0 :(得分:7)

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

“当JVM启动时,java.library.path只读取一次。如果使用System.setProperty更改此属性,它将没有任何区别。”

http://fahdshariff.blogspot.jp/2011/08/changing-java-library-path-at-runtime.html

答案 1 :(得分:5)

您的System.setProperty("java.library.path", StringOfThePathToTheAttach.dll);应该有效。我的猜测是你打电话太晚了。换句话说,尝试在设置属性之前访问DLL。

在代码中设置属性后,是否可以在违规方法调用之前再输出java.library.path的当前值?

即。如果在看到“设置属性后”之前看到“在attach.dll调用之前”输出,则表示您的问题在哪里。

编辑:

指向本机库的更好方法是在错误的代码行之前再次使用System.load(StringOfThePathToTheAttach.dll)

答案 2 :(得分:5)

System.setProperty("java.library.path", System.getProperty("java.library.path") + File.pathSeparator + FOLDER_THAT_CONTAINS_ATTACH_DLL);