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

时间:2015-03-10 15:42:24

标签: java tomcat 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");
        }

我一直收到这样的错误:

  

2015年3月10日上午11:17:27 org.apache.catalina.core.StandardWrapperValve调用   SEVERE:为servlet ehrViewerServiceImpl分配异常

     
    

java.lang.UnsatisfiedLinkError:java.library.path中没有awj2k         at java.lang.ClassLoader.loadLibrary(Unknown Source)         at java.lang.Runtime.loadLibrary0(Unknown Source)         在java.lang.System.loadLibrary(未知来源)         在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 \ web应用\ EHR-观察者\ WEB-INF \类\ EXTLIB

文件夹 extlib 的内容为

  

awj2k.dll

如果我把DLL放在 D:\ Tomcat-7.0 \ bin 中,它就可以了。窗帘背后会出现什么黑暗咒语?为什么我可以从我想要的地方加载DLL?我看到 java.library.path 设置正确,为什么它不起作用?

1 个答案:

答案 0 :(得分:1)

类加载器可能没有将运行时更改用于java.library.path。请参阅Adding new paths for native libraries at runtime in Java

您可以在servlet的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以在Tomcat启动配置或命令行中包含带awj2k.dll的目录。如果System.loadLibrary有效,那将确认库路径在运行时更改无效。