Почему этот модуль JBoss на основе JNI выдает ошибку «Не удается найти зависимые библиотеки»?

У меня есть веб-приложение на Java myproject.war развернут в JBoss. Часть приложения использует JNI для подключения к C ++ DLL, которая вызывает функции из набора сторонних библиотек. Мы переносим это приложение с сервера x32 на сервер x64.

Предыдущая среда сборки

  • 32-битная Windows Server 2003
  • JBoss 6.X
  • Java 1.6.X

Новая среда сборки

  • 64-битная Windows Server 2008 R2, SP1 (6.1.7601)
  • JBoss AS 7.2.0 Финал «Янус»
  • Java Runtime 1.7.0_45-b18.
  • Установленная распространяемая версия Visual Studio 2010 x64

В старой системе пользовательские библиотеки DLL и сторонние библиотеки были просто сброшены в C:\Windows\System32\ и приложение смогло успешно подключиться к ним через JNI. Сторонние библиотеки включают в себя несколько библиотек DLL, некоторые профили ICC и папку ресурсов с подпапками файлов, включая шрифты True-type, конфигурации и другие файлы.

Для миграции был создан модуль JBoss, содержащий код JNI. Код Java / JNI был перемещен в MyModule.jar, а также MyDriver.dll был перекомпилирован в x64. Получены x64 версии сторонних библиотек.

я имею

  • перекомпилированы MyDriver.dll для 64-разрядных с использованием Visual Studio 2010 (10.0.40219.1 SP1Rel)
  • помещенный MyDriver.dll и 64-битные версии сторонних DLL и папки ресурсов в папке модуля ..\main\lib\win-x86_64\
  • скопировал файлы модуля в путь под modules папка
  • созданный module.xml
    • с соответствующим ресурсом MyModule.jar,
      • который имеет класс MyDriverLoader какие нагрузки MyDriver.dll,
    • со ссылкой на модуль sun.jdk что я не уверен на 100%, что нужно для JNI.

DLL скомпилирована с

  • Использование MFC: используйте стандартные библиотеки Windows

Независимо от того, что я делаю, при запуске приложения JBoss выдает следующую ошибку Java:

java.lang.UnsatisfiedLinkError: D: \ Jboss \ jboss-7.2.0.Final \ modules \ com \ mymodule \ main \ lib \ win-x86_64 \ MyDriver.dll: не удается найти зависимые библиотеки

Что это говорит мне,

  1. JBoss может определить правильную DLL из модуля, и поэтому я правильно настроил модуль.
  2. Некоторая зависимая библиотека не находится на пути JBoss.

Я пробовал следующие решения, но ни одно из них не сработало, и ошибка сохраняется:

  1. Я установил Visual Studio 2010 Redistributable x64, который, вероятно, уже был упакован в любом случае.
  2. Я явно добавил {JBOSS_HOME}\modules\com\mymodule\main\lib\win-x86_64 в переменную среды Windows PATH и подтвердил это echo %PATH% который включает в себя: D:\Java\jdk1.7.0_45\bin;D:\Jboss\jboss-7.2.0.Final\modules\com\mymodule\main\lib\win-x86_64;,
  3. Я бегу x64 Dependency Walker, который говорит мне MSVCP100D.DLL, MSVCR100D.DLL а также IESHIMS.DLL не найдены Я нашел оба MSCV*.DLL файлы в обоих c:\Windows\System32 а также C:\Windows\SysWOW64 папки, но они имеют разные размеры файлов в каждой. Dependency Walker обнаружил пути к другим файлам system32, поэтому я не понимаю, почему он не находит MSCV*.DLL файлы. Чтобы проверить, я бросил их в одну папку ...\lib\win-x86_64 как MyDriver.dll, но это ничего не изменило.

Что я могу сделать, чтобы решить эту проблему?

module.xml

<module xmlns="urn:jboss:module:1.1" name="com.mymodule">

<main-class name="com.mymodule.DriverClassName"/>

<resources>
<resource-root path="MyModule.jar"/>
</resources>

<dependencies>
<module name="sun.jdk"/>
</dependencies>
</module>

MyDriverLoader.java

public class MyDriverLoader {

/**
* Load C++ Library
*/
static {

System.loadLibrary("MyDriver");
}

/**
* Native Method to return the version of the C++ DLL.
*/
public native static String getVersion();

/**
* Main method calls getVersion.
*
* @param args
*/
public static void main(String args[]) {

System.out.println("MyDriverLoader calling MyDriver.dll version " + getVersion());
}
}

jboss-deployment-structure

<jboss-deployment-structure>
<deployment>
<dependencies>
<module name="com.mymodule" />
</dependencies>
</deployment>
</jboss-deployment-structure>

структура папок модуля mymodule:

{JBOSS_HOME} \ Modules \ ком \ MyModule \ главная

  • MyModule.jar
    • module.xml
    • \ Lib \ беспроигрышная x86_64 \
    • MyDriver.dll
    • ThirdPartyA.dll
    • ThirdPartyB.dll
    • ThirdPartyC.dll
    • ThirdPartyD.dll
    • \ Resource \ Data \ Settings \
      • foo.optionfile
      • bar.optionfile

0

Решение

Я понял это, и вот как.

  1. Сначала я вынул DLL из JBoss и попытался получить к ней доступ непосредственно из вызова нативного метода через JNI на сервере x64 dev / qa. Это не удалось с той же ошибкой. Это означало, что это был не JBoss.

  2. Я удалил ссылки на сторонние библиотеки из DLL и попытался снова получить к ней доступ. Это также не удалось с той же ошибкой. Это означало, что это были не сторонние библиотеки или проблемы с ними.

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

  4. Я компилировал DLL в VS 2010 как Debug. Я перекомпилировал DLL как релиз. Это решило проблему.

Я нашел SO ответ, который помог, что я не могу найти снова, иначе я бы связал его.

Как я теперь понимаю, если вы компилируете DLL в Debug, она не должна распространяться. Это было не так с DLL-библиотеками x32, которые я скомпилировал в Debug и которые использовали на моих серверах разработки x32, но, безусловно, был в случае с соответствующей DLL-библиотекой x64. Я скомпилировал как Release и смог использовать DLL во всем приложении.

Я изменил рутину создания будущих развертываемых средств разработки.

1

Другие решения


По вопросам рекламы [email protected]