2011-12-15 21 views
6

Estoy intentando escribir una aplicación de escritorio basada en OSGi. Tengo un Swing JFrame y quiero agregar posibilidades para agregar módulos (otros paquetes). Caminé a través de EclipseZone OSGi at JSig tutorial, pero todas las aplicaciones se inician desde OSGi Framework (en este caso, Knopflerfish OSGi Desktop).Uso de OSGi en una aplicación de escritorio independiente

Entonces, ¿mi pregunta es si existe la opción de iniciar la aplicación sin un marco OSGi visible? Sé que, desde el código, es posible cambiar las propiedades de un paquete, pero ¿cómo cambiar las propiedades de un marco de esa manera? (Por ejemplo, la ubicación de almacenamiento paquete por defecto, la acción por defecto cuando paquete está en la ubicación, etc.?)

public class MainFrame extends ServiceTracker implements BundleActivator { 

    public MainFrame(BundleContext context, JToolBar toolBar) { 
     // select, which services is the bundle tracking 
     super(context, JMenu.class.getName(), null); 
    } 

    @Override 
    public void start(BundleContext context) throws Exception { 
     //display a JFrame 
    } 

    @Override 
    public void stop(BundleContext context) throws Exception { 
     //hide a JFrame 
    } 

    @Override 
    public Object addingService(ServiceReference reference) { 
     // Process a Service and return a JMenu 
     return new JMenu(); 
    } 

    @Override 
    public void removedService(ServiceReference reference, Object service) { 
     // remove a JMenu from a JFrame 
    } 

    public static void main(String[] args) { 
     // ???????????????????????????????????????????? 
     // ???????????????????????????????????????????? 
    } 
} 

He escrito una clase por encima (He publicado sólo un esbozo), pero no tengo ni idea, lo que debe escribir en una función main(). Este paquete funciona bien en Knopflerfish OSGi Desktop, pero quiero que funcione sin él.

Respuesta

12

Su código es básicamente bien, pero parece que usted desea más control sobre el marco OSGi en sí. En otras palabras, desea saber cómo iniciar un marco OSGi y comenzar su paquete. El problema que tiene actualmente es que está utilizando el iniciador de otra persona (el Knopflerfish uno) que incluye la consola de la interfaz gráfica de usuario de KF, y lo está utilizando para instalar e iniciar su paquete. Sin embargo, nada de eso es necesario.

En la respuesta de AValchev él habla acerca de iniciar Equinox con java -jar org.eclipse.osgi.jar -console. El problema con este enfoque es que le da un marco vacío OSGi, por lo que tendrá que escribir comandos en el shell OSGi para instalar y comenzar su paquete ... ¡tampoco es ideal!

Creo que deberías escribir tu propio lanzador. Esto es realmente muy simple y se puede hacer de una manera que es completamente independiente de los implementos del marco OSGi en particular. Escribí sobre esto en un blog post hace un momento.

En pseudo-código, el lanzador de aplicaciones debe ser algo como esto:

public static void main() { 

    1. get a FrameworkFactory using java.util.ServiceLoader. 
    2. create an OSGi framework using the FrameworkFactory 
    3. start the OSGi framework 
    4. Install your bundle(s). 
    5. Start all the bundles you installed. 
    6. Wait for the OSGi framework to shutdown. 

} 

En su pregunta usted específicamente sobre la configuración de la ubicación de almacenamiento paquete. Esto puede hacerse configurando la propiedad Constants.FRAMEWORK_STORAGE en el Mapa que pasa al método FrameworkFactory.newFramework.

+0

Gracias! La publicación del blog en sí misma lo resolvió. – Benjamin

+0

vínculo a la publicación del blog roto. –

1

Si desea utilizar componentes Swing no necesita Knopflerfish OSGi Desktop en absoluto. Simplemente descargue EclipseRT Starter Kit y coloque sus complementos allí.

Otra forma muy simple de utilizar OSGi es:

java -jar org.eclipse.osgi.jar -console 

Con este comando se ha comenzado equinoccio y se puede instalar sus paquetes desde la consola.

puede encontrar muy buen tutorial here

En su caso sólo hay que poner en JFrame initalzation inicio) método (:

@Override 
public void start(BundleContext context) throws Exception { 
    JFrame jf = new JFrame(); 
    ..... 
} 
-2

No estoy seguro de qué es exactamente lo que quiere hacer, pero si Estamos buscando una forma modular para escribir aplicaciones Swing y luego echar un vistazo a la plataforma NetBeans. El sistema de módulo central no es OSGi pero puede "hablar" con módulos OSGi si es necesario.

1

Eclipse RCP es una buena opción para escribir clientes de aplicaciones. Está completamente basado en OSGi, y proporciona un amplio conjunto de herramientas para la programación de la interfaz de usuario también. Eclipse también proporciona el entorno de desarrollo para construirlos.

Una vez creado, tendrá una aplicación independiente que simplemente se basa en OSGi, pero que no requiere interacción con OSGi para ejecutarse, que es lo que creo que está tratando de lograr.

Eclipse RCP Tutorial

Cuestiones relacionadas