API Java Attach: динамическое изменение java.library.path - PullRequest
14 голосов
/ 06 апреля 2011

При использовании API com.sun.tools.attach на моем компьютере с Windows я получаю следующую ошибку при вызове

VirtualMachine.list()

java.lang.UnsatisfiedLinkError: нет вложений в java.library.path

Причина в том, что отсутствует attach.dll. Attach.dll находится в $JRE/bin/. При запуске моей Java-программы с -Djava.library.path=[Directory to the attach.dll] все работает без вывода ошибок.

Теперь я не хочу добавлять каждую Java-программу для запуска этого ужасного параметра JVM. Поэтому мои вопросы:

  1. Правильно ли настроен компьютер, и в любом случае $JRE/bin/ должен находиться в пути к библиотеке?

  2. Если нет, как я могу динамически добавить путь? System.setProperties("java.library.path",StringOfThePathToTheAttach.dll); не получается. Путь к библиотеке изменился, но ошибка все равно появляется. Это как-то связано с запуском SecurityManager или JVM?

Ответы [ 3 ]

7 голосов
/ 13 апреля 2012

Только что нашел ссылку, которая может ответить на ваш вопрос

"java.library.path читается только один раз при запуске JVM. Если вы измените это свойство с помощью System.setProperty, оно не будетлюбая разница. "

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

5 голосов
/ 09 мая 2011
System.setProperty("java.library.path", System.getProperty("java.library.path") + File.pathSeparator + FOLDER_THAT_CONTAINS_ATTACH_DLL);
5 голосов
/ 07 апреля 2011

Ваш System.setProperty("java.library.path", StringOfThePathToTheAttach.dll); должен работать. Я предполагаю, что вы звоните слишком поздно. Другими словами, есть попытка доступа к DLL до того, как вы установите свойство.

Можете ли вы вывести текущее значение для java.library.path после того, как свойство установлено в коде, и снова перед вызовом вызывающего метода?

т.е. Если перед выводом «После установки свойства» отображается вывод «Перед вызовом attach.dll», вы знаете, в чем проблема.

Edit:

Лучший способ указать на нативные библиотеки - это снова использовать System.load(StringOfThePathToTheAttach.dll) - перед ошибочной строкой кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...