Как добавить собственную библиотеку в «java.library.path» с запуском Eclipse (вместо того, чтобы переопределять его)

92

У меня есть собственная библиотека, которую нужно добавить в java.library.path . С аргументом JVM -Djava.library.path = path ... я могу установить путь по своему усмотрению .

Моя проблема в том, что другая моя библиотека (отчеты pentaho) выполняет поиск шрифтов на основе java.library.path по умолчанию (включая системные каталоги и т.д.), а ручная настройка отменяет путь по умолчанию.

Итак: как я могу добавить запись пути в java.library.path по умолчанию вместо того, чтобы переопределить ее (что, похоже, делается с помощью -Djava.library.path)? (Я бы не хотел вручную добавлять путь по умолчанию, что было бы нехорошо для развертывания)

РЕДАКТИРОВАТЬ: извините за недостающие детали; Я работаю с Eclipse. (Развертывание выполняется с помощью JNLP, и там я могу использовать nativelib под ресурсами )

Токо
источник
1
Пожалуйста, посмотрите принятый ответ на этот вопрос - для меня это намного лучше: stackoverflow.com/questions/957700/…
laher
Вопрос "как добавить родную библиотеку в .." сбивает с толку. Вероятно, речь идет о добавлении (добавлении или добавлении) другого «пути к библиотеке», т.е. если предположить, что Eclipse по умолчанию показывает что-то вроде java.library.path = path1: path2: path3, вопрос в том, как запустить Eclipse, заканчивая java.library. .path = my / lib / folder: path1: path2: path3
whaefelinger

Ответы:

46

Забыл об этой проблеме ... Я действительно спрашивал с Eclipse, извините, что не сказал об этом изначально. И ответ кажется слишком простым (по крайней мере, с 3.5; возможно, и со старыми версиями):

Аргументы конфигурации запуска Java: Аргументы виртуальной машины:

-Djava.library.path="${workspace_loc:project}\lib;${env_var:PATH}"

Не забывайте кавычки, иначе возникнут проблемы с пробелами в PATH.

Токо
источник
7
Если есть две разделяемые библиотеки, одна зависит от другой, это не сработает. Первый обнаруживается средой выполнения Java, а второй разрешается системным динамическим загрузчиком. Единственное решение, которое я нашел, - установить LD_LIBRARY_PATH.
Кевин Клайн
4
Ответ @Touko не соответствует исходному вопросу о добавлении или добавлении собственной папки библиотеки. По крайней мере, в Mac OS 10.8 ни $ PATH, ни $ LD_LIBRARY_PATH, ни $ {workspace_loc: project} \ lib не имеют ничего общего со значением по умолчанию. Например, на моем Mac значение по умолчанию - $ HOME / Library / Java / Extensions: / Library / Java / Extensions: / Network / Library / Java / Extensions: / System / Library / Java / Extensions: / usr / lib / java. :.
whaefelinger
Если вы используете TestNG в Eclipse, вам нужно будет отредактировать конфигурацию запуска TestNG: - В окне Run Configurations выберите свою целевую конфигурацию TestNG. - Выберите вкладку «Среда» - Добавьте переменную PATH и установите ее значение для своей цели - Оставьте установленный по умолчанию переключатель «Добавить среду в собственную среду».
Филипп
Могу я привести пример.
basickarl
@kevincline, не могли бы вы уточнить, почему именно в таком случае это не сработает? Я только что столкнулся с этой проблемой и пытаюсь понять, что не так с этим решением.
anula
14

Если вы хотите добавить собственную библиотеку без вмешательства java.library.pathво время разработки в Eclipse (чтобы избежать включения абсолютных путей и необходимости добавлять параметры в конфигурацию запуска), вы можете указать путь к расположению собственных библиотек для каждого Jar в сборке Java. Диалоговое окно « Путь » в разделе « Местоположение собственной библиотеки» . Обратите внимание, что имя файла собственной библиотеки должно соответствовать имени файла Jar. См. Также это подробное описание .

Фабиан Штег
источник
3
-1. Вы предполагаете, что конечный пользователь запускает приложение из IDE, что маловероятно.
finnw
@finnw Я понимаю вашу точку зрения. Я нашел вопрос в поисках решения о том, как добавить собственную библиотеку в IDE во время разработки без переопределения java.library.pathи вернулся после того, как нашел решение в другом месте. Отредактирую свой ответ, чтобы было понятнее.
Fabian Steeg,
На самом деле я работаю с Eclipse, хотя я не упомянул об этом в вопросе.
Touko
На самом деле это не работает в текущей версии Eclipse (Luna), потому что установка свойства переопределяет java.library.path, как пользователь описывает как проблему в вопросе.
Alex N.
9

SWT помещает необходимые библиотеки DLL в JAR. Найдите пример по запросу "org.eclipse.swt.win32.win32.x86_3.4.1.v3449c.jar".

Библиотеки DLL должны находиться в корне JAR, JAR должен быть подписан, а DLL должна отображаться с контрольной суммой в файле META-INF / MANIFEST.MF, чтобы виртуальная машина могла их забрать.

Аарон Дигулла
источник
2
Как я могу сделать это с помощью NetBeans?
Maciek Sawicki
AFAIK, NetBeans использует Ant для сборки проекта. Прочтите документацию по Ant, как создавать подписанные JAR-файлы и как помещать в манифест такие вещи, как библиотеки DLL.
Аарон Дигулла,
Как мне настроить добавление .dll в Eclipse?
NoBugs
@NoBugs: В Eclipse этот пост должен помочь: eclipsezone.com/eclipse/forums/t49342.html
Аарон Дигулла,
@AaronDigulla, вы предлагаете, чтобы DLL всегда была прикреплена таким образом? Я думал, что ищет только что-то вроде java.library.path. Вы предлагаете только поиск корня jar?
4

В Windows вот так:

-Djava.library.path = "C: / MyLibPath;% PATH%"

% PATH% - это ваш старый -Djava.library.path

Энди Бут
источник
Пробовал эту идею, но результат получился как java.library.path: D: \ Workspace \ myProject \ lib;% PATH%
Touko
Вы также можете использовать $ {system_property: java.library.path}
Роб Элснер,
2
Значение по умолчанию в UNIX / Mac / GNU Linux - LD_LIBRARY_PATH. PATH - это вещь Windows.
whaefelinger
2

Можно ли обойти это, вызвав программно System.load () для загрузки собственной библиотеки? Этот метод (в отличие от System.loadLibrary () ) позволяет указать абсолютный путь.

Саймон Никерсон
источник
1
Расскажите, пожалуйста, как программно вызвать System.load () при запуске Eclipse?
whaefelinger
2

https://bugs.eclipse.org/bugs/show_bug.cgi?id=102239 заявляет, что в программе запуска Eclipse не реализована механика замены, по крайней мере, до выпуска Juno.

Таким образом, (почти) невозможно добавить или добавить другую папку библиотеки к java.library.path при запуске Eclipse без предварительного знания настроек по умолчанию.

Я написал почти, потому что должна быть возможность запустить 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}"
Whaefelinger
источник
1

В системах UNIX вы можете добавить к переменной среды LD_LIBRARY_PATH. В Windows JVM автоматически устанавливает для системного свойства java.library.path значение PATH; поэтому, если dll находится в вашем PATH, тогда все готово.

geowa4
источник
Создатель потока очень подробно описал, как «добавить» вторую папку собственной библиотеки, вы не согласны?
whaefelinger
@ user667073 Я говорил то же самое ... ДОБАВЛЕНИЕ - это вопрос, инициатор потока уже знает, как загрузить разделяемую
библиотеку в
STS 3.4.0 и Mac OS 10.8: настройки LD_LIBRARY_PATH не влияют на java.library.path. Я тестировал это с помощью Subclipse / JavaHL. Этот работал: STS --launcher.appendVmargs -vmargs -Djava.library.path = / opt / local / lib при экспорте LD_LIBRARY_PATH = / opt / local / lib; СТС был отрицательным.
whaefelinger
1

Окно-> Настройки-> Java-> Установленные JRE. Затем выберите текущую JRE (JDK) и нажмите «Изменить». Заполните параметры виртуальной машины по умолчанию: -Djava.library.path = / usr / local / xuggler / lib. Выполнено!

Вадим
источник
1
Этот ответ бесполезен, потому что инициатор потока конкретно спрашивает «Как добавить собственную библиотеку [..] вместо того, чтобы переопределить [..]». Этот ответ просто отменяет настройку по умолчанию.
whaefelinger
1

Решение, предложенное Робом Элснером в одном из приведенных выше комментариев, работает отлично (OSX 10.9, Eclipse Kepler). Нужно добавить их дополнительные пути к разделенным «:».

Вы также можете использовать $ {system_property: java.library.path} - Роб Элснер, 22 ноября 2010 г., 23:01

Йохан
источник
0

Имя файла собственной библиотеки должно соответствовать имени файла Jar. Это очень важно. Убедитесь, что имя jar и имя dll совпадают. Также см. Сообщение Фабиана Стига. Моя загрузка для jawin содержала разные имена для dll и jar. Это были jawin.jar и jawin d .dll, обратите внимание на дополнительную букву d в имени файла dll. Я просто переименовал его в jawin.dll и установил его как собственную библиотеку в eclipse, как указано в сообщении " http://www.eclipsezone.com/eclipse/forums/t49342.html "

Дхана
источник
Речь идет о добавлении нативной библиотеки (папки) при запуске Eclipse.
whaefelinger
0

По какой-то причине я не мог заставить работать несколько папок (ну, какое-то время это было, но как только мне понадобилось больше dll и добавлено больше папок, ни одной с пробелами в пути). Затем я скопировал все необходимые библиотеки DLL в одну папку и использовал это как свой java.library.path, и это сработало. У меня нет объяснения - если у кого-то есть, было бы здорово.

Устаман Сангат
источник
Ну, если нативная библиотека найдена через java.library.path, и вы скопируете другую в эту папку, то кажется естественным, что вторая тоже найдена, не так ли?
whaefelinger
Конечно, именно поэтому я и использовал это, да! Мне было интересно, можно ли добавить к нему несколько папок без необходимости перемещать или использовать символические ссылки.
Ustaman Sangat 03
0

Многие из существующих ответов предполагают, что вы хотите установить это для конкретного проекта, но мне нужно было установить его для самого Eclipse , чтобы поддерживать интегрированную аутентификацию для драйвера JDBC SQL Server.

Для этого я выполнил эти инструкции по запуску Eclipse из командной строки Java вместо его обычного средства запуска. Затем я просто изменил этот сценарий, чтобы добавить аргумент -Djava.library.path в командную строку Java.

CrazyPyro
источник
0
  1. В Windows: добавьте путь к библиотеке в переменную среды PATH.
  2. В Linux: добавьте путь к библиотеке в переменную среды LD_LIBRARY_PATH.
  3. На Mac: добавьте путь к библиотеке в переменную среды DYLD_LIBRARY_PATH.

java.library.path инициализируется значениями указанных выше переменных на соответствующей платформе.

Это должно работать в любой среде IDE.

Вы можете проверить, соответствует ли значение ожидаемому, позвонив java -XshowSettings:properties

rboc
источник
-2

В Windows я обнаружил, что важно запускать Eclipse из командной строки, а не из меню «Пуск» или ярлыка, при условии, что собственная DLL находится в каталоге в вашем PATH. По-видимому, это гарантирует, что правильный каталог находится на пути.

Алан
источник
Поправьте меня, если я ошибаюсь, но я считаю, что текущий рабочий каталог в Windows автоматически включается при поиске DLL (или исполняемых двоичных файлов). Таким образом, когда вы переходите в папку, в которой находятся библиотеки DLL, и запускаете Eclipse, то да, библиотеки DLL, которые вы ищете, будут найдены. Кроме того, как этот ответ связан с вопросом о начале обсуждения?
whaefelinger