【问题标题】:Running Spring boot with Opencv on Elastic Beanstalk在 Elastic Beanstalk 上使用 Opencv 运行 Spring Boot
【发布时间】:2016-06-16 12:22:24
【问题描述】:

我有一个打包为 WAR 的 Spring Boot 应用程序,它使用 OpenCV 进行一些图像处理,我想在 Elastic Beanstalk(Tomcat 环境)上运行它。有没有办法将它与原生 Opencv 库打包?

在我具有以下配置的本地机器上一切正常:

  • Tomcat 8 在 Eclipse 中运行,并在其中部署了我的应用程序。
  • 我的电脑上安装了 Opencv 3.1
  • opencv_310.jar 放在src/webapp/WEB-INF/lib
  • Opencv 添加到 Java 构建路径 (path/to/opencv/build/bin)
  • Tomcat 使用 VM 参数运行 -Djava.library.path=path/to/opencv/opencv/build/lib

这个设置工作正常,我什至可以用maven clean pakcage 打包它。

但是,如果我想部署到 Amazon Elastic Beanstalk,我不能假设 Opencv 会安装在该机器上(它不会),所以我需要以某种方式将它打包到我的 WAR 文件中,这样一切都是独立的.

当我将我的 WAR 部署到 ELB 时,我总是得到 ​​p>

java.lang.UnsatisfiedLinkError: no opencv_java300 in java.library.path

使用System.loadLibrary(Core.NATIVE_LIBRARY_NAME);加载Opencv时

我为 Opencv 的 archaic versions 找到了一些关于此的教程,但我似乎无法弄清楚如何轻松做到这一点。我很乐意提供任何提示,因为我已经坚持了很长时间。

【问题讨论】:

    标签: java opencv tomcat spring-boot amazon-elastic-beanstalk


    【解决方案1】:

    当你运行你的 tomcat 服务器时,你可以将路径传递给本地库,这样它们就会被预加载,如下所示:

    java -Djava.library.path=...
    

    另一种方法是将库放入 tomcat 的主 jar(运行 tomcat 的 jar)所在的文件夹中。

    【讨论】:

    • 当我的库安装在我的机器上时,我正在本地主机上执行此操作。您能否提供一个示例设置,如何在没有安装 opencv 的情况下在弹性 beanstalk 上执行此操作(将本机库放在 war 文件中的位置以及如何引用它)。我似乎无法正确完成这一步......
    • 您不应该将本机库投入战争(如果您不使用某些库来提取它们并动态加载,例如使用birdJ)您可以将它们作为参数传递给在哪个虚拟机上tomcat 运行,或者您可以将它们放入运行 tomcat 的 jar 所在的同一文件夹中。
    • 但是有没有办法打包和部署应用程序,使其不依赖于本地库?我不确定如何在 ELB 上处理这个......
    • 您希望如何使用使用本机库而不使用本机库的代码?您可以在运行时使用birdJ 为每个平台提取和加载适当的库,这是一个简化在每个平台上加载适当库的项目。
    • 我不确定亚马逊是否允许在您的应用程序中使用本机库...您需要先检查一下。
    【解决方案2】:

    我通过使用这个出色的Github project 解决了这个问题,它提供了与本机库打包并作为 Maven 依赖项提供的 OpenCV Java 绑定。

    这个项目还有一个更新的fork,我可能会切换到更新版本的 OpenCV。它支持 OpenCV 2.4.10,这与我使用的 3.1 版本相比有所退步,但它可以满足我的所有期望。

    【讨论】:

      猜你喜欢
      • 2019-03-01
      • 2020-04-29
      • 2014-11-24
      • 2016-04-02
      • 2016-07-01
      • 2020-10-23
      • 2017-09-28
      • 2016-11-07
      • 2017-08-09
      相关资源
      最近更新 更多