2011-02-10 9 views
11

Nota: Non ho ricevuto alcuna risposta nella prima versione di questa domanda, così ho modificato per essere più generico ...Come gestire le risorse condivise per diverse app Web in Maven AND Eclipse?

Contesto

Il mio progetto si divide in diverse Maven moduli e diverse applicazioni web. Ecco la struttura:

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

Tutte le applicazioni Web condividono risorse comuni, come JS, CSS e file di immagini.

Invece di duplicare queste risorse in ogni web-app-X, ho deciso di creare un altro progetto chiamato web-resources, che è un progetto WAR. La struttura è quindi la seguente:

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

In Maven 2 (o 3 Maven, come ho appena migrato il mio progetto di Maven 3.0.2), questa configurazione è facile da gestire come tutti web-app-X dichiarano web-resources come dipendenza:

<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> 
    ... 

Così, quando ho costruire il mio progetto WAR, prima prendi lo web-resources.war (creato poco prima), decomprimilo e crea su di esso l'applicazione web web-app-X. In questo modo, il mio file WAR conterrà anche una directory denominata web-resources/ che contiene le risorse condivise.

Questo è il principio di sovrapposizione di guerra.

Quindi su un punto di vista Maven, tutto è a posto!


Eclipse

Ora, ecco che arriva il problema principale: avere una buona configurazione di Eclipse.

Domanda: Come posso utilizzare la configurazione corrente per essere gestita correttamente da Eclipse? In particolare, quando distribuisco qualsiasi web-app-X in Tomcat utilizzando Eclipse ...

Nota che voglio ottenere la configurazione più automatica (?) Ed evitare qualsiasi passaggio manuale, poiché questa configurazione dovrebbe essere utilizzata da dozzine di sviluppatori. ..

Per me, la soluzione migliore sembra utilizzare le risorse collegate a di Eclipse. Così, ho impostato la seguente configurazione nel mio pom web-app-X.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> 
     ... 

Quando eseguo la configurazione mvn eclipse:eclipse, aggiunge con successo queste informazioni nel mio file .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> 

Ora, importare il mio progetto in Eclipse. Problema: in Project properties > Java Build Path > Source, non vedo la sorgente di collegamento presente. Vedo solo le mie quattro directory predefinite Maven (src/main/java, src/main/resources, src/test/java e src/test/resources). Che è strano è che quando provo ad aggiungere manualmente le risorse collegate, si rifiuta e dice che esiste già ...

Così, quando schiero la mia applicazione web sul mio Tomcat in Eclipse, lo fa non Deploy la directory web_resources, e quindi non ho distribuito le immagini CSS/JS /.

Dopo alcuni test, sembra che devo fare due modifiche:

  1. aggiungere la riga <classpathentry kind="src" path="web_resources" output="src/main/webapp/web_resources"/> nel mio file .classpath;
  2. Rimuovere <project>preclosing-web-resources</project> nel file .project.

Nota che l'utilizzo di questa configurazione, Eclipse copiare (e mantenere la sincronizzazione) il contenuto del progetto di web_resources nel mio web-app-X/src/main/webapp/web_resources, ma questo non è un problema (questa directory viene ignorato dal SCM).

La soluzione automatizzata unica che ho trovato è stato quello di creare un semplice plugin Maven che fanno i due modifica precedente, e quindi eseguire il seguente comando (o utilizzare un file .bat):

mvn eclipse:clean eclipse:eclipse myEclipsePlugin:eclipse 

Domanda

  • C'è un modo migliore per gestire tale configurazione?

informazioni tecniche

Java 6, Maven 3.0.2, esperto di Plug-in Eclipse 2.8, Eclipse 3.3.2 (ma posso provare con la versione più recente di Eclipse), non m2eclipse collegare.

risposta

6

Partendo Servlet 3.0, è possibile condividere le risorse mettendoli all'interno del/META-INF directory src/main/risorse/risorse.

Quando la webapp distribuisce, Servlet 3.0 rende tali risorse disponibili dal percorso di contesto. Ad esempio, nel tuo caso ...

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

Supponiamo che my_project ha una dipendenza da web-risorse e viene distribuito per l'url http://my.localhost:8080/myProject.

Con questa configurazione, i seguenti URL saranno risolvere alle risorse corrette:

SE voi hanno un conflitto di nomi tra le risorse e l'applicazione effettiva , l'applicazione vincerà.

Assicurarsi che il web.xml afferma che si sta utilizzando 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"> 
Problemi correlati