kackb00n: OSGi - Custom Launcher - Service-Registrierung

Hallo!

Ich probiere mich zur Zeit in OSGi einzuarbeiten, tue mich dabei aber an einigen Stellen relativ schwer.

Folgende Situation:

Ich habe einen eigenen Launcher, das ist nur ein "simples" Java-Projekt, momentan auch nur mit der Main-Klasse:

public class Main {

	public static void main(String[] args) {
		Map<String, String> props = new HashMap<>();
		
		try {
			Framework fw = getFactory().newFramework(props);
			fw.init();

			BundleContext ctx = fw.getBundleContext();
			AutoProcessor.process(props, ctx);
			
			// Install core bundles

			// Hier!
			
			fw.start();
			fw.waitForStop(0);
			
			System.exit(0);
		}
		catch(Exception e) {
			e.printStackTrace(System.err);
			System.exit(1);
		}
	}
	
	public static FrameworkFactory getFactory() {
		return ServiceLoader.load(FrameworkFactory.class).iterator().next();
	}

}

Dann habe ich noch ein OSGi-Bundle, dass nicht viel mehr macht als ein Interface bereitzustellen.

public interface ArgumentsProvider {
	public String[] getArguments();
}

Da sollen dann Argumente, die über die main(String[] args) ankommen bereit gestellt werden. Allerdings habe ich keine Ahnung wie ich nun die Dependencies setzen muss.

An der Stelle die ich im Launcher mit // Hier! markiert hab, hab ich mir etwas in der Art vorgestellt:

			ctx.registerService(
					ArgumentsProvider.class.getName(),
					new ArgumentsProvider() {
						public String[] getArguments() {
							return args;
						}
					},
					null
			);

Könnt ihr mir sagen, wie ich die Dependencies setzen muss?

MfG kackb00n

  1. Tach!

    Dann habe ich noch ein OSGi-Bundle, dass nicht viel mehr macht als ein Interface bereitzustellen.

    public interface ArgumentsProvider {
    	public String[] getArguments();
    }
    

    Ein Interface ist lediglich ein Muster, das beschreibt, was eine Klasse beinhalten muss, um zu diesem Interface kompatibel zu sein.

    					new ArgumentsProvider() {
    

    Von einem Interface können keine Instanzen erstellt werden. Aber von Klassen, die dieses Interface implementieren können Instanzen erstellt werden.

    dedlfix.

    1. Hallo!

      Da hab ich auf die schnelle eine anonyme Klasse benutzt.

      MfG kackb00n

      1. Tach!

        Da hab ich auf die schnelle eine anonyme Klasse benutzt.

        Ach, interessantes Konzept, das die da in Java haben. Wie auch immer.

        Geht denn das nicht, wenn du den unten stehenden Code oben einfügst? Kann dann die anonyme Klasse nicht auf den äußeren Scope zugreifen? Fall sie es nicht kann, ist ein Objekt der anonymen Klasse wohl doch nicht geeignet, wenn es keine Möglichkeit der Übergabe und Speicherung von args hat.

        dedlfix.

        1. Hallo!

          Lambda-Ausdrücke werden bei Java auch nur in anonyme Klassen übersetzt.

          Ganz so leicht ist das leider nicht. Wenn ich die Dependency einfach zum Classpath hinzufüge, läd die JVM das Bundle über den System-Classloader. Wenn ich dann das Bundle zur Laufzeit über OSGi lade, hab ich 2x das gleiche Interface geladen, aber über verschiedene Classloader, also ist sind es für die JVM 2 verschiedene Interfaces, die man nicht einfach umcasten kann. Und es würde auch mehr oder weniger den Sinn OSGi zu verwenden wieder aushebeln.

          Nebenbei probier ich noch einen anderen Ansatz ohne Custom Launcher, aber da muss ich erstmal gucken ob das irgendwie Sinn ergibt, was ich da schreibe.

          MfG kackb00n