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

#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. Поэтому мои вопросы:

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

  2. Если нет, то как я могу добавить путь динамически? 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. Это действительно ужасное решение, если вы не прокручиваете вправо 😉