Как отладить 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
работает, что подтвердит, что изменения пути к библиотеке во время выполнения не эффективны.