Почему мой сервер WebLogic не может найти * .dll, кроме того, что он уже загружен в другой загрузчик классов?

#java #web-applications #dll #weblogic #com4j

#java #веб-приложения #dll #weblogic #com4j

Вопрос:

Я разрабатываю веб-приложение Java, которое использует библиотеку com4j для подключения и извлечения данных из внешней базы данных. Мое приложение без проблем работает на моем локальном хосте, на котором выполняется настройка maven / jetty.

Однако мне нужно, чтобы приложение размещалось на сервере WebLogic, администратором которого я не являюсь. При развертывании и запуске там веб-приложения я получаю исключение неудовлетворенной ссылки, как показано ниже.

Я пробовал многочисленные предлагаемые решения подобных проблем, но безуспешно. Ошибки время от времени немного меняются, но в основном те же. Все предлагаемые решения, которые я нашел, можно свести к трем предложениям, найденным на этом сайте: https://com4j.java.net/deployment.html

  • Он должен работать автоматически при упаковке jar: этого не происходит. Jar определенно находится в war-файле, а dll находится внутри .jar, но все равно возникает то же исключение.
  • Разместить com4j.dll в том же каталоге, что и com4j.jar : Абсолютно ничего не делает с сообщением об ошибке.
  • Установите системное свойство java.library.path, чтобы включить каталог, в котором com4j.dll находится: Ошибка изменилась на .dll уже загружен в другой загрузчик классов.

я пробовал один раз, все сразу, и разные комбинации из вышеперечисленного.

Я не ожидаю, что мастер набросится и скажет мне точно, что здесь делать, но я хотел бы получить помощь в поиске другого угла атаки на эту проблему.

     <11-06-2014 15:23:34 CEST> <Error> <Deployer> <BEA-149265> 
    <Failure occurred in the execution of deployment request with ID 
    '1402493014299' for task '158'. Error is: 

    'weblogic.application.ModuleException: Unable to load com4j.dll'
     weblogic.application.ModuleException: Unable to load com4j.dll
        at weblogic.servlet.internal.WebAppModule.startContexts(WebAppModule.java:1401)
        at weblogic.servlet.internal.WebAppModule.start(WebAppModule.java:460)
        at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:425)
        at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:83)
        at weblogic.application.internal.flow.ModuleStateDriver.start(ModuleStateDriver.java:119)
        Truncated. see log file for complete stacktrace

    Caused By: java.lang.UnsatisfiedLinkError: no com4j-x86 in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1734)
    at java.lang.Runtime.loadLibrary0(Runtime.java:823)
    at java.lang.System.loadLibrary(System.java:1028)
    at com4j.COM4J.loadNativeLibrary(COM4J.java:530)
    at com4j.COM4J.<clinit>(COM4J.java:522)
    Truncated. see log file for complete stacktrace
> 
 

Комментарии:

1. Вы уверены, что java.library.path установлен правильно и не перезаписывается каким-либо сценарием запуска weblogic? Вы пробовали распечатать его System.getProperty("java.library.path") перед вызовом jni? Недавно я настроил wl на использование собственных библиотек, и я просто помещаю их в path, и они видны.

2. Я нет. Мне бы очень понравилось руководство по этому вопросу. Я был уверен, что мои коллеги знали, что они делали в этом отношении. Я довольно недавно получил образование, и серверы, сборки, системные переменные и тому подобное не являются моей сильной стороной. И, честно говоря, я не уверен, вызываю ли я jni или нет.

3. Администратор сервера говорит, что, да, мы уверены, что путь к библиотеке указан правильно. Однако сообщение об ошибке изменилось в тот момент, когда мы попытались это сделать, и в нем утверждалось, что . dll уже был загружен в другой загрузчик классов.

Ответ №1:

Решение вашей проблемы, вероятно, объясняется здесь: https://com4j.java.net/deployment.html

Вы можете настроить java.library.path переменную различными способами :

Измените сценарий startWebLogic в своем домене.

или

Войдите в консоль администратора weblogic, перейдите в меню Среда -> Серверы -> Мой сервер -> Начальная вкладка сервера -> Добавить -Djava.library.path=PATH_TO_LIBRARY в аргументы: текстовое поле.

Комментарии:

1. Вы намеренно повторяете ссылку, как подтверждение того, что я на правильном пути, или вы не видели этого в вопросе?

2. Решение, представленное последним, уже опробовано. Ошибка изменилась на . dll уже загружен в другой загрузчик классов.

3. Поэтому подумайте о том, чтобы изменить название вопроса… Я не видел ссылку.