在我的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参数。因此我的问题是:
我的机器配置不正确,$JRE/bin/
应该在库路径中吗?
如果没有,我该如何动态添加路径? System.setProperties("java.library.path",StringOfThePathToTheAttach.dll);
无法解决问题。库路径已更改,但无论如何都会出现错误。这与SecurityManager或JVM的启动有关吗?
答案 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);