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

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

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

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
16
0
2 608
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

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

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

Загрузчики классов не могут решить проблему, поскольку ОС разрешает собственные зависимости.

basszero 26.01.2009 04:46

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

<nativelib ...> 

В файле JNLP?

Ответ принят как подходящий

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

Другие вопросы по теме