0

我们使用 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)

我在网上搜索了有关上述问题的信息。但最后一片空白。请提供有关上述问题的想法。

4

2 回答 2

3

我不会解释为什么会出现 UnsatisfiedLinkError,而是会解释为什么在重新加载页面时会出现 NoClassDefFoundError。

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

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

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

方法名<clinit>表示类的静态初始化器mapscriptJNI。因此,在抛出 UnsatisfiedLinkError 时,JVM 正在尝试初始化此类。查看错误消息,似乎此静态初始化程序尝试加载本机代码库mapscript但失败。

这个 UnsatisfiedLinkError 导致mapscriptJNI类无法成功初始化。JVM 会记录所有初始化失败的类,如果您尝试再次初始化其中一个类,您将收到 NoClassDefFoundError 消息,指出它无法初始化该类。

当您刷新页面时,您最终会导致 JVM 再次尝试初始化该类mapscriptJNI。当然,这个类上次初始化失败。您的第二个堆栈跟踪完全包含我描述的错误。

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

于 2011-12-10T13:25:54.053 回答
0

我会检查以下两项:

  1. mapscript.jar文件是在 Tomcat 上还是至少是您的 webapp 的类路径?(NoClassDefFoundError 是你的大线索)
  2. libmapscript.so在您的 LD_LIBRARY_PATH 还是-Djava.library.path?(UnsatisfiedLinkError 因为找不到共享对象)

试着看看这篇文章,靠近运行 Java Mapscript(在 Linux 上)部分。

希望有帮助!

于 2011-12-10T11:14:58.193 回答