一尘不染

Tomcat中带有OpenCV的UnsatisfiedLinkError

tomcat

首先,我有一个在主要方法中运行的OpenCV的基本示例。但是,如果我在Spring Web Controller中使用OpenCV,则会引发错误。

在STS(Spring Tool Suite)的 Tomcat
服务器中运行以下代码时,出现UnsatisfiedLinkError异常,并将问题归结为以下代码:

System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
CascadeClassifier cascadeClassifier = new CascadeClassifier();

服务器和“主”应用程序的运行配置都包含指向OpenCV DLL的VM参数:

-Djava.library.path="C:\opencv\build\java\x64;C:\opencv\build\x64\vc10\bin"

作为参考,我还包括了以下stacktrace的相关位:

org.springframework.web.util.NestedServletException: Handler processing failed;
nested exception is
java.lang.UnsatisfiedLinkError: org.opencv.objdetect.CascadeClassifier.CascadeClassifier_0()J
...
Caused by: java.lang.UnsatisfiedLinkError:
org.opencv.objdetect.CascadeClassifier.CascadeClassifier_0()J
    at org.opencv.objdetect.CascadeClassifier.CascadeClassifier_0(Native Method)
    at org.opencv.objdetect.CascadeClassifier.<init>(CascadeClassifier.java:38)
    at com.immersion.test.controllers.SimpleController.createClassifier(SimpleController.java:19)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

注意:我已经阅读了几个线程,指出UnsatisfiedLinkError的主要原因是缺少System.loadLibrary(Core.NATIVE_LIBRARY_NAME)呼叫。显然这里不是这种情况,因为它是在引发异常的上方调用的。


阅读 491

收藏
2020-06-16

共1个答案

一尘不染

事实证明,在STS / Eclipse中启动Tomcat服务器的默认 运行配置
实际上只是Tomcat的启动器。这意味着添加到Tomcat“运行配置”的任何VM Args都不会传输到实际的Tomcat实例。

tcruntime-instance.batTomcat目录中进行查找 (这最终创建了tomcat Java实例),我们可以看到,只需将所需的VMArgs添加到JAVA_OPTS环境变量中,这些dll将可用于Tomcat。

TL; DR:

因此,只需将OpenCV二进制文件的位置添加到您的JAVA_OPTS环境变量中:

-Djava.library.path="C:\opencv\build\java\x64;C:\opencv\build\x64\vc10\bin"

2020-06-16