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

StackOverflow https://stackoverflow.com/questions/4630

Вопрос

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

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

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

Это было полезно?

Решение 2

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

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

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

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

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

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

<nativelib ...> 

В файле JNLP?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top