API Java Attach: изменение динамического java.library.path

При использовании 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. Поэтому мои вопросы:

  • Является ли мой компьютер не настроен правильно, а $JRE/bin/ должен быть в пути к библиотеке?

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

Ответ 1

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

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

то есть. Если вы видите сообщение "Before attach.dll call" перед просмотром "После установки свойства", вы знаете, где ваша проблема.

Edit:

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

Ответ 2

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

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

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

Ответ 3

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