#java #windows #jvm
#java #Windows #jvm
Вопрос:
При использовании com.sun.tools.attach API на моем компьютере с Windows я получаю следующую ошибку при вызове
VirtualMachine.list()
java.lang.Ошибка UnsatisfiedLinkError: нет прикрепления в java.library.path
Причина в отсутствующем attach.dll . Прикрепление.dll находится в $JRE/bin/
. При запуске моей Java-программы с -Djava.library.path=[Directory to the attach.dll]
все работает без вывода ошибок.
Теперь я не хочу добавлять, что каждая программа Java запускает этот уродливый параметр JVM. Поэтому мои вопросы:
-
Моя машина неправильно настроена и
$JRE/bin/
в любом случае должен быть указан путь к библиотеке? -
Если нет, то как я могу добавить путь динамически?
System.setProperties("java.library.path",StringOfThePathToTheAttach.dll);
не получается. Путь к библиотеке изменен, но ошибка все равно появляется. Имеет ли это какое-то отношение к запуску SecurityManager или JVM?
Комментарии:
1. Используете ли вы новый загрузчик классов после изменения пути к библиотеке?
2. @joseph-ottinger: нет, я думаю, я должен?
Ответ №1:
Только что нашел ссылку, которая может ответить на ваш вопрос
«Java.library.path считывается только один раз при запуске JVM. Если вы измените это свойство с помощью System.setProperty, это не будет иметь никакого значения. «
http://fahdshariff.blogspot.jp/2011/08/changing-java-library-path-at-runtime.html
Ответ №2:
Ваш System.setProperty("java.library.path", StringOfThePathToTheAttach.dll);
должен работать. Я предполагаю, что вы вызываете это слишком поздно. Другими словами, перед настройкой свойства выполняется попытка доступа к DLL.
Можете ли вы вывести текущее значение для java.library.path после установки свойства в коде и еще раз перед вызовом метода-нарушителя?
т. е. если вы видите «Перед прикреплением.вызов dll » вывод до просмотра»После установки свойства», вы знаете, в чем ваша проблема.
Редактировать:
Лучший способ указать на собственные библиотеки — снова использовать System.load(StringOfThePathToTheAttach.dll)
— перед оскорбительной строкой кода.
Комментарии:
1. @Teddy-yueh Я не уверен, является ли моей задачей загрузка dll-файла. В конце концов, на моем компьютере с Ubuntu attach.so путь к библиотеке уже связан. Я предполагаю, что мой компьютер с Windows был просто плохо настроен.
Ответ №3:
System.setProperty("java.library.path", System.getProperty("java.library.path") File.pathSeparator FOLDER_THAT_CONTAINS_ATTACH_DLL);
Комментарии:
1. Это действительно ужасное решение, если вы не прокручиваете вправо 😉