Как добавить нативную библиотеку в "java.library.path" с запуском Eclipse (вместо переопределения)
У меня есть собственная библиотека, которую нужно добавить в java.library.path. С аргументом JVM -Djava.library.path= путь... Я могу установить путь, как я хочу.
Моя проблема в том, что моя другая библиотека (отчеты из Пентаго) ищет шрифты на основе java.library.path по умолчанию (включая системные каталоги и т. Д.), А ручная настройка переопределяет путь по умолчанию.
Итак: как я могу добавить запись пути в java.library.path по умолчанию вместо того, чтобы переопределять ее (что, кажется, делается с -Djava.library.path)? (Я бы не хотел добавлять путь по умолчанию вручную, что было бы неправильно для развертывания)
РЕДАКТИРОВАТЬ: Извините за отсутствующие детали; Я работаю с Eclipse. (Развертывание выполняется с помощью JNLP, и там я могу использовать nativelib под ресурсами)
13 ответов
Я забыл эту проблему... Я на самом деле спрашивал с Eclipse, извините, что не сказал об этом изначально. И ответ кажется слишком простым (по крайней мере, с 3.5; возможно, с более старыми версиями):
Аргументы конфигурации запуска Java: Аргументы VM:
-Djava.library.path="${workspace_loc:project}\lib;${env_var:PATH}"
Не следует забывать кавычки, иначе в PATH возникают проблемы с пробелами.
Если вы хотите добавить нативную библиотеку, не мешая java.library.path
во время разработки в Eclipse (чтобы избежать включения абсолютных путей и необходимости добавления параметров в конфигурацию запуска), вы можете указать путь к расположению собственных библиотек для каждого Jar в диалоговом окне " Путь сборки Java " в разделе " Расположение собственной библиотеки". Обратите внимание, что имя файла собственной библиотеки должно соответствовать имени файла Jar. Смотрите также это подробное описание.
SWT помещает необходимые собственные библиотеки DLL в JAR. Найдите "org.eclipse.swt.win32.win32.x86_3.4.1.v3449c.jar" для примера.
Библиотеки DLL должны находиться в корне JAR, JAR должен быть подписан, и DLL должна появиться с контрольной суммой в META-INF/MANIFEST.MF, чтобы виртуальная машина могла их забрать.
В Windows вот так:
-Djava.library.path = "C: / MyLibPath;% PATH%"
% PATH% - это ваш старый -Djava.library.path
Можете ли вы обойти это, вызвав System.load() программно для загрузки своей нативной библиотеки? Этот метод (в отличие от System.loadLibrary ()) позволяет указать абсолютный путь.
- В Windows: добавьте путь к библиотеке в переменную среды PATH.
- В Linux: добавьте путь к библиотеке в переменную среды LD_LIBRARY_PATH.
- На Mac: добавьте путь к библиотеке в переменную среды DYLD_LIBRARY_PATH.
java.library.path
инициализируется значениями указанных выше переменных на соответствующей платформе.
Это должно работать в любой среде IDE.
Вы можете проверить, соответствует ли значение ожидаемому, позвонив java -XshowSettings:properties
https://bugs.eclipse.org/bugs/show_bug.cgi?id=102239 утверждает, что в модуле запуска Eclipse не реализована механика замещения, по крайней мере, до выпуска Juno.
Таким образом, при запуске Eclipse (почти) невозможно добавить или добавить другую папку библиотеки в java.library.path без предварительного знания настроек по умолчанию.
Я почти написал, потому что должна быть возможность запустить Eclipse, сбросить содержимое java.library.path и остановить Eclipse в одной команде. Дамп будет проанализирован и затем принят как вход для запуска Eclipse, т.е.
#!/bin/bash
# get default value of java.library.path (somehow)
default_lib_path=$( start_dump_stop_eclipse_somehow )
# now launch Eclipse
eclipse --launcher.appendVmargs \
-vmargs \
-Djava.library.path="/my/native/lib/folder:${default_lib_path}"
В системах UNIX вы можете добавить переменную среды LD_LIBRARY_PATH. В Windows JVM автоматически устанавливает системное свойство java.library.path в значение PATH; так что, если DLL находится на вашем пути, то вы настроены.
Решение, предложенное Робом Элснером в одном из приведенных выше комментариев, прекрасно работает (OSX 10.9, Eclipse Kepler). Нужно добавить их дополнительные пути к разделенному ":".
Вы также можете использовать ${system_property:java.library.path} - Роб Элснер, 22 ноября 2010 г., 23:01.
Окно-> Настройки->Java-> Установленные JRE. Затем выберите текущий JRE(JDK) и нажмите "Изменить". Заполните стандартные аргументы виртуальной машины: -Djava.library.path=/usr/local/xuggler/lib. Готово!
По какой-то причине я не смог заставить работать несколько папок (ну, это было какое-то время, но как только мне понадобилось больше dll и я добавил больше папок, ни одной с пробелами в пути). Затем я скопировал все необходимые библиотеки в одну папку, и это было моим java.library.path, и это сработало. У меня нет объяснения - если бы кто-то сделал, это было бы здорово.
Имя файла собственной библиотеки должно соответствовать имени файла Jar. Это очень очень важно. Пожалуйста, убедитесь, что имя фляги и имя dll совпадают. Также, пожалуйста, смотрите пост от Фабиана Стига. Моя загрузка для jawin содержала разные названия для dll и jar. Это были jawin.jar и jawind.dll, обратите внимание на дополнительный 'd' в имени файла dll. Я просто переименовал его в jawin.dll и установил его как собственную библиотеку в eclipse, как упомянуто в посте " http://www.eclipsezone.com/eclipse/forums/t49342.html".
Многие из существующих ответов предполагают, что вы хотите установить это для конкретного проекта, но мне нужно было установить его для самого Eclipse, чтобы поддерживать встроенную аутентификацию для драйвера JDBC для SQL Server.
Чтобы сделать это, я следовал этим инструкциям для запуска Eclipse из командной строки Java вместо его обычного средства запуска. Затем я просто изменил этот сценарий, добавив аргумент -Djava.library.path в командную строку Java.
В Windows я обнаружил, что важно запустить Eclipse из командной строки, а не из меню "Пуск" или ярлыка, при условии, что нативная DLL находится в каталоге в вашей переменной PATH. По-видимому, это гарантирует, что правильный путь находится на пути.