首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >仅在服务器上从Indri库java.lang.UnsatisfiedLinkError..change到java.lang.NoClassDefFoundError

仅在服务器上从Indri库java.lang.UnsatisfiedLinkError..change到java.lang.NoClassDefFoundError
EN

Stack Overflow用户
提问于 2014-07-15 15:30:36
回答 1查看 1.1K关注 0票数 0

我有一个web应用程序,我在其中使用indri.jar。我用的是月食。

我已经将它放在lib文件夹中,并执行了“”选项。

此外,在“构建路径->配置->顺序和导出”中,将检查所有内容。

在“属性->部署程序集”中,还添加了所有jar文件。然后,我将项目导出到.war,并将其放到服务器上。

我检查了已部署项目的lib文件夹,jar文件就在那里。

另外,我的机器和服务器都是64位的,因为对于这个库,32位和64位有两个版本,如果您使用它们而不是彼此使用,它就不能工作。

同样重要的是,我们是一个使用git存储库来处理这个项目的团队,当另一方拉出代码时,所有库和所有东西都附加在一起,它们在运行代码时没有问题。(他们安装了indri,我在服务器上安装了indri)

不过,当我在浏览器中打开页面时,它会给我“ajax调用中的错误”,当我跟踪它给我的错误时:

代码语言:javascript
复制
description The server encountered an internal error () that prevented it from fulfilling    this request.


exception

javax.servlet.ServletException: org.glassfish.jersey.server.ContainerException: java.lang.UnsatisfiedLinkError: no indri_jni in java.library.pathorg.etc.


root cause

org.glassfish.jersey.server.ContainerException: java.lang.UnsatisfiedLinkError: no indri_jni in java.library.pathorg.glassfish.etc


root cause

java.lang.UnsatisfiedLinkError: no indri_jni in java.library.pathjava.lang.ClassLoader.loadLibrary(ClassLoader.java:1886)java.lang.Runtime.loadLibrary0.etc.

我搜索了很多,然后在服务器上运行了这一行:

代码语言:javascript
复制
java -Djava.library.path=/path/to/jnilib/directory MainClass

然后,错误更改为:

代码语言:javascript
复制
exception

javax.servlet.ServletException: org.glassfish.jersey.server.ContainerException: java.lang.NoClassDefFoundError: Could not initialize class lemurproject.indri.indriJNIorg.glassfish

root cause

org.glassfish.jersey.server.ContainerException: java.lang.NoClassDefFoundError: Could not initialize class lemurproject.indri.indriJNIorg.glassfish.jersey.servlet

java.lang.NoClassDefFoundError: Could not initialize class lemurproject.indri.indriJNIlemurproject.indri.QueryEnvironment.<init>(QueryEnvironment.java:39)LogicLayer.IndriIndex.processQuery(I...

注意:

  1. Indri正在服务器上的命令行上工作,所以问题不是indri,而是部署。
  2. 当我通过注释与Indri相关的行来部署代码时,它可以工作,这表明我正在正确地导出到.war。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-24 14:25:50

indri安装中有一个重要的文件,即libinrdi_jni.so,它的作用是将java链接到c语言,c语言是编写库所用的语言。它位于indri安装文件夹中:./install/lib/libindri_jni.so。

我的代码找不到这个文件。所以我必须把它放在服务器上,然后它就会找到它,一切都正常了。

为了确保您有这个文件,您需要以这种方式安装indri:

./配置--启用-java--带有-javahome=address//jdk1.7.0-前缀=/address/to/indri-5.7/install

全部安装

确保下载jdk1.7并自己解压它,而不是使用任何安装包。这样就可以安装libindri_jni.so了。

然后,为了确保您的java程序能够工作,您需要运行indri文件夹中提供的IndexUI.jar和RetUI.jar。如果它有效,那么您的程序也会工作,但是如果它不能工作,那么尝试运行以下命令:

导出LD_LIBRARY_PATH=/address/to/indri-5.7/install/lib

然后再次运行jar文件,如果问题已经解决,那么libindri_jni.so文件就是问题所在,您可以通过将其定位到程序确实可以找到的位置来解决它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24762274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档