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
- CalculatorService (die als Herausgeber fungiert)
- CalculatorClient (die als Teilnehmer fungieren)
Das ist meine Projektstruktur
Wenn ich versuche zu laufen CalculatorService
Es wird ausgeführt und der Dienst ist aktiv. Dann, sobald die CalculatorService
ACTIVE
ist, starte ich die CalculatorClient
. Aber es bleibt im RESOLVED
Status und ist nicht ACTIVE
.
In-Trotz nicht die CalculatorClient Bundle ACTIVE
erhalten zu können, habe ich versucht, diesen Dienst starten und eine gogo Ausnahme bekam wie folgt.
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.
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. –
@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? –
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. –