dll уже загружен в другой загрузчик классов в netbeans с помощью tomcat

В настоящее время я разрабатываю веб-приложение java, используя spring mvc, netbeans в качестве IDE и tomcat в качестве веб-сервера.

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

Caused by: java.lang.UnsatisfiedLinkError: Native Library C:\Program Files (x86)\SafeNet\Protect Toolkit C SDK\bin\jcprov.dll already loaded in another classloader

это код, который вызывает классы в банке:

    CryptokiEx.C_Initialize(new CK_C_INITIALIZE_ARGS(CKF.OS_LOCKING_OK));
//below code cause error
    CryptokiEx.C_OpenSession(0, CKF.RW_SESSION, null, null, session);

Вторая строка кода вызовет ошибку.

При первом выполнении код не вызывал ошибку, но после этого он всегда вызывает ошибку. Я попытался остановить tomcat из netbeans, закрыть netbeans и снова открыть, и он все еще вызывает ошибку.

Я искал ответ в Google, и он указывает мне на эту ссылку:

http://wiki.apache.org/tomcat/HowTo#I.27m_encountering_classloader_problems_when_using_JNI_under_Tomcat

Но там сказано, что класс, загружающий нативную библиотеку, должен быть помещен в $CATALINA_HOME/shared/lib. Я поместил банку в каталог, но ошибка все еще возникает.

Затем я запускаю это в командной строке: mvn tomcat:run в каталоге моего проекта, и на этот раз ошибка не возникает, я не знаю почему. Но все же я хочу запустить его из netbeans, а не из командной строки.

Я предполагаю, что даже я поместил банку в общую папку $CATALINA_HOME/shared/lib, мое веб-приложение по-прежнему зависит от банки, помещенной в папку lib моего проекта веб-приложения, а не от банки, помещенной в $CATALINA_HOME/shared/lib. Я использую внутрипроектный репозиторий для включения jar-файла, но как включить jar-файл, помещенный в $CATALINA_HOME/shared/lib?

Я очень ценю любую помощь от вас, ребята, спасибо!


person Chrisma Andhika    schedule 15.05.2013    source источник
comment
Вы нашли какое-нибудь решение? Как насчет использования ‹scope›provided‹/scope› в вашей зависимости от maven?   -  person dan_l    schedule 20.03.2014
comment
вы используете Tomcat 7?   -  person dan_l    schedule 20.03.2014
comment
Я использую Tomcat 7 и до сих пор не нашел решения.   -  person Chrisma Andhika    schedule 15.06.2014


Ответы (1)


Существует даже проект static-dll-bootstrapper, чтобы сделать все правильно путь.

Ваша проблема должна быть решена в несколько простых шагов.

  • Поместите банку в путь shared.loader
  • определить имя библиотеки в dll-bootstrapper.properties рядом с банкой
  • поместите Class.forName("msm.DLLBootstrapper"); в код вашего проекта
  • наслаждаться
person Andrey Regentov    schedule 18.10.2014