2009-04-27 5 views
7

J'ai une application J2EE déployée en tant que fichier EAR, qui à son tour contient un fichier JAR pour le code de couche de gestion (y compris certains EJB) et un fichier WAR pour le code de couche Web. Le fichier EAR est déployé sur JBoss 3.2.5, qui décompresse les fichiers EAR et WAR, mais pas le fichier JAR (ce n'est pas le problème, c'est juste FYI). L'un des fichiers dans le fichier JAR est un modèle MS Word dont le chemin absolu doit être passé à du code MS Word natif (en utilisant Jacob, FWIW).Obtention du chemin absolu d'un fichier dans un fichier JAR dans un fichier EAR?

Le problème est que si je tente d'obtenir le fichier comme celui-ci (à l'intérieur du code dans le fichier 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 

... alors le constructeur java.io.File lance l'URI IllegalArgumentException »n'est pas hiérarchique ". L'URL et URI ont tous deux la même sortie toString(), à savoir:

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

Cette grande partie du chemin est valide sur le système de fichiers, mais le reste est pas (être interne au fichier JAR):

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

Quelle est la manière la plus simple d'obtenir le chemin absolu de ce fichier?

Répondre

7

Ma solution actuelle est de copier le fichier dans le répertoire temporaire du serveur, utilisez le chemin absolu de la copie:

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(); 

Je préfère une solution qui ne nécessite pas la copie du fichier.

+0

Lorsque j'ai trouvé ce problème, ma première idée a été "Ouais, peut-être que le seul moyen est d'écrire un fichier temporaire!". Et surprise, c'est le seul moyen! Comment peut-il être qu'il n'y a aucun moyen de gérer un chemin dans un pot? Si vous pouvez obtenir le flux, vous pouvez obtenir le fichier, dans un monde parfait. –

1

À moins que le code ou l'application que vous transmettez la chaîne d'URI accepte un format qui spécifie un emplacement dans un fichier jar/zip, votre solution de copie du fichier vers un emplacement temporaire est probablement la meilleure.

Si ces fichiers sont souvent référencés, vous pouvez mettre en cache les emplacements des fichiers d'extraction et vérifier leur existence chaque fois qu'ils sont nécessaires.

+0

Merci Chris. Je suis assez sûr que Word a besoin d'un chemin absolu, et serait confus par un chemin de style JAR/ZIP. Je suis en effet paresseux-copier le fichier original dans le dossier temporaire, je l'ai juste laissé hors de ma réponse par souci de concision. –

0

Vous devez copier le contenu dans un fichier temporaire (potentiellement avec un cache), car essayer d'accéder aux fichiers internes du conteneur d'application est une dépendance que vous voulez éviter. Il peut même ne pas y avoir un fichier extrait (il peut charger directement à partir du fichier JAR).

Questions connexes