【问题标题】:Native library in Tomcat UnsatisfiedLinkError + Windows + eclipseTomcat UnsatisfiedLinkError + Windows + eclipse 中的本机库
【发布时间】:2016-09-28 08:28:15
【问题描述】:

这个问题之前可能已经在 SO 上提出过,请放心,我确实检查了所有可用的解决方案。仍然无法让它运行

我的问题与这篇文章Shared native library in Tomcat UnsatisfiedLinkError中描述的完全一样

独立的 Java 应用程序运行良好。但是对于 Tomcat(9),它无法运行并抛出

java.lang.UnsatisfiedLinkError: third_party.org.chokkan.crfsuite.crfsuiteJNI.swig_module_init()V
    at third_party.org.chokkan.crfsuite.crfsuiteJNI.swig_module_init(Native Method)
    at third_party.org.chokkan.crfsuite.crfsuiteJNI.<clinit>(crfsuiteJNI.java:87)
    at third_party.org.chokkan.crfsuite.Tagger.<init>(Tagger.java:39)

我知道我的 DLL 正在加载,我还检查了我的 dll 所在的文件夹是否在 PATH 变量中。我还检查了正在加载的类,并且实际上正在加载 DLL。

我在 SO 发现了 3 种 UnsatisfiedLinkError

1) java.lang.UnsatisfiedLinkError:third_party.org.chokkan.crfsuite.crfsuiteJNI.swig_module_init()V 2) java.lang.UnsatisfiedLinkError:third_party.org.chokkan.crfsuite.crfsuiteJNI.swig_module_init()B 3)类加载器加载两次的地方。

我相信最后的 V 确实表示某些东西。但我无法弄清楚到底是什么?

我在上面分享的 SO 帖子中接受的答案之一声称它与版本有关。我不明白这是一个可接受的解决方案,因为它在作为独立的 Java 应用程序运行时运行良好。

已经浪费了很多时间,任何帮助都是可观的。

谢谢 查哈特

【问题讨论】:

  • B (Byte) 和 V (Void) 属于 swing_module_init()V 方法的签名并且只告诉返回类型是 Void (或 Byte在其他情况下),请参阅:docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/…
  • 感谢 nyyrikki 的回答,您能告诉我如何解决吗?使本机函数调用在 Web 应用程序(tomcat)中工作??谢谢
  • 在 Tomcat 中不运行时它对你有用吗(不仅加载,而且调用原生方法)?如果我从上面正确理解了您的描述,那么您更多的是指 stackoverflow 上的链接问题。如果您向我们展示使用 javah 生成的头文件,也会有所帮助。
  • 是的,当我将它作为标准 Java 应用程序运行但不能与 Tomcat 一起运行时,它可以工作。我在我的应用程序中使用了第 3 方代码。它可以在 GitHub 上找到 github.com/vinhkhuc/jcrfsuite 他正在使用 SWIG(我不熟悉 SWIG,我只是按原样使用他的代码,它可以在独立应用程序中运行)这是头文件 github.com/vinhkhuc/jcrfsuite/blob/master/src/main/java/… 这就是tomcat 应用程序失败 /third_party/org/chokkan/crfsuite/crfsuiteJNI.java(行号 85)

标签: eclipse windows tomcat java-native-interface unsatisfiedlinkerror


【解决方案1】:

我遇到了同样的问题。我终于找到了解决方案。它对我有用。

首先,我安装了 libLBFGS 和 crfsuite。您可以在此处找到说明 (http://www.chokkan.org/software/crfsuite/manual.html)。 libcrfsuite.so 将安装在 /usr/local/lib 中

其次,我编辑 tomcat 配置以加载本机库。我在 tomcat bin 文件夹中创建 setenv.sh,使用内容设置 CATALINA_OPTS 变量:

export CATALINA_OPTS="-Djava.library.path=/usr/local/bin:/usr/local/lib"

最后,我使用了自定义 ServletContextListener 并通过 System.load() 显式加载 libcrfsuite.so。我去这个链接下载 lib (https://github.com/vinhkhuc/jcrfsuite/tree/master/src/main/resources/crfsuite-0.12)

【讨论】:

    【解决方案2】:

    我遇到了类似的问题,但 Tomcat 没有。 我最终从他们的一个类中复制了逻辑并简单地调用:

    static {
        try {
            CrfSuiteLoader.load();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-06-12
      • 1970-01-01
      • 1970-01-01
      • 2017-02-23
      • 1970-01-01
      • 2013-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多