2017-04-20 3 views
0

Ich versuche, ein Java-Projekt in OSGi zu portieren. Dieses Projekt hängt von einigen JARs von Drittanbietern ab (librealsense JavaCPP presets). Ich benutze Eclipse für die Entwicklung.OSGi API-Versionskonflikt Ausnahmefehler

Ich habe die Konfiguration getestet mit einer Teilmenge von dem, was ich brauche und kläglich gescheitert. Der Code, den ich für den Test verwendet habe, ist folgendes:

package testinglibrariesplugin; 

import org.bytedeco.javacpp.RealSense.*; 
import org.osgi.framework.BundleActivator; 
import org.osgi.framework.BundleContext; 

public class Activator implements BundleActivator { 

    public void start(BundleContext context) throws Exception { 
     System.out.println("Hello World!!"); 

     try { 
      context context1 = new context(); 
      device device = context1.get_device(0); 

      String devName = device.get_name().getString(); 

      System.out.println(devName); 
     } catch(Exception e) { 
      System.out.println(e); 
     } 
    } 

    public void stop(BundleContext context) throws Exception { 
     System.out.println("Goodbye World!!"); 
    } 

} 

Manifest.mf:

... 
Bundle-ClassPath: src/bundletesting/ffmpeg-linux-x86_64.jar, 
src/bundletesting/ffmpeg-linux-x86.jar, 
src/bundletesting/ffmpeg-platform.jar, 
src/bundletesting/ffmpeg.jar, 
src/bundletesting/javacpp.jar, 
src/bundletesting/javacv.jar, 
src/bundletesting/librealsense-linux-x86_64.jar, 
src/bundletesting/librealsense-linux-x86.jar, 
src/bundletesting/librealsense-platform.jar, 
src/bundletesting/librealsense.jar, 
src/bundletesting/opencv-linux-x86_64.jar, 
src/bundletesting/opencv-linux-x86.jar, 
src/bundletesting/opencv-platform.jar, 
src/bundletesting/opencv.jar, 
. 

build.properties:

source.. = src/ 
output.. = bin/ 
bin.includes = META-INF/,\ 
       .,\ 
       src/bundletesting/ffmpeg-linux-x86_64.jar,\ 
       src/bundletesting/ffmpeg-linux-x86.jar,\ 
       src/bundletesting/ffmpeg-platform.jar,\ 
       src/bundletesting/ffmpeg.jar,\ 
       src/bundletesting/javacpp.jar,\ 
       src/bundletesting/javacv.jar,\ 
       src/bundletesting/librealsense-linux-x86_64.jar,\ 
       src/bundletesting/librealsense-linux-x86.jar,\ 
       src/bundletesting/librealsense-platform.jar,\ 
       src/bundletesting/librealsense.jar,\ 
       src/bundletesting/opencv-linux-x86_64.jar,\ 
       src/bundletesting/opencv-linux-x86.jar,\ 
       src/bundletesting/opencv-platform.jar,\ 
       src/bundletesting/opencv.jar 

Die JAR-Dateien die ich verwendet habe sind herunterladbar from my Github repo.

bekomme ich folgende Fehlermeldung:

Hello World!! 
java.lang.RuntimeException: API version mismatch: librealsense.so was compiled with API version 1.12.1 but the application was compiled with 1.9.6! Make sure correct version of the library is installed (make install) 

Da der Code nur Java arbeitet mit Ich muss annehmen, dass es ein Problem mit der Konfiguration in Eclipse/OSGi. Ich möchte diesen API-Mismatch ignorieren, aber ich bin nicht wirklich erfahren in dieser Umgebung und ich weiß nicht weiter. Wenn dies nicht der richtige Weg ist, um das Problem zu beheben, bitte sagen Sie mir.

Jede Hilfe wird geschätzt.

EDIT: Dies ist der Code, den ich in einer einfachen Java-Anwendung verwendet habe, und das funktioniert:

import org.bytedeco.javacpp.RealSense.*; 

public class Main { 

    public static void main(String[] args) { 

     context context = new context(); 
     device device = context.get_device(0); 

     String devName = device.get_name().getString(); 

     System.out.println(devName); 

    } 

} 

Ausgang: Intel RealSense SR300 wie erwartet.

EDIT 2: Ich habe meine build.properties und Manifest-Dateien

+0

Sind Sie sicher, dass dieses Problem mit OSGi zusammenhängt? Was passiert, wenn Sie Ihren Code von einer einfachen Hauptmethode in einer Java-Anwendung ausführen? –

+0

Ich habe es versucht und es funktioniert einwandfrei ... – mattdibi

+0

Haben Sie in beiden Fällen die gleichen API-Abhängigkeiten verwendet? –

Antwort

0

Der Fehler zu dieser lib beschwert:

librealsense.so was compiled with API version 1.12.1 but the application was compiled with 1.9.6! 

Es ist nicht Java zu sein scheint, es sei denn, sie nur das Entfernen vergessen, .so von dem Namen?

Wie auch immer, der Fehler erwähnt, dass Ihre App mit der falschen Version kompiliert wurde, daher handelt es sich nicht um einen Laufzeit-OSGi-Fehler (vor allem wenn Sie die Jars in Ihr App-Paket einbetten). Es ist der Bytecode Ihrer Klasse, der sich auf Code aus der Version 1.9.6 der Bibliothek zu beziehen scheint, wenn die zur Laufzeit vorhandene Version 1.12.1 ist.

Es ist schwer zu diagnostizieren (ohne jedes Glas zu überprüfen, das Sie haben), da Sie anscheinend kein richtiges Build-System verwenden (Sie haben Gläser in Ihrer Quellcodeverwaltung!).

Ich schlage vor, Sie überprüfen, dass Ihr Kompilierungsschritt die gleichen Gläser enthält, die Sie OSGi zur Laufzeit geben, also sollte dieses Problem weggehen.

+0

Ich bin sicher, dass ich die genau gleichen Gläser benutze. Ich habe kürzlich die Mantainer des JavaCPP-Projekts kontaktiert und sie haben mir gesagt, dass sie die 1.9.6-Version der Bibliothek verwenden, um diese JAR-Dateien für die Schnittstelle zu generieren. Ich denke, das ist das Problem. Auf meinem Rechner habe ich anscheinend die 1.12.1 Version der Bibliothek installiert und dies verursacht die Ausnahme. Da die Plain-Java-Version nicht bricht, kam ich zu dem Schluss, dass es das OSGi-Framework sein muss, das strengere Regeln zur Versionskompatibilität enthält ... – mattdibi