2009-04-27 30 views
7

Tengo una aplicación J2EE desplegada como un archivo EAR, que a su vez contiene un archivo JAR para el código de la capa empresarial (incluidos algunos EJB) y un archivo WAR para el código de la capa web. El archivo EAR se implementa en JBoss 3.2.5, que descomprime los archivos EAR y WAR, pero no el archivo JAR (este no es el problema, solo es FYI).Obtener la ruta absoluta de un archivo dentro de un JAR dentro de un EAR?

Uno de los archivos dentro del archivo JAR es una plantilla de MS Word cuya ruta absoluta debe pasarse a algún código nativo de MS Word (usando Jacob, FWIW).

El problema es que si trato de obtener el archivo como esto (desde dentro de un cierto código en el archivo 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 

... entonces el java.io.File constructor emite la IllegalArgumentException "URI no es jerárquica ". La URL y URI ambos tienen el mismo toString (salida), a saber:

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

Esta gran parte de la ruta es válida en el sistema de archivos, pero el resto no es (ser interno al archivo JAR):

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

¿Cuál es la forma más fácil de obtener la ruta de acceso absoluta a este archivo?

Respuesta

7

Mi solución actual es copiar el archivo en el directorio temporal del servidor, a continuación, utilizar la ruta absoluta de la 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(); 

preferiría una solución que no implique la copia del archivo.

+0

Cuando encontré este problema, mi primera idea fue "¡sí, tal vez la única forma es escribir un archivo temporal!". Y sorpresa, ¡ES LA única manera! ¿Cómo puede ser que no haya forma de manejar una ruta dentro de un contenedor? Si puede obtener la transmisión, puede obtener el archivo en un mundo perfecto. –

1

A menos que el código o la aplicación que está pasando URI String acepte un formato que especifique una ubicación dentro de un archivo jar/zip, la solución para copiar el archivo en una ubicación temporal es probablemente la mejor.

Si se hace referencia a estos archivos con frecuencia, es posible que desee almacenar en caché las ubicaciones de los archivos de extracción y simplemente verificar su existencia cada vez que se necesiten.

+0

Gracias Chris. Estoy bastante seguro de que Word necesita una ruta absoluta, y se confundiría con una ruta de estilo JAR/ZIP. De hecho, soy flojo: copio el archivo original en la carpeta temporal, simplemente dejé eso fuera de mi respuesta en aras de la brevedad. –

0

Debe copiar el contenido en un archivo temporal (potencialmente con un caché), porque tratar de llegar a los archivos internos del contenedor de la aplicación es una dependencia que desea evitar. Puede que ni siquiera haya un archivo extraído (puede cargar directamente desde el JAR).

Cuestiones relacionadas