2009-04-27 19 views
7

Ho un app J2EE implementato come un file EAR, che a sua volta contiene un file JAR per il codice strato di business (tra cui alcuni EJB) e un file WAR per il codice del livello web. Il file EAR viene distribuito a JBoss 3.2.5, che decomprime i file EAR e WAR, ma non il file JAR (questo non è il problema, è solo FYI).Ottenere il percorso assoluto di un file all'interno di un JAR all'interno di un EAR?

Uno dei file all'interno del file JAR è un modello MS Word il cui percorso assoluto deve essere passato a un codice MS Word nativo (utilizzando Jacob, FWIW).

Il problema è che se provo ad ottenere il file come questo (dal di dentro un po 'di codice nel file JAR):

URL url = getClass().getResource("myTemplate.dot"); 
File file = new File(url.toURI()); // <= fails! 
String absolutePath = file.getAbsolutePath(); 
// Pass the absolutePath to MS Word to be opened as a document 

... poi il costruttore java.io.File getta l'IllegalArgumentException "URI non è gerarchica ". L'URL e URI entrambi hanno la stessa toString() di uscita, cioè:

jar:file:/G:/jboss/myapp/jboss/server/default/tmp/deploy/tmp29269myapp.ear-contents/myapp.jar!/my/package/myTemplate.dot 

Questa gran parte del percorso è valido sul file system, ma il resto non è (essendo interno al file JAR):

G:/jboss/myapp/jboss/server/default/tmp/deploy/tmp29269myapp.ear-contents 

Qual è il modo più semplice di ottenere il percorso assoluto per questo file?

risposta

7

La mia soluzione attuale è quella di copiare il file nella directory temporanea del server, quindi utilizzare il percorso assoluto della copia:

File tempDir = new File(System.getProperty("java.io.tmpdir")); 
File temporaryFile = new File(tempDir, "templateCopy.dot"); 
InputStream templateStream = getClass().getResourceAsStream("myTemplate.dot"); 
IOUtils.copy(templateStream, new FileOutputStream(temporaryFile)); 
String absolutePath = temporaryFile.getAbsolutePath(); 

Preferirei una soluzione che non comporta la copia del file.

+0

Quando ho trovato questo problema, la mia prima idea era "sì, forse l'unico modo è quello di scrivere un file temporaneo!". E sorpresa, è l'unico modo! Come può essere che non ci sia modo di gestire un percorso all'interno di un vaso? Se riesci a ottenere lo stream, puoi ottenere il file, in un mondo perfetto. –

1

A meno che il codice o l'applicazione non stiano passando la stringa URI per accettare un formato che specifica una posizione all'interno di un file jar/zip, la soluzione per copiare il file in una posizione temporanea è probabilmente la migliore.

Se questi file si fa riferimento spesso, si può decidere di memorizzare nella cache le posizioni dei file estratto e solo verificare la loro esistenza ogni volta che sono necessari.

+0

Grazie Chris. Sono abbastanza sicuro che Word abbia bisogno di un percorso assoluto e che venga confuso da un percorso in stile JAR/ZIP. Sono davvero pigro-copiando il file originale nella cartella temporanea, l'ho appena lasciato fuori dalla mia risposta per brevità. –

0

È necessario copiare il contenuto in un file temporaneo (potenzialmente con una cache), perché cercando di arrivare a file interni del contenitore applicazione è una dipendenza che si vuole evitare. Potrebbe non esserci nemmeno un file estratto (può essere caricato direttamente dal JAR).

Problemi correlati