2011-02-10 10 views
11

Nota: No he tenido ninguna respuesta en la primera versión de esta cuestión, por lo que he modificado para ser más genérico ...¿Cómo administrar recursos compartidos para varias aplicaciones web en Maven AND Eclipse?

Contexto

Mi proyecto se divide en varias experto módulos y varias aplicaciones web. Aquí está la estructura:

my-project 
    + pom.xml 
    +-- commons 
    +-- persistence 
    +-- ... 
    +-- web-app-1 
    +-- web-app-2 
    +-- ... 

Todas las aplicaciones web comparten recursos comunes, como JS, CSS y archivos de imágenes.

En lugar de duplicar estos recursos en cada web-app-X, decidí crear otro proyecto llamado web-resources, que es un proyecto de WAR. La estructura es entonces la siguiente:

my-project 
    + pom.xml 
    +-- commons 
    +-- persistence 
    +-- ... 
    +-- web-app-1 
    +-- web-app-2 
    +-- ... 
    +-- web-resources 
     +-- pom.xml 
     +-- src/main/webapp 
      +-- web.xml (which is almost empty, just need to be present for Maven) 
      +-- web_resources 
       +-- css 
       +-- images 
       +-- javascript 

Maven

En Maven 2 (o Maven 3, como acabo migrado mi proyecto a maven 3.0.2), esta configuración es fácil de manejar ya que todos web-app-X declaran web-resources como una dependencia:

<groupId>foo.bar</groupId> 
<artifactId>web-app-1</artifactId> 
... 
<dependencies> 
    <dependency> 
     <groupId>foo.bar</groupId> 
     <artifactId>web-resources</artifactId> 
     <version>${preclosing-version}</version> 
     <type>war</type> 
    </dependency> 
    ... 

Así que cuando construyo mi proyecto WAR, primero obtiene el web-resources.war (construido justo antes), descomprimirlo y compilar encima de él la aplicación web web-app-X. De esta manera, mi archivo WAR contendrá también un directorio llamado web-resources/ que contiene los recursos compartidos.

Este es el principio de superposición de guerra.

Por lo tanto, desde el punto de vista de Maven, ¡todo está bien!


Eclipse

Ahora, aquí viene el problema principal: tener una buena configuración de Eclipse.

Pregunta: ¿Cómo puedo usar mi configuración actual para que Eclipse pueda administrarla correctamente? En particular, cuando despliego cualquier web-app-X en Tomcat usando Eclipse ...

Tenga en cuenta que quiero obtener la configuración más automatizable (?) Y evitar cualquier paso manual, ya que esta configuración debe ser utilizada por docenas de desarrolladores. ..

Para mí, la mejor solución parece usar los recursos vinculados de Eclipse. Por lo tanto, establecí la siguiente configuración en mi web-app-X pom.xml:

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-eclipse-plugin</artifactId> 
      <configuration> 
       <wtpversion>1.5</wtpversion> 
       <linkedResources> 
        <linkedResource> 
         <name>web_resources</name> 
         <type>2</type> 
         <location>${project.basedir}\..\web-resources\src\main\webapp\web_resources</location> 
        </linkedResource> 
       </linkedResources> 
      </configuration> 
     </plugin> 
     ... 

Cuando ejecuto la configuración mvn eclipse:eclipse, añade con éxito esta información en mi archivo .project:

<projectDescription> 
    ... 
    <linkedResources> 
    <link> 
     <name>web_resources</name> 
     <type>2</type> 
     <location>C:\dev\project\web-resources\src\main\webapp\web_resources</location> 
    </link> 
    </linkedResources> 
<projectDescription> 

Ahora, me importa mi proyecto en Eclipse. Problema: en Project properties > Java Build Path > Source, no veo el origen del enlace presente. Solo veo mis cuatro directorios predeterminados de Maven (src/main/java, src/main/resources, src/test/java y src/test/resources). Lo que es extraño es que cuando intento agregar manualmente los recursos vinculados, se niega y dice que ya existe ...

Así que cuando despliego mi aplicación web en mi Tomcat en Eclipse, lo hace no despliegue el directorio web_resources, y por lo tanto no obtengo las imágenes CSS/JS desplegadas.

Después de algunas pruebas, parece que tengo que hacer dos modificaciones:

  1. Agregue la línea <classpathentry kind="src" path="web_resources" output="src/main/webapp/web_resources"/> en mi archivo .classpath;
  2. Elimine <project>preclosing-web-resources</project> en el archivo .project.

Tenga en cuenta que el uso de esta configuración, Eclipse copia (y mantener la sincronización) el contenido del proyecto web_resources en mi web-app-X/src/main/webapp/web_resources, pero esto no es un problema (este directorio es ignorado por el SMC).

La única solución automatizada que encontré fue la creación de un simple plugin de Maven que lo hacen los dos modificación previa, y ejecute el siguiente comando (o utilizar un archivo .bat):

mvn eclipse:clean eclipse:eclipse myEclipsePlugin:eclipse 

Pregunta

  • ¿Existe alguna forma mejor de administrar dicha configuración?

Información técnica

Java 6, Maven 3.0.2, Maven plugin de Eclipse 2.8, Eclipse 3.3.2 (pero puedo probar con una versión más nueva de Eclipse), sin m2eclipse enchufar.

Respuesta

6

A partir de Servlet 3.0, se pueden compartir recursos, poniéndolos dentro del directorio src/main/resources/META-INF/recursos.

Cuando la aplicación webapp se implementa, Servlet 3.0 pone esos recursos a disposición de la ruta de contexto. Por ejemplo, en tu caso ...

web-resources 
-- src 
---- main 
------ resources 
-------- META-INF 
---------- resources 
------------ css 
-------------- global.css 
------------ images 
-------------- background.png 

Vamos a suponer que mi_proyecto tiene una dependencia en recursos web y se implementa en la url http://my.localhost:8080/myProject.

Con esa configuración, las siguientes URL resolverá a los recursos correctos:

SI que tienen un conflicto de nombres entre los recursos y su aplicación real , la aplicación ganará.

Asegúrese de que su web.xml indica que está utilizando Servlet 3,0

<web-app xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
    version="3.0"> 
Cuestiones relacionadas