2009-01-12 23 views
7

Ho un'applicazione che viene eseguita come una raccolta di pacchetti OSGi. Lo avvio usando un wrapper molto piccolo che incorpora il framework Felix. La necessità di quel wrapper mi infastidisce un po ', così come il fatto che dipenda da Felix (mentre l'applicazione stessa potrebbe funzionare altrettanto bene nell'equinozio), quindi voglio liberarmene e usare Felix di default launcher.accesso agli argomenti della riga di comando dal bundle OSGi

L'unica cosa che il wrapper fa veramente è passare gli argomenti della riga di comando nel framework OSGi lanciato, in modo che un bundle possa reagire su di essi. Si noti che in realtà non analizza gli argomenti, ma inserisce la stringa [] nella mia applicazione.

Esiste un modo standard (o almeno un modo standard Felix) per accedere ai parametri della riga di comando da un pacchetto, in modo da poter eliminare l'avvio personalizzato?

+0

Come è potuto rivelarsi? Sei andato con l'opzione di avvio del framework, alla fine, con i parametri J-DM? In tal caso, sarebbe possibile pubblicare alcune informazioni sulla soluzione? Grazie. – Chris

risposta

1

Probabilmente no. Penso che il launcher standard di Felix esegua alcune convalide della riga di comando e accetta solo la dir della cache del bundle come argomento. Più di un argomento e il programma di avvio si chiude.

È possibile utilizzare le proprietà di sistema per passare le informazioni nella riga di comando e penso che funzioni non solo in felix ma anche in altri contenitori osgi, ma probabilmente rende l'applicazione non molto intuitiva.

+0

Sì. "-Dhis -DandThat" sembra funzionare, ma è davvero brutto ... – Thilo

2

Risposta tardiva ma forse qualcuno lo trova utile.

Avevo lo stesso problema. La mia applicazione gira in OSGi ma ho interfacce esterne che devo rispettare, il che implica la lettura degli argomenti della riga di comando.

La chiave per questo è qualcosa definito nella nuova specifica OSGi 4.2, ovvero il lancio del framework. Puoi leggere a riguardo nella Draft spec (che si trova sotto Draft su www.osgi.org) nella sezione Layer del ciclo di vita.

È un modo standard di avviare un framework OSGi (qualsiasi implementazione che supporti OSGi 4.2) da un'applicazione java autonoma. La cosa bella è che non è necessario sapere quale implementazione si avvia (Felix, Equinox, ...) finché si trova nel CLASSPATH.

In questo modo, l'applicazione di avvio legge gli argomenti della riga di comando, crea un'istanza e avvia un framework OSGi e passa gli argomenti al pacchetto (in qualsiasi modo si desideri). Quello che ottieni nell'applicazione di avvio è un contesto del framework da cui puoi comunicare con i tuoi bundle.

A partire da Equinox 3.5M6 (penso, beh, almeno M6) questo è supportato. Supporta anche l'ultima versione di Apache Felix.

+2

Vorrei dare un milione di dollari per alcuni link cosparsi in questa risposta – drozzy

+1

Il lancio di un framework OSGI è abbastanza ben descritto, sono d'accordo, ma non tanto il "passare [ing] gli argomenti al tuo pacchetto". –

7

Se si utilizza bnd (strumenti) è possibile utilizzare il suo launcher. Registra gli argomenti della riga di comando come proprietà di servizio 'launcher.arguments'.

Ciò funziona estremamente bene quando lo si combina con il comando bnd package. Questo comando accetta un bnd project o un file bndrun che descrive l'ambiente in esecuzione (bundle, proprietà, framework) e si trasforma in un jar principale autonomo. Così sviluppi e fai il debug in bndtools e quando sei felice lo trasformi in un singolo jar eseguibile. Esempio:

@Component 
public class MyApp { 
    String args; 

    @Activate 
    void activate() { 
     System.out.println("Args: " + args); 
    } 

    @Reference(target="(launcher.arguments=*)") 
    void args(Object object, Map<String,Object> map) { 
     args = (String) map.get("launcher.arguments"); 
    } 
} 

# to turn into an executable 
bnd package myapp.bnd 
java -jar myapp.jar -a somearg *.file 
1

Sono consapevole che hai cercato solo Felix. Quindi, questa soluzione solo Equinox potrebbe non essere utile. Lascio qui, perché qualcun altro potrebbe inciampare su questa domanda e ha Equinox in esecuzione.

Da qualsiasi pacchetto e qualsiasi struttura, potrebbe essere difficile. Se si utilizza org.eclipse.core.runtime.punto di estensione delle applicazioni, dovrebbe essere facile. Prerequisito: NON si passa -console come parametro.

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 
    } 
} 

riferimento in plugin.xml

<plugin> 
    <extension 
      id="myApp" 
      point="org.eclipse.core.runtime.applications"> 
     <application> 
      <run class="package.Application" /> 
     </application> 
    </extension> 
</plugin> 
Problemi correlati