# equinox OSGi EclipseStarter.startup NullPointerException



## bananenkasper (1. Jul 2009)

Hallo zusammen,

ich möchte die Equinox Umgebung programmatisch starten.
Dazu benutze ich folgenden Code:


```
class EquinoxRunner {

	private EquinoxRunner() {

	}

	public static BundleContext start(String path) throws Exception {
		if (path != null)
			setProperties(path);
		return EclipseStarter.startup(new String[] { "-console", "-clean" },
				null);
	}

	private static void setProperties(String path) throws IOException {
		Properties properties = new Properties();
		properties.load(new FileInputStream(new File(path)));
		EclipseStarter.setInitialProperties(properties);
	}
}
```

Starte ich das Programm direkt aus Eclipse läuft es problemlos.
Wenn ich es allerdings als "Runnable JarFile" exportiere, und dann über die Console starte, bekomme ich eine NullPointerException:

```
java.lang.NullPointerException
	at java.io.File.<init>(File.java:277)
	at org.eclipse.osgi.internal.baseadaptor.BaseStorage.getBundleContent(BaseStorage.java:656)
	at org.eclipse.osgi.internal.baseadaptor.BaseStorage.createBundleFile(BaseStorage.java:665)
	at org.eclipse.osgi.baseadaptor.BaseAdaptor.createBundleFile(BaseAdaptor.java:466)
	at org.eclipse.osgi.baseadaptor.BaseData.getBundleFile(BaseData.java:394)
	at org.eclipse.osgi.baseadaptor.BaseData.getEntry0(BaseData.java:111)
	at org.eclipse.osgi.baseadaptor.BaseData.getEntry(BaseData.java:102)
	at org.eclipse.osgi.framework.internal.core.AbstractBundle.getEntry0(AbstractBundle.java:1232)
	at org.eclipse.osgi.framework.internal.core.Framework.findInSystemBundle(Framework.java:558)
	at org.eclipse.osgi.framework.internal.core.Framework.findVMProfile(Framework.java:504)
	at org.eclipse.osgi.framework.internal.core.Framework.loadVMProfile(Framework.java:420)
	at org.eclipse.osgi.framework.internal.core.Framework.initialize(Framework.java:224)
	at org.eclipse.osgi.framework.internal.core.Framework.<init>(Framework.java:157)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.startup(EclipseStarter.java:286)
	at meinjarfile.starter.EquinoxRunner.start(EquinoxRunner.java:20)
```


----------



## Wildcard (1. Jul 2009)

Als runnable jar? Ob das überhaupt funktionieren kann...
Das ist eigentlich nur für sehr einfache Projekte brauchbar (die jars werden entpackt und in dein jar kopiert).
Ab 3.5 wird glaube ich ein eigener Classloader untergeschoben und spätestens dann wird es mit den OSGi Classloader Hierarchien nicht mehr passen.


----------



## bananenkasper (2. Jul 2009)

Es ist möglich, Equniox programmatisch zu starten.
Über die statische Methode "EclipseStarter.startup()", die einem den BundleContext zurück gibt.
Um Zugriff auf die Methode zu haben, muss man "org.eclipse.osgi_3.x...jar" im ClassPath haben.
Ich habe in Eclipse 3.5 das jar wie jede andere externe lib den "Refeferenced Libraries" hinzugefügt.

Dann habe ich das Projekt als "Runnable Jar" exportiert. Dabei kann man seid Eclipse 3.5 eine Auswahl treffen, wie externe libs gehandhabt werden sollen: Unter Anderem steht zur Auswahl, sie in dein jar zu extrahieren, oder auch als jar-in-jar file in dein jar zu packen.
Ich habe beides (ohne Erfolg) ausprobiert.

Wie gesagt funktioniert läuft das ganze, wenn ich es direkt unter Eclipse ausführe.

Ich vermute daher, dass es ein Problem mit dem Eclipse Export ist.



Wildcard hat gesagt.:


> Ab 3.5 wird glaube ich ein eigener Classloader untergeschoben und spätestens dann wird es mit den OSGi Classloader Hierarchien nicht mehr passen.



Das verstehe ich nicht... Was meinst du?


----------



## Wildcard (2. Jul 2009)

Was ich meine ist: ich denke nicht das du mit dem Runnable Jar weit kommen wirst, das ist für einfache Projekte, nicht für ein OSGi Framework mit komplexem Classloading.
Exportier deine jar, pack die anderen jars daneben und trag sie als Classpath im Manifest ein.


----------

