java - 如何调试 loadLibrary 以了解为什么不加载 DLL?

标签 java tomcat loadlibrary

我正在尝试在我的 servlet 定义中加载一个带有静态 block 的 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);
}

编辑:我刚刚意识到您需要一种调试方法。尝试在 Tomcat 启动配置或命令行中定义 java.library.path 以包含带有 awj2k.dll 的目录。如果 System.loadLibrary 有效,这将确认库路径在运行时更改无效。

关于java - 如何调试 loadLibrary 以了解为什么不加载 DLL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28967966/

相关文章:

java - 我无法在代码中实例化 Integer 类的对象 (Java)

java - 将数组复制到另一个数组

c++ - 声明 HMODULE 会在运行时抛出异常

c++ - COM 对象 DLL 加载问题

java - 无法导入javafx折线图

java - 一个 jframe 中的多个 jpanel

apache - Pentaho + apache 反向代理 + 代理 SSL 集成

java - Tomcat:ExceptionHasndler 不适用于 MultiPartException 但适用于 IllegalArgumentException

javascript - Tomcat servlet,将所有网址重定向到单个网页

C++:我们的安装程序拒绝加载我们应用程序的资源 DLL(未找到模块)[仅限 XP]