2017-08-02 2 views
0

Ich arbeite an der Eclipse-IDE und versuche, OSGI-Bundle-Projekte auszuführen. Ich habe 2 Pakete mit Plugin-Projekten erstellt.Ausführen von OSGI-Bundle-Projekten

  1. CalculatorService (die als Herausgeber fungiert)
  2. CalculatorClient (die als Teilnehmer fungieren)

Das ist meine Projektstruktur

project structure

Wenn ich versuche zu laufen CalculatorService Es wird ausgeführt und der Dienst ist aktiv. Dann, sobald die CalculatorServiceACTIVE ist, starte ich die CalculatorClient. Aber es bleibt im RESOLVED Status und ist nicht ACTIVE.

Service status

In-Trotz nicht die CalculatorClient Bundle ACTIVE erhalten zu können, habe ich versucht, diesen Dienst starten und eine gogo Ausnahme bekam wie folgt.

gogo exception

Da diese Ausnahme, sagt, dass es etwas erraneous mit meiner start() Methode des CalculatorClient Bündels ist, ich habe es hiermit angebracht.

package calculatorclient; 

import java.io.BufferedReader; 
import java.io.InputStreamReader; 

import org.osgi.framework.BundleActivator; 
import org.osgi.framework.BundleContext; 
import org.osgi.framework.ServiceReference; 

import calculatorservice.ICalculatorService; 

public class CalculatorClient implements BundleActivator { 

    ServiceReference servRef; 
    private static BundleContext context; 

    static BundleContext getContext() { 
     return context; 
    } 

    /* 
    * (non-Javadoc) 
    * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext) 
    */ 
    public void start(BundleContext bundleContext) throws Exception { 
     CalculatorClient.context = bundleContext; 
     System.out.println("Start calculate client service"); 
     servRef = context.getServiceReference(ICalculatorService.class.getName()); 
     ICalculatorService calc = (ICalculatorService)context.getService(servRef); 

     //Print 
     System.out.println("Enter Operator"); 
     BufferedReader br1 = new BufferedReader(new InputStreamReader(System.in)); 
     String oper = br1.readLine(); 
     BufferedReader br2 = new BufferedReader(new InputStreamReader(System.in)); 
     double no1 = Double.parseDouble(br2.readLine()); 
     BufferedReader br3 = new BufferedReader(new InputStreamReader(System.in)); 
     double no2 = Double.parseDouble(br3.readLine()); 

     System.out.print("Answer is "); 
     calc.calculateService(oper, no1, no2); 

    } 

    /* 
    * (non-Javadoc) 
    * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext) 
    */ 
    public void stop(BundleContext bundleContext) throws Exception { 
     CalculatorClient.context = null; 
     System.out.println("Good Bye !!!"); 
     context.ungetService(servRef); 
    } 

} 

Der Aktivator Klasse des CalculatorService Bündel

package calculatorservice; 

import org.osgi.framework.BundleActivator; 
import org.osgi.framework.BundleContext; 
import org.osgi.framework.ServiceRegistration; 

public class CalculatorActivator implements BundleActivator { 

    ServiceRegistration servReg; 
    private static BundleContext context; 

    static BundleContext getContext() { 
     return context; 
    } 

    /* 
    * (non-Javadoc) 
    * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext) 
    */ 
    public void start(BundleContext bundleContext) throws Exception { 
     CalculatorActivator.context = bundleContext; 
     ICalculatorService calc = new CalculatorServiceImpl(); 
     servReg = context.registerService(ICalculatorService.class.getName(), calc, null); 
    } 

    /* 
    * (non-Javadoc) 
    * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext) 
    */ 
    public void stop(BundleContext bundleContext) throws Exception { 
     CalculatorActivator.context = null; 
     servReg.unregister(); 
    } 

} 

CalculatorService MANIFEST.MF

Manifest-Version: 1.0 
Bundle-ManifestVersion: 2 
Bundle-Name: CalculatorService 
Bundle-SymbolicName: CalculatorService 
Bundle-Version: 1.0.0.qualifier 
Bundle-Activator: calculatorservice.CalculatorActivator 
Bundle-RequiredExecutionEnvironment: JavaSE-1.8 
Import-Package: org.osgi.framework;version="1.3.0" 
Bundle-ActivationPolicy: lazy 
Export-Package: calculatorservice 

CalculatorClient MANIFEST.MF

Manifest-Version: 1.0 
Bundle-ManifestVersion: 2 
Bundle-Name: CalculatorClient 
Bundle-SymbolicName: CalculatorClient 
Bundle-Version: 1.0.0.qualifier 
Bundle-Activator: calculatorclient.CalculatorClient 
Bundle-RequiredExecutionEnvironment: JavaSE-1.8 
Import-Package: calculatorservice, org.osgi.framework;version="1.3.0" 
Bundle-ActivationPolicy: lazy 

Stacktrace

!STACK 0 
org.osgi.framework.BundleException: Could not resolve module: org.sonatype.m2e.mavenarchiver [1674] 
    Unresolved requirement: Require-Bundle: org.eclipse.m2e.jdt; bundle-version="[1.0.0,2.0.0)" 
    -> Bundle-SymbolicName: org.eclipse.m2e.jdt; bundle-version="1.6.2.20150902-0002"; singleton:="true" 
     org.eclipse.m2e.jdt [1376] 
     Unresolved requirement: Require-Bundle: org.eclipse.m2e.core; bundle-version="[1.6.0,1.7.0)" 
      -> Bundle-SymbolicName: org.eclipse.m2e.core; bundle-version="1.6.2.20150902-0002"; singleton:="true" 
       org.eclipse.m2e.core [1371] 
       Unresolved requirement: Require-Bundle: org.eclipse.m2e.workspace.cli; bundle-version="0.1.0" 

    at org.eclipse.osgi.container.Module.start(Module.java:434) 
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.incStartLevel(ModuleContainer.java:1582) 
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.incStartLevel(ModuleContainer.java:1562) 
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.doContainerStartLevel(ModuleContainer.java:1533) 
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.dispatchEvent(ModuleContainer.java:1476) 
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.dispatchEvent(ModuleContainer.java:1) 
    at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230) 
    at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:340) 

Irgendwelche Vorschläge auf, warum ich bin nicht in der Lage diese CalculatorClient Bündel zu erhalten aus dem RESOLVED Zustand in einen ACTIVE Zustand gehen wird sehr geschätzt.

+0

Wenn Sie Equinox verwenden, schauen Sie in den Konfigurationsordner Ihres OSGi-Containers. Equinox fügt die Fehlermeldungen in einige eindeutig benannte Dateien im Konfigurationsordner ein, wenn nicht anders angegeben. Da Sie nicht wissen können, in welcher Reihenfolge Ihre Pakete gestartet werden, sollten Sie context.getService() in Ihrer Startmethode eines Activators niemals verwenden, da das andere Paket möglicherweise noch nicht gestartet wurde. –

+0

@BalazsZsoldos. In meinem Projekt starte ich zunächst das CalculatorService-Paket, indem ich mit der rechten Maustaste auf die Datei "MANIFEST.MF" dieses Pakets klicke und dann "Ausführen als" -> "OSGI-Framework" wähle. Und sobald das 'CalculatorService-Bundle' ACTIVE' ist, mache ich dasselbe auf der 'MANIFEST.MF' des 'CalculatorClient'-Bundles. Also in diesem Fall wird das Bündel nicht einzeln in der gleichen Reihenfolge gestartet, die ich sie unabhängig von dem 'context.getService() ausführen? –

+0

Nun, es gibt eine Ausnahme irgendwo in Ihrer Startmethode, aber ich weiß nicht, wo sein Stacktrace geschrieben wird. Daher kann ich nur die hässliche Lösung vorschlagen, dass du deinen entiry body von der Startmethode mit einem try-catch einpacken solltest, und einen e.printstacktrace im catch aufrufen. Sie werden zumindest die wirkliche Ausnahme sehen. –

Antwort

0

Ich habe ein paar kleine Änderungen an beiden Activator-Klassen vorgenommen.

  • Rather das Bündel Kontextinstanz als die Verwendung von Methoden und start()stop() deklariert, verwendete ich Objektparameter innerhalb der start() und stop() Methoden Bundlecontext.

  • Fügen Sie eine @Override Annotation direkt vor den Methoden start() und stop() hinzu.

  • Fügen Sie eine Annotation @Override direkt vor der Methodendeklaration in der Klasse hinzu, die die Schnittstelle innerhalb des Publisher-Bundles implementiert.

  • Entfernen Sie alle unnötigen Standarddeklarationen, die während der Projektinitialisierung aus den Activator-Klassen erstellt wurden.

Publisher Activator Klasse

package calculatorservice; 

import org.osgi.framework.BundleActivator; 
import org.osgi.framework.BundleContext; 
import org.osgi.framework.ServiceRegistration; 

public class CalculatorActivator implements BundleActivator { 

    ServiceRegistration serviceRegistration; 

    @Override 
    public void start(BundleContext bundleContext) throws Exception { 
     ICalculatorService iCalculatorService = new CalculatorServiceImpl(); 
     serviceRegistration = bundleContext.registerService(ICalculatorService.class.getName(), iCalculatorService, null); 
    } 

    @Override 
    public void stop(BundleContext bundleContext) throws Exception { 
     serviceRegistration.unregister(); 
    } 

} 

Publisher Implementierungsklasse

package calculatorservice; 

public class CalculatorServiceImpl implements ICalculatorService{ 
    @Override 
    public void calculateService(String operator, double no1, double no2){ 
     String PLUS = "+"; 
     String MINUS = "-"; 
     String MUL = "*"; 
     String DIV = "/"; 
     if(PLUS.equals(operator)) 
     { 
      System.out.print((no1+no2)); 
     } 
     else if (MINUS.equals(operator)){ 
      System.out.println((no1-no2)); 
     } 
     else if (MUL.equals(operator)){ 
      System.out.print((no1*no2)); 
     } 
     else if(DIV.equals(operator)){ 
      if(no2 == 0.0){ 
       System.out.print(" \"Divide by zeo error \" "); 
      } 
      else{ 
       System.out.print((no1/no2)); 
      } 
     } 
     else if (operator == ""){ 
      System.out.print(" \"Enter value for operator\" "); 
     } 
     else{ 
      System.out.print(" \"Enter one of the operators +_*/ \" "); 
     } 
    } 
} 

Kunden Activator Klasse

package calculatorclient; 

import java.io.BufferedReader; 
import java.io.InputStreamReader; 

import org.osgi.framework.BundleActivator; 
import org.osgi.framework.BundleContext; 
import org.osgi.framework.ServiceReference; 

import calculatorservice.ICalculatorService; 

public class CalculatorClient implements BundleActivator { 

    ServiceReference serviceReference; 

    @Override 
    public void start(BundleContext bundleContext) throws Exception { 
     System.out.println("Start calculate client Service"); 
     serviceReference = bundleContext.getServiceReference(ICalculatorService.class.getName()); 
     ICalculatorService iCalculatorService = (ICalculatorService)bundleContext.getService(serviceReference); 

     System.out.println("Enter operator"); 
     BufferedReader br1 = new BufferedReader(new InputStreamReader(System.in)); 
     String operator = br1.readLine(); 

     System.out.println("Enter no1 = "); 
     BufferedReader br2 = new BufferedReader(new InputStreamReader(System.in)); 
     double no1 = Double.parseDouble(br2.readLine()); 

     System.out.println("Enter no2 = "); 
     BufferedReader br3 = new BufferedReader(new InputStreamReader(System.in)); 
     double no2 = Double.parseDouble(br3.readLine()); 

     iCalculatorService.calculateService(operator,no1,no2); 
    } 

    @Override 
    public void stop(BundleContext bundleContext) throws Exception { 
     System.out.println("Good Bye!!!"); 
     bundleContext.ungetService(serviceReference);  
    } 

} 

Und dann begann ich die MANIFEST.MF des Herausgebers separat. Sobald das ACTIVE war, startete ich die MANIFEST.MF des Clients. Sobald beide diese waren ACTIVE Starten Sie den Client-Dienst und das Programm wird ordnungsgemäß ausgeführt.