acceder a los argumentos de la línea de comandos del paquete OSGi

Tengo una aplicación que se ejecuta como una colección de paquetes OSGi. Lo empiezo usando una envoltura muy pequeña que incrusta el marco de Felix. La necesidad de ese envoltorio me molesta un poco, al igual que el hecho de que depende de Félix (mientras que la aplicación en sí podría funcionar igual de bien en, digamos, Equinox), así que quiero deshacerme de él y usar el Félix predeterminado. lanzacohetes.

Lo único que realmente hace el contenedor es pasar los argumentos de la línea de comandos al marco OSGi lanzado, para que un paquete pueda reactjsr sobre ellos. Tenga en cuenta que en realidad no analiza los argumentos, solo inserta la Cadena [] en mi aplicación.

¿Existe una forma estándar (o al menos una forma estándar de Felix) para acceder a los parámetros de la línea de comandos desde un paquete, de modo que pueda eliminar el lanzador personalizado?

Si usas bnd (herramientas) puedes usar su lanzador. Registra los argumentos de la línea de comando como una propiedad de servicio ‘launcher.arguments’.

Esto funciona extremadamente bien cuando lo combinas con el comando bnd package. Este comando toma un proyecto bnd o un archivo bndrun que describe el entorno en ejecución (paquetes, propiedades, marco) y se convierte en un jar principal independiente. Así que desarrolla y depura en bndtools y cuando está contento lo convierte en un solo archivo ejecutable. Ejemplo:

@Component public class MyApp { String args; @Activate void activate() { System.out.println("Args: " + args); } @Reference(target="(launcher.arguments=*)") void args( Object object, Map map) { args = (String) map.get("launcher.arguments"); } } # to turn into an executable bnd package myapp.bnd java -jar myapp.jar -a somearg *.file 

Respuesta tardía pero quizás alguien lo encuentre útil.

Estaba teniendo el mismo problema. Mi aplicación se ejecuta en OSGi pero tengo interfaces externas que debo cumplir, lo que implica leer los argumentos de la línea de comandos.

La clave para esto es algo definido en la nueva especificación OSGi 4.2, a saber, el lanzamiento del marco. Puede leer sobre esto en la especificación de Borrador (que se encuentra en Borrador en http://www.osgi.org) en la sección Capa de ciclo de vida.

Es una forma estándar de lanzar un marco OSGi (cualquier implementación que admita OSGi 4.2) desde una aplicación Java independiente. Lo ingenioso es que no necesitas saber qué implementación inicias (Felix, Equinox, …) mientras se encuentre en CLASSPATH.

De esta manera, la aplicación de inicio lee los argumentos de la línea de comandos, crea instancias e inicia un marco OSGi y pasa los argumentos a su paquete (de la forma que desee). Lo que obtienes en la aplicación de inicio es un Contexto al marco desde el cual puedes comunicarte con tus paquetes.

A partir de Equinox 3.5M6 (creo que, bueno, al menos M6) esto es compatible. La última versión de Apache Felix también soporta esto.

Probablemente no. Creo que el iniciador de Felix estándar realiza una validación de la línea de comandos y solo acepta el directorio de caché del paquete como argumento. Más de un argumento y el lanzador se cierra.

Puede usar las propiedades del sistema para pasar información en la línea de comandos, y creo que funciona no solo en felix sino también en otros contenedores Osgi, pero probablemente hace que su aplicación no sea muy fácil de usar.

Soy consciente de que usted buscó sólo a Félix. Entonces, esta solución solo para Equinox podría no ser útil. Lo dejo aquí, porque alguien más podría tropezar con esta pregunta y tiene Equinox funcionando.

Desde cualquier paquete y cualquier marco, puede ser difícil. Si usa el punto de extensión org.eclipse.core.runtime.applications, debería ser fácil. Condición previa: NO pasa el controlador como parámetro.

 public class Application implements IApplication { @Override public Object start(IApplicationContext context) throws Exception { String[] args = (String[])context.getArguments().get("application.args"); // args.length == 0 if no arguments have been passed } } 

Referencia en plugin.xml