2013-08-18 14 views
8

Ho un'applicazione web multi modulo.Applicazione web multi-modulo Maven (hot swap)

La struttura è:

Parent 
| 
| - - Child 1 
| - - Child 2 
| - - Web 

E il progetto web dipende dai due moduli bambino

Quando si utilizza il mio IDE per costruire il mio progetto mi è stato utilizzato per l'IDE costruire le classi in WEB- Cartella INF/classes. È stato bello visto che il server Web ha notato le nuove classi e ha riavviato o distribuito a caldo questi file. Con Maven sembra che devo confezionare tutto da zero ogni volta.

Mi piacerebbe trovare un modo in Maven tale da evitare di eseguire mvn: clean mvn: install mvn: war: inplace. Invece mi piacerebbe un mvn: comile, e poi roba proprio lì.

Spero che tu capisca cosa intendo. Testare l'app Web è estremamente lento quando devi sempre costruire tutti i jar del progetto ed eseguire il comando som war prima che le cose vengano aggiornate.

Le applicazioni web pom:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 

    <modelVersion>4.0.0</modelVersion> 

    <parent> 
     ... 
    </parent> 

    <artifactId>web</artifactId> 
    <packaging>war</packaging> 

    <dependencies> 
     <dependency> 
     <groupId>bla.bla.bla</groupId> 
     <artifactId>bla_child1</artifactId> 
     <version>1.0-SNAPSHOT</version> 
     </dependency> 
     <dependency> 
     <groupId>bla.bla.bla</groupId> 
     <artifactId>bla_child2</artifactId> 
     <version>1.0-SNAPSHOT</version> 
     </dependency> 
    </dependencies> 

    <build> 
     <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-war-plugin</artifactId> 
      <version>2.4</version> 
     </plugin> 
     <plugin> 
      <groupId>org.eclipse.jetty</groupId> 
      <artifactId>jetty-maven-plugin</artifactId> 
      <version>9.0.4.v20130625</version> 
      <configuration> 
       <scanIntervalSeconds>30</scanIntervalSeconds> 
       <webApp> 
        <contextPath>/blabla</contextPath> 
       </webApp> 
      </configuration> 
     </plugin> 
     </plugins> 
    </build> 
</project> 
+0

Cosa IDE stai usando? Alcuni, come Eclipse, hanno un buon supporto per maven e webapps tramite plugin come [m2e] (http://eclipse.org/m2e/) e [WTP] (http://projects.eclipse.org/projects/webtools). –

+0

IntelliJ. Non è la mancanza di supporto per esso nell'IDE, ma penserei che potrebbe essere fatto interamente in Maven. – AnAmuser

+3

Che dire del [plugin maven jetty] (http://maven.apache.org/plugins/maven-war-plugin/examples/rapid-testing-jetty6-plugin.html) non si adatta alle tue esigenze? Non sta raccogliendo il 'target/classes 'aggiornato dopo una' mvn compile'? –

risposta

1

Questa è la mia risposta personale temporanea a questo problema.

Sarebbe bello se si potesse fare con Maven, ma non sono stato in grado di trovare una soluzione. Pertanto ho legato un bersaglio di formica alla fase di compilazione del modulo web.

Questa probabilmente non è una soluzione che può essere utilizzata ovunque, ma funziona nel mio caso.

web/pom.xml:

  <plugin> 
      <artifactId>maven-antrun-plugin</artifactId> 
      <version>1.7</version> 
      <executions> 
       <execution> 
        <id>copy-modules</id> 
        <phase>compile</phase> 
        <configuration> 
        <target> 
         <delete dir="${project.basedir}\src\main\webapp\WEB-INF\classes"/> 
         <copy todir="${project.basedir}\src\main\webapp\WEB-INF\classes"> 
          <fileset dir="${main.basedir}\modules\child-1\target\classes"> 
           <include name="**/*.class"/> 
           <include name="**/*.xml"/> 
          </fileset> 
          <fileset dir="${main.basedir}\modules\child-2\target\classes"> 
           <include name="**/*.class"/> 
           <include name="**/*.xml"/> 
          </fileset> 
         </copy> 
        </target> 
        </configuration> 
        <goals> 
        <goal>run</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 

Ora il pontile vede ogni volta che faccio una compilazione, che è molto più veloce di installazione, la guerra e la roba che era necessario prima.

+0

Il problema con questo approccio è che se le classi che vengono copiate introducono una nuova dipendenza, non la copierete su (alcune condivise) cartelle lib. In tal caso, l'app si interromperà con ClassNotFoundException. Ho cancellato la mia risposta, quindi ecco un [collegamento pastebin alla porta maven di questo script] (http://pastebin.com/CmRPyd8F) – linski

2

Una possibile soluzione al problema potrebbe essere quella di creare un skinny war con il plugin maven-war (o almeno escludere child1 e child2 se si hanno anche altre dipendenze) e aggiungere le cartelle target/classes del child- progetti per il tuo classpath. Questo potrebbe essere fatto con Build Helper Maven Plugin's add-resource goal.

Diniego: Non ho provato io stesso, ma in teoria potrebbe funzionare :)

+2

L'ho provato e non funziona senza riavviare il molo. Sembra che Jetty non effettui la scansione delle modifiche sul classpath eccetto target/classes nel modulo WAR. –

+1

Vedi qui [come] (http://stackoverflow.com/a/2389464/679982), con l'aumento di frequenza. – linski