Установите java .library.path внутри файла jar - PullRequest
0 голосов
/ 08 января 2020

Я пытаюсь создать исполняемый файл jar для проекта, в котором папка ресурса библиотеки java имеет зависимость в самом проекте . Я хочу развернуть эту флягу без необходимости для пользователя загружать эту зависимость отдельно. Поэтому я добавил эту библиотеку java в качестве ресурса к моему проекту и собрал ее. Внутри исходного кода проекта у меня есть следующий код, чтобы попытаться установить «java .library.path» для включения этого ресурса.

Вот как выглядит мой код:

URL url = Staple.class.getResource("/path/to/java_library_name");
String stringUrl = url.toString();
System.setProperty( "java.library.path", stringUrl );  
Field fieldSysPath = ClassLoader.class.getDeclaredField( "sys_paths" );  
fieldSysPath.setAccessible( true );  
fieldSysPath.set( null, null ); 

Однако при сборке кода и попытке выполнить сам jar это не работает, и я получаю следующую ошибку:

no java_library_name in java.library.path: [jar, file, /path/to/project/target/jar_name-0.0.1-SNAPSHOT-jar-with-dependencies.jar!/path/to/java_library_name]
at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2660)
at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:829)
at java.base/java.lang.System.loadLibrary(System.java:1867)
.....

В чем проблема с приведенным выше кодом? Похоже, что он неверно описал весь путь и составил что-то вроде /path/to/project/target/jar_name-0.0.1-SNAPSHOT-jar-with-dependencies.jar!/path/to/java_library_name
Как иначе можно программно получить путь, который включает папку библиотеки java после создания jar и во время выполнения?

1 Ответ

3 голосов
/ 08 января 2020

собственных ресурсов (те, которые вы пытаетесь загрузить с помощью loadLibrary) должны быть FILES , а ресурсы, возвращаемые MyClass.class.getResource, являются URL; специально, так как они не должны быть файлами. На самом деле, как правило, это не так: ваш ресурс - это не файл. Это zip-запись в jar-файле, которая не является файлом.

Обойти это невозможно; Ограничение ОС.

Я знаю, я знаю. Отстой. Но вы должны сделать это: распаковать DLL во временную папку (вы МОЖЕТЕ сделать это; вместо этого используйте getResourceAsStream и скопируйте ее в файл, используя новый Files API; в наши дни это одна строка (Files.write) ), затем загрузите его.

Конечно, запись исполняемого кода в временный каталог и последующее его выполнение очень чувствительна к безопасности; у меня нет решений для этой дилеммы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...