Сведения о вопросе

nikolya

16:03, 1st July, 2020

Как я могу Java запуске приложений несколько, зависимости, собственные библиотеки?

Просмотров: 467   Ответов: 3

Пример: у меня есть два общих объекта (то же самое должно применяться.файл DLL.) Первый общий объект из сторонней библиотеки, мы будем называть его libA.so. Я завернул некоторые из них с JNI и создал свою собственную библиотеку, libB.so. Теперь libB зависит от libA.

При запуске обе библиотеки находятся в некоторой рабочей области webstart. Мой код java пытается загрузить libB. В этот момент системный загрузчик попытается загрузить libA, который не находится в пути к системной библиотеке (java.library.path не поможет этому). Конечным результатом является то, что libB имеет неудовлетворенную ссылку и не может быть использован.

Я пробовал загружать libA до libB, но это все еще не работает. Кажется, OS хочет сделать эту загрузку для меня. Есть ли способ сделать эту работу, кроме статической компиляции?



  Сведения об ответе

nYU

18:03, 1st July, 2020

Я не уверен, что это будет обработано точно так же для webstart, но мы столкнулись с этой ситуацией в настольном приложении, когда имели дело с набором собственных библиотек (DLL в нашем случае).

Загрузка libA перед libB должна работать, если только одна из этих библиотек не имеет неучтенной зависимости и не находится в пути. Я понимаю, что как только он попадает в вызов system loadLibrary (т. е. Java нашел библиотеку в своем java.library.path и теперь говорит OS, чтобы загрузить ее) - он полностью зависит от операционной системы, чтобы найти любые зависимые библиотеки, потому что в этот момент именно операционная система загружает библиотеку для процесса, и OS только знает, как искать в системном пути. Это кажется трудным установить в случае приложения Webstart, но есть способ обойти это, который не требует статической компиляции. Возможно, вы сможете перетасовать свои библиотеки - я не уверен

Если вы используете пользовательский загрузчик классов, вы можете переопределить loadLibrary и findLibrary, чтобы он мог найти ваши библиотеки внутри jar в вашем classpath, и если вы также сделаете его осведомленным о ваших собственных зависимостях библиотеки (т. е. libB зависит от libA зависит от libX, то при загрузке libB вы можете поймать себя и убедиться, что вы загружаете libA первым, а при проверке этого уведомления и загрузки libX первым. Тогда OS не пытается найти библиотеку, которая не находится на вашем пути. Это неуклюже и немного болезненно, но обеспечение Java находит их и загружает их все в правильном порядке может работать.


  Сведения об ответе

darknet

18:03, 1st July, 2020

Статическая компиляция оказалась единственным способом веб-запуска нескольких зависимых собственных библиотек.


  Сведения об ответе

9090

18:03, 1st July, 2020

Являются ли обе собственные библиотеки упакованы в подписанный jar, который указан как

<nativelib ...> 

В файле JNLP?


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться