Как отладить loadLibrary, чтобы понять, почему не загружается DLL?

Я пытаюсь загрузить DLL со статическим блоком в моем определении сервлета следующим образом:

    String ehrViewerExternalNativeLibs = "webapps" + pathSeparator +
                                         "ehr-viewer" + pathSeparator +
                                         "WEB-INF" + pathSeparator +
                                         "classes" + pathSeparator +
                                         "extlib";

    try {
        String catalinaHome = System.getProperty("catalina.home");
        String defaultLibraryPath = System.getProperty("java.library.path");
        String sharedLibraryPath = catalinaHome + pathSeparator + ehrViewerExternalNativeLibs;

        if (catalinaHome != null) {
            System.setProperty("java.library.path", defaultLibraryPath + ";" + sharedLibraryPath);
            String curPath = System.getProperty("java.library.path");
            logger.info(curPath);
            System.loadLibrary("awj2k");
            //System.load(sharedLibraryPath + "\\awj2k.dll");
            Class.forName("com.aware.j2k.codec.engine.AwJ2k");
        }

Я продолжаю получать ошибку, как это:

10 марта 2015 г., 11:17:27 org.apache.catalina.core.StandardWrapperValve invoke SEVERE: выделить исключение для сервлета ehrViewerServiceImpl

java.lang.UnsatisfiedLinkError: нет awj2k в java.library.path в java.lang.ClassLoader.loadLibrary(неизвестный источник) в java.lang.Runtime.loadLibrary0(неизвестный источник) в java.lang.System.loadLibrary(неизвестный источник) в com.softmedical.ehrviewer.server.EHRViewerServiceImpl.(EHRViewerServiceImpl.java:121)

Выход для пути к библиотеке:

ИНФО | 2015-03-10 11:17:27,558 | - D:\Tomcat-7.0\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;;;D:. \ Tomcat-7.0 \ WebApps \ ЭМК-просмотрщик \WEB-INF\ классы \extlib

А содержимое папки extlib есть

awj2k.dll

Если я помещу DLL в D: \ Tomcat-7.0 \ bin, она будет работать нормально. Какое темное заклинание происходит за кулисами? Почему я могу загрузить DLL из нужного мне места? Я вижу, что java.library.path установлен правильно, так почему он не работает?

1 ответ

Решение

Загрузчик классов, вероятно, не использует ваши изменения времени выполнения java.library.path, См. Добавление новых путей для собственных библиотек во время выполнения в Java.

Можете ли вы загрузить библиотеку, используя System.load в сервлете init? Что-то вроде этого.

public void init(ServletConfig config) {
  ServletContext ctx = config.getServletContext();
  String libPath = ctx.getRealPath("/") + "\WEB-INF\classes\extlib\awj2k.dll";
  System.load(libPath);
}

РЕДАКТИРОВАТЬ: Я только что понял, что вы попросили подход к отладке. Попробуйте определить java.library.path включить каталог с awj2k.dll в конфигурации запуска Tomcat или в командной строке. Если System.loadLibrary работает, что подтвердит, что изменения пути к библиотеке во время выполнения не эффективны.

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