UnsatisfiedLinkError和NoClassDefFoundError:在Ubuntu 11.10上运行Java Mapscript

时间:2011-12-10 10:48:38

标签: java mapserver ubuntu-11.10 umn

我们使用Java技术在Windows平台上使用MAPSERVER(版本6.0.1)编写并运行动态Web应用程序。现在,需要在Ubuntu 11.10上部署它。我们已经安装了Apache Tomcat 6.0,Mapserver 6.0.1,Apache 2.0和FWTools-2.0.1(因为这个软件包包含mapserver所有必需的工具,如果我没有错,所以我觉得没有其他工具可以安装) 。我们在Apache Tomcat的Webapps文件夹中部署了war文件(并且没有应用程序)。我甚至得到了没有与mapscript api相关的代码的索引页面。但是在使用mapscript获取其他servlet时,我们会遇到以下错误......

java.lang.UnsatisfiedLinkError: no mapscript in java.library.path
java.lang.ClassLoader.loadLibrary(ClassLoader.java:1681)
java.lang.Runtime.loadLibrary0(Runtime.java:840)
java.lang.System.loadLibrary(System.java:1047)
edu.umn.gis.mapscript.mapscriptJNI.<clinit>(mapscriptJNI.java:23)
edu.umn.gis.mapscript.mapObj.<init>(mapObj.java:283)

再次刷新显示上述错误的浏览器页面时,我收到了更改,

java.lang.NoClassDefFoundError: Could not initialize class    
edu.umn.gis.mapscript.mapscriptJNI
edu.umn.gis.mapscript.mapObj.<init>(mapObj.java:283)

我在网上搜索了上述问题。但最后空白。请提供有关上述问题的建议。

2 个答案:

答案 0 :(得分:3)

我不打算解释为什么你会收到UnsatisfiedLinkError,但我会解释你为什么在重新加载页面时得到NoClassDefFoundError。

当JVM尝试初始化已经尝试过但未能初始化的类时,抛出了带有消息Could not initialize class ...的NoClassDefFoundError。

两个堆栈跟踪中的第一个包含行

edu.umn.gis.mapscript.mapscriptJNI.<clinit>(mapscriptJNI.java:23)

方法名称<clinit>表示类mapscriptJNI的静态初始值设定项。因此,在抛出UnsatisfiedLinkError时,JVM正在尝试初始化此类。看一下错误消息,似乎这个静态初始化程序试图加载本机代码库mapscript但是失败了。

此UnsatisfiedLinkError导致mapscriptJNI类无法成功初始化。 JVM会记录所有未能初始化的类,如果您尝试再次初始化其中一个类,则会收到NoClassDefFoundError,并显示一条消息,指出它无法初始化该类。

刷新页面时,最终会导致JVM再次尝试初始化类mapscriptJNI。当然,这个类未能初始化上一次。你的第二个堆栈跟踪包含我所描述的错误。

简而言之,UnsatisfiedLinkError是真正的错误。解决这个问题,另一个会消失。

答案 1 :(得分:0)

我会检查以下两项:

  1. Tomcat上的mapscript.jar文件或至少是您的webapp的类路径? (NoClassDefFoundError是你的大线索)
  2. 您的LD_LIBRARY_PATH或libmapscript.so上有-Djava.library.path吗? (UnsatisfiedLinkError,因为找不到共享对象)
  3. 尝试查看运行Java Mapscript(在Linux上)部分附近的post

    希望有所帮助!