IntelliJ не находит собственные библиотеки для OpenCV при добавлении jar в качестве зависимости для проекта Play

В настоящее время я работаю над проектом Play 2.1, в котором запросы к веб-службе будут обрабатывать загрузку предоставленных пользователем изображений, изменение их размера и повторную обрезку, а также фильтрацию известных плохих фотографий (например, мы не хотят, чтобы пользователи загружали логотипы компании). Мы пытаемся использовать OpenCV для обработки внутренней работы, но я не могу заставить IntelliJ добавить банку OpenCV таким образом, чтобы это работало с проектом java.

Мне удалось без проблем собрать OpenCV из исходного кода. У меня осталась следующая папка: / home / charles / opencv / release

Внутри этой папки у меня есть три интересных файла:

  1. bin / opencv-246.jar
  2. lib / cv2.so
  3. lib / libopencv_java246.so

Если я попытаюсь добавить файл jar в IntelliJ в качестве новой библиотеки Java, он, по-видимому, найдет все классы / методы, и я могу написать код, используя автозаполнение. Я также могу щелкнуть соответствующие классы или методы, и это приведет меня к нужным файлам.

Однако когда я пытаюсь запустить проект Play, я получаю такую ​​ошибку:

[info] Loading project definition from /home/charles/Github/ImageProject
[info] Set current project to ImageProject (in build file:/home/charles/Github/ImageProject/)

--- (Running the application from SBT, auto-reloading is enabled) ---

[info] play - Listening for HTTP on /0:0:0:0:0:0:0:0:9000

Server started, use Alt+D to stop

[info] Compiling 1 Java source to /home/charles/Github/ImageProject/target/scala-2.10/classes...
[error] /home/charles/Github/ImageProject/app/controllers/Application.java:7: error: package org.opencv.core does not exist
[error] import org.opencv.core.Core;
[error]                       ^

Я также попытался добавить копию файла jar непосредственно в проект (поэтому поместил opencv-246.jar в ImageProject / lib), а затем вместо этого добавил библиотеку java из этого места. Но это оставляет меня с другой ошибкой:

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

Я подозреваю, что часть проблемы может быть связана с собственными библиотеками, которые использует оболочка Java OpenCV (файл 2 или 3 выше). В Eclipse, когда вы добавляете файл jar, вы можете явно указать расположение собственной библиотеки, что позволяет OpenCV нормально работать. Я читал предложения по использованию этого для решения проблемы:

-Djava.library.path=/home/charles/opencv/release/lib

Но это, похоже, не работает (хотя, возможно, я устанавливаю его не в том месте? Я пробовал установить его как параметр JVM в конфигурации запуска для проекта и в настройках IDE, но, похоже, ни то, ни другое использовали или уважали).

Примечание. Чтобы еще раз уточнить, это проект Play2, а не Android. Кажется, есть некоторая помощь для Android, которая в данном случае не актуальна.

Кажется, это должно быть довольно прямолинейно, но я потратил несколько дней, пытаясь найти ответ на данный момент, и до сих пор ничего не имею. Любые идеи?

Дополнительные сведения: Я также пробовал следовать "Запускам образцов SBT" документации OpenCV здесь: http://docs.opencv.org/doc/tutorials/introduction/desktop_java/java_dev_intro.html

И я тоже получаю аналогичную ошибку:

charles@charles-VirtualBox:~/JavaSample$ sbt run
[info] Loading project definition from /home/charles/JavaSample/project
[info] Set current project to JavaSample (in build file:/home/charles/JavaSample/)
[info] Compiling 1 Java source to /home/charles/JavaSample/target/scala-2.10/classes...
[info] Running HelloOpenCV 
Hello, OpenCV
[error] (run-main) java.lang.UnsatisfiedLinkError: no opencv_java246 in java.library.path
java.lang.UnsatisfiedLinkError: no opencv_java246 in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1856)
    at java.lang.Runtime.loadLibrary0(Runtime.java:845)
    at java.lang.System.loadLibrary(System.java:1084)
    at HelloOpenCV.main(HelloOpenCV.java:47)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
[trace] Stack trace suppressed: run last compile:run for the full output.
java.lang.RuntimeException: Nonzero exit code: 1
    at scala.sys.package$.error(package.scala:27)
[trace] Stack trace suppressed: run last compile:run for the full output.
[error] (compile:run) Nonzero exit code: 1
[error] Total time: 2 s, completed Jul 17, 2013 5:11:39 PM

person Charles Bergmeier    schedule 17.07.2013    source источник
comment
Эта [ошибка] /home/charles/Github/ImageProject/app/controllers/Application.java:7: error: package org.opencv.core не существует, кажется мне проблемой java cp, а не проблемой собственной библиотеки. Думаю, ваш SBT настроен неправильно.   -  person morpheus05    schedule 17.07.2013
comment
У вас есть пример настройки SBT в этом случае?   -  person Charles Bergmeier    schedule 18.07.2013
comment
См. Мой ответ на заголовок stackoverflow.com/questions/24856501/ собственная библиотека обычно является зависимостью времени выполнения, поэтому вы должны указать, как виртуальная машина находит ее при запуске -time, а не IntelliJ во время компиляции.   -  person Andrew Mackenzie    schedule 05.05.2016


Ответы (3)


Если вы хотите использовать OpenCV или любые другие собственные библиотеки в Playframework, вы ДОЛЖНЫ запускать свое приложение с помощью команды «play start», а не «play run».

Команда «play run» запускает ваше приложение в режиме разработки, а команда «play start» запускается в производственном режиме. Я не знаю всех различий между ними, но одно очевидное:

Только когда мы используем "play start", запускается новая JVM для вашего приложения и загружаются собственные библиотеки, указанные вами в System.load ("/ absolute / path / to / your / so / или / jnilib / inOSX / not / dylib /filename.jnilib ");

Ниже описано, как загрузить родную библиотеку.

Создайте Global.java с пустым именем пакета. (см. эту ссылку)

public class Global extends GlobalSettings {

    @Override
    public void beforeStart(Application app) {
        // TODO Auto-generated method stub
        super.beforeStart(app);

        String libopencv_java = "/Users/yoonjechoi/git/myFirstApp/target/native_libraries/64bits/libopencv_java246.jnilib";
        System.load(libopencv_java);
    }
}

тогда вы можете использовать классы OpenCV в контроллерах вашего приложения Play.

System.loadLibrary ("opencv_java246") не работает. Не знаю почему. У меня нет времени разбираться, почему. -_-;

Пожалуйста, дайте подсказки, если знаете почему.

person Yoonje Choi    schedule 19.07.2013
comment
Вы палочка-выручалочка! Я много дней борюсь с этой проблемой. Это определенно работает. Что касается того, почему System.loadLibrary не работает, я считаю, что это как-то связано с собственной библиотекой OpenCV, которая не находится в java.library.path (поэтому она не знает абсолютного пути для доступа к файлу). Я предполагаю, что есть небольшая настройка, которую можно сделать, чтобы это работало? - person Charles Bergmeier; 22.07.2013

для Windows 64 бит установлен

-Djava.library.path = / полный путь / OpenCV / build / java / x64

person user1114134    schedule 03.08.2013

Я бы использовал lib / libopencv_java246.so

Всегда важно сопоставить файл .so с библиотекой сборки. Это должно работать из коробки

person Damilola    schedule 22.08.2013