2008-10-14 12 views
9

¿Es posible almacenar contenido web (como JSP, HTML, imágenes, CSS, etc.) en un archivo JAR?Almacenar contenido web en un archivo JAR

He estado buscando varias opciones para modularizar nuestras aplicaciones web y esta es una posibilidad.

Actualmente utilizamos JSF y Facelets para nuestra tecnología de visualización. Estoy pensando que es posible escribir algún tipo de resolución de vista personalizada que examine el classpath en lugar de un directorio de sistema de archivos, pero no estoy seguro de esto. trabajaría.

¡Cualquier idea sería apreciada! :)

Actualización: Probablemente debería aclarar. ¿Cómo se obtiene el contenedor web (como Tomcat) para cargar recursos de un archivo JAR? Por ejemplo, despliegue un archivo .war con mi aplicación web. Si accedo a /index.jsp, el contenedor intentará buscar en el directorio de contenido web un archivo llamado index.jsp.

¿Existe alguna manera fácil de configurar su propio cargador de recursos utilizando Tomcat o similar para que busque tanto en classpath como en el sistema de archivos?

Respuesta

1

Absolutamente. Diablos, puede almacenar contenido directamente en un archivo WAR, que es básicamente un archivo JAR con algunos bits adicionales. Sí, es posible que necesite escribir una resolución personalizada para usar ClassLoader.getResourceAsStream, pero básicamente, dado que tiene la capacidad de generar el contenido como desee, buscarlo de un archivo jar parece perfectamente razonable. Probablemente quiera asegurarse de que solo obtenga un conjunto muy específico de extensiones :)

3

Sí, es posible almacenar archivos, p. propiedades, xml, xslt, imagen, etc. en un archivo JAR (o WAR) y extraerlos en tiempo de ejecución.

Para cargar un recurso de su jar de implementación, use el siguiente código.

this.getClass().getClassLoader().getResourceAsStream(filename) ; 

En un proyecto Maven, carpetas & archivos colocados en los recursos se incluyen en el frasco. El nombre de archivo es relativo a la raíz del archivo jar, por lo que "./filename.xml" coincidiría con el archivo filename.xml ubicado en "/ src/java/resources".

1

También puede usar el proyecto weblets (consulte https://weblets.dev.java.net/).

Almacena algunos recursos en una biblioteca JAR (como imágenes, css, javascript ...) y escribe un weblet-config.xml realmente simple. Luego, en la página JSF, puede referirse directamente con esta sintaxis:

<h:graphicImage src="weblet://some-name/images/someimage.jpg" .../> 
+0

Gracias, esto es realmente útil. Ahora bien, si solo hubiera una forma de obtener JSF pagse ellos mismos en un archivo .jar ... –

1

archivo Una etiqueta es como una página JSP que se puede colocar en un frasco. Usar archivos de etiquetas puede ser útil, pero nunca he tratado de usar imágenes, CSS, etc. en un contenedor.

3

Si está utilizando Maven para construir su aplicación web, puede construir una GUERRA de sus recursos y superponer esa GUERRA a su WAR de la aplicación web en el momento de la compilación.

La GUERRA de recursos que contiene todos sus JSP, imágenes, CSS, etc. se conoce como una "superposición", y es simplemente una dependencia en su aplicación de Internet objetivo con el tipo establecido en "guerra".

Cuando empaqueta su aplicación web, el recurso WAR solo copiará sobre archivos no conflictivos. Por lo tanto, si tiene un index.jsp exclusivo en su proyecto y desea usarlo en lugar de index.jsp en la superposición, simplemente inclúyalo en su aplicación web objetivo, y Maven no copiará ese recurso.

Más información sobre el Maven War plugin page about overlays.

0

En Core JavaServer Faces, 3ª edición, en "Componentes compuestos de empaquetado en JAR" en la pág. 382, habla de empaquetar componentes compuestos en archivos JAR.

"Todo lo que tiene que hacer es colocar su componente compuesto y sus artefactos, como JavaScript, hojas de estilo o archivos de propiedades, bajo un directorio META-INF en el JAR, como se muestra en la Figura 9-14."

components.jar 
+-- META-INF 
    +-- resources 
     +-- css 
     | +-- styles.css 
     +-- images 
     | +-- back.png 
     +-- util 
      +-- icon.xhtml 
      +-- login.js 
      +-- login.properties 

No estoy seguro de qué facilidad se puede acceder a estos recursos directamente desde otras aplicaciones en contraposición a los componentes compuestos contenidos.

Cuestiones relacionadas