2010-09-28 9 views
11

Sto utilizzando il set di strumenti di AQute Bnd per creare un pacchetto OSGi e sono stati impacchettati con alcuni file 'risorse' dipendenti. Questo include i file * .css e * .xsd in una directory di risorse che ho creato.Come fare riferimento a un file incluso nel pacchetto OSGi quando si esegue java.io.File o FileInputStream

ho incluso quanto segue nella bundle.bnd di file:

Include-Resource: resources/=resources/ 

e quando lo faccio una generazione, il generato * file .jar ha le * css e file * .xsd nel directory delle risorse nella directory principale del file bundle jar.

Tuttavia, nel codice vero e sto avendo difficoltà nel tentativo di fare riferimento a questo come parte del mio percorso di classe:

Ho provato quanto segue:

new File("resources/example.css"); 

Ho anche provato:

URL cssFile = this.getClass().getResource("resources/example.css"); 
try 
{ 
    file = new File(cssFile.toURI())); 
} 
catch(Exception e) 
{ 
    e.printStackTrace(); 
} 

Ho ricevuto un errore NullPointException o un errore di file Impossibile trovare IOException (a seconda di quale utilizzo). Ottengo questo errore durante l'esecuzione in Eclipse Equinox in modalità Debug Configuration e Apache Felix (che stiamo usando per la nostra implementazione). Nota Sto cercando di farlo in classi Java esterne a BundleActivator.

Devo sempre fare riferimento al contesto di BundleActivator, ad es.?

/* 
* (non-Javadoc) 
* @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext) 
*/ 
@Override 
public void start(BundleContext context) throws Exception 
{ 
    /* Service to host the Bundle interface. */ 
    ServletContainerService service = new ServletContainerService(); 
    service.addServlet(new ServletContainer(new AxisServlet(), true)); 
    this.serverReg = context.registerService(ServletContainerService.class.getName(), service, null); 

    cssFile = new File(context.getClass.getResource("resource/example.css")); 
} 

penso che quanto sopra funzionerà, ma vorrà dire che dovrò passare il riferimento cssFile intorno al quale non sembra essere elegante.

Esiste un modo per fare riferimento al percorso della directory "risorse" inclusa nel file jar del bundle in una determinata classe Java che fa parte del file bundle/.jar? Se riguarda BundleContext, esiste un modo per fare riferimento a questo in qualsiasi classe Java?

Qualsiasi aiuto sarà molto apprezzato.


ho avuto uno sguardo e Including additional resources with OSGi bundles ma sembra che è necessario il BundleContext.

avrei potuto trovato una possibile soluzione a questo: http://www.vogella.de/blog/tag/plugin/

Sembra Vogella ha qualche codice di esempio per questo:

URL url; 
try { 
     url = new URL("platform:/plugin/de.vogella.rcp.plugin.filereader/files/test.txt"); 
    InputStream inputStream = url.openConnection().getInputStream(); 
    BufferedReader in = new BufferedReader(new InputStreamReader(inputStream)); 
    String inputLine; 

    while ((inputLine = in.readLine()) != null) { 
     System.out.println(inputLine); 
    } 

    in.close(); 

} catch (IOException e) { 
    e.printStackTrace(); 
} 

Qualcuno sa se questo percorso è lo stesso se non è un plugin e se sto usando diversi ambienti OSGi ad es. Equinox Eclipse vs. Apache Felix? ad es. url = new URL("platform:/plugin/de.vogella.rcp.plugin.filereader/files/test.txt");

risposta

9

Il Bundle interface ha un metodo getEntry(java.lang.String path) che restituisce un URL ed è documentato come:

Restituisce un URL per l'entrata nel percorso specificato in questo pacchetto. Il programma di caricamento classi di questo bundle non viene utilizzato per cercare la voce. Viene cercato solo il contenuto di questo pacchetto. Il percorso specificato è sempre relativo alla radice di questo pacchetto e può iniziare con "/".Un valore di percorso di "/" indica la radice di questo pacchetto.

+0

Esiste un modo per accedervi al di fuori del contesto del BundleActivator? Sto indovinando che ti stai riferendo a fare qualcosa di simile: public void start (contesto BundleContext) { Bundle bundle = context.getBundle(); InputStream in = bundle.getEntry ("/ resource/example.css"). OpenStream(); }. Tuttavia, sto cercando una soluzione (se ce n'è una) per accedervi al di fuori di BundleActivator. Ho dato un'occhiata a http://www.eclipsezone.com/eclipse/forums/t101557.html ma sono ancora confuso – herbyme

+0

Hai trovato un modo per ottenere un oggetto Bundle dall'ID bundle? –

+0

È possibile ottenere la voce, ma il problema è che getEntry() fornisce solo il percorso relativo e non il percorso completo (root) del pacchetto: http://www.techinfopad.com/spring/101600333-gotazione-root -path-di-un-bundle.html. – herbyme

2

Se si sta costruendo con Eclipse/Equinox, allora si può ottenere la posizione di un bundle dal di fuori del BundleContext contenuto all'interno del BundleActivator chiamando qualcosa come:

Bundle yourBundle = Platform.getBundle("bundleSymbolicName"); 
Path relativePathToBundle = new Path("/relativePath"); 
FileLocator.openStream(yourBundle, relativePathToBundle, false); 

La piattaforma e le classi FileLocator provengono da il plug-in org.eclipse.core.runtime, quindi se si ha una dipendenza da questo, quanto sopra dovrebbe consentire di ottenere l'accesso alla propria risorsa.

+0

Sto cercando di evitare l'uso del plug-in org.eclipse.core.runtime poiché per la nostra implementazione è stata presa la decisione di utilizzare Apache Felix (a meno che non vi sia un modo per incorporarlo). Quanto sopra funziona se lo eseguo sotto l'ambiente di runtime Eclipse. – herbyme

3

Penso che la risposta dovrebbe essere semplice come il seguente:

URL cssFile = this.getClass().getResource("/resources/example.css"); 

Vale a dire assicurati che ci sia una barra iniziale nel percorso. L'hai avuto senza una barra principale, che lo renderebbe "relativo" alla classe da cui stai chiamando.

In alternativa, il seguente dovrebbe funzionare:

this.getClass().getClassLoader().getResource("resources/example.css"); 
+0

Ho optato per questa soluzione ma ho riscontrato problemi con il tentativo di importare tutti i valori della directory, ad es. Sto usando BluePrint CSS e ho avuto problemi con this.getClass(). GetClassLoader(). GetResource ("resources/css") perché non ci sono solo molti file ma anche sottodirectory. Ho finito per "copiare" i file in una posizione temporanea, ma questo ha causato alcuni problemi di prestazioni. – herbyme

Problemi correlati