如何调试 loadLibrary 以了解为什么不加载 DLL?
How to debug loadLibrary to understand why not loading a DLL?
我正在尝试在我的 servlet 定义中加载带有静态块的 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");
}
我一直收到这样的错误:
Mar 10, 2015 11:17:27 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Allocate exception for servlet ehrViewerServiceImpl
java.lang.UnsatisfiedLinkError: no awj2k in java.library.path
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
at com.softmedical.ehrviewer.server.EHRViewerServiceImpl.(EHRViewerServiceImpl.java:121)
库路径的输出是:
INFO | 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\ehr-viewer\WEB-INF\classes\extlib
文件夹 extlib 的内容是
awj2k.dll
如果我将 DLL 放在 D:\Tomcat-7.0\bin 中,它就可以正常工作。幕后有什么黑暗咒语?为什么我可以从我想要的地方加载一个DLL?我看到 java.library.path 设置正确,为什么它不起作用?
类加载器可能没有使用您对 java.library.path
的运行时更改。参见 Adding new paths for native libraries at runtime in Java。
您可以在 servlet 的 init
中使用 System.load
加载库吗?像这样。
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
以在 Tomcat 启动配置或命令行中包含带有 awj2k.dll
的目录。如果 System.loadLibrary
有效,那将确认运行时库路径更改无效。
我正在尝试在我的 servlet 定义中加载带有静态块的 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");
}
我一直收到这样的错误:
Mar 10, 2015 11:17:27 AM org.apache.catalina.core.StandardWrapperValve invoke SEVERE: Allocate exception for servlet ehrViewerServiceImpl
java.lang.UnsatisfiedLinkError: no awj2k in java.library.path at java.lang.ClassLoader.loadLibrary(Unknown Source) at java.lang.Runtime.loadLibrary0(Unknown Source) at java.lang.System.loadLibrary(Unknown Source) at com.softmedical.ehrviewer.server.EHRViewerServiceImpl.(EHRViewerServiceImpl.java:121)
库路径的输出是:
INFO | 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\ehr-viewer\WEB-INF\classes\extlib
文件夹 extlib 的内容是
awj2k.dll
如果我将 DLL 放在 D:\Tomcat-7.0\bin 中,它就可以正常工作。幕后有什么黑暗咒语?为什么我可以从我想要的地方加载一个DLL?我看到 java.library.path 设置正确,为什么它不起作用?
类加载器可能没有使用您对 java.library.path
的运行时更改。参见 Adding new paths for native libraries at runtime in Java。
您可以在 servlet 的 init
中使用 System.load
加载库吗?像这样。
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
以在 Tomcat 启动配置或命令行中包含带有 awj2k.dll
的目录。如果 System.loadLibrary
有效,那将确认运行时库路径更改无效。