2010-09-03 34 views
34

Sto provando a dividere un progetto Maven WAR in due moduli, in modo da poter creare un file JAR separato con strumenti da riga di comando. Il risultato ha la seguente struttura:Progetto Maven multi-modulo e jetty: eseguire

  • pom.xml (imballaggio pom, ha due moduli)
  • project-jar/
    • pom.xml (imballaggio jar)
  • project-war/
    • pom.xml (imballaggio war, dipende project-jar)

Se corro mvn comandi dalla radice, tutto funziona bene. Mi piacerebbe continuare a utilizzare mvn jetty:run, ma per quello ho bisogno di eseguire il comando nel sottoprogetto WAR. Se lo faccio, non riesce a trovare il sottoprogetto project-jar, quindi non verrà eseguito. Anche mvn jetty:run-war con un file WAR completamente assemblato nella directory target non riesce, perché tenta innanzitutto di "creare" il progetto. Sono riuscito a farlo funzionare installando project-jar nel repository Maven locale, che non è molto bello.

C'è un modo per utilizzare il plugin Jetty in una configurazione Maven multi-modulo?

risposta

11

Non esiste una soluzione magica e l'unica che conosco è un po 'hacky e si basa sull'elemento extraClasspath che è possibile utilizzare per dichiarare le directory di classe extra, relativamente. Ti piace questa (da JETTY-662):

<plugin> 
    <groupId>org.mortbay.jetty</groupId> 
    <artifactId>jetty-maven-plugin</artifactId> 
    <version>7.0.1.v20091125</version> 
    <configuration> 
    <scanIntervalSeconds>10</scanIntervalSeconds> 
    <webAppConfig> 
     <contextPath>/my-context</contextPath> 
     <extraClasspath>target/classes;../my-jar-dependency/target/classes</extraClasspath> 
    </webAppConfig> 
    <scanTargets> 
     <scanTarget>../my-jar-dependency/target/classes</scanTarget> 
    </scanTargets> 
    </configuration> 
</plugin> 
+2

Hm, questo in realtà non mi aiuta, perché non riesce con un errore BUILD "Impossibile risolvere artefatto." (il progetto JAR di pari livello) prima che il plugin Jetty venga eseguito. Quindi sembra che ho bisogno di una soluzione generale per Maven in primo luogo. :( –

+1

@ Lukáš Maven usa il repository locale per risolvere le dipendenze in modo che ** debbano ** essere installati (cioè è necessario "installare" tutti i moduli prima eseguendo una build del reattore sul genitore almeno una volta). lavoro, anche se i JAR installati sono "obsoleti" –

+0

Ah, speravo di evitarlo.Una alternativa che ho scoperto è stata l'impostazione del plugin jetty sul genitore e l'indirizzamento al file war corretto (e quindi usare il jetty: run -war), ma probabilmente dovrò eseguire l'installazione in ogni caso per rendere felice NetBeans. –

1

Utilizzando extraClasspath in configurazione molo funziona ... ma per qualche ragione, se vasetti dipendenti (da altri moduli) sono superate alcune cose non funzionano correttamente.

30

Creare un profilo all'interno del modulo war (project-war). All'interno di questo profilo, configurare il jetty per collegarlo a una fase del ciclo di vita ed eseguire esplicitamente l'obiettivo run. Ora, quando maven viene eseguito dal progetto di livello superiore con quel profilo abilitato, invoca il jetty: esegue e ha una risoluzione di dipendenza del modulo sorella (come avviene normalmente quando si eseguono i comandi di maven dal progetto di livello superiore).

La configurazione esempio, quando inserito nella pom.xml del modulo web (project-war), organizza per pontile: eseguire eseguire durante la fase test. (Puoi scegliere un'altra fase, ma assicurati che sia successiva allo compile.)

Correre da livello superiore: mvn test -Pjetty-run o mvn test -DskipTests=true -Pjetty-run. Questo compilerà le dipendenze come richiesto e le renderà disponibili, ma invocherà il jetty: eseguire il modulo corretto.

<profiles> 
    ... 
    <!-- With this profile, jetty will run during the "test" phase --> 
    <profile> 
    <id>jetty-run</id> 
    <build> 
     <plugins> 
     <plugin> 
      <groupId>org.mortbay.jetty</groupId> 
      <artifactId>jetty-maven-plugin</artifactId> 
      <version>7.1.6.v20100715</version> 
      <configuration> 
      ... 
      <webAppSourceDirectory> 
       ${project.build.directory}/${project.build.finalName} 
      </webAppSourceDirectory> 
      ... 
      </configuration> 
      <executions> 
      <execution> 
       <id>jetty-run</id> 
       <phase>test</phase> 
       <goals> 
       <goal>run</goal> 
       </goals> 
      </execution> 
      </executions> 
     </plugin> 
     </plugins> 
    </build> 
    </profile> 
... 
</profiles> 
1

Aggiungi il plug-in per il router al root pom e configura un contextHandler che punta alla guerra desiderata. Questo funziona per me in un progetto con più moduli jar e due overlay wars.

<plugin> 
<groupId>org.eclipse.jetty</groupId> 
<artifactId>jetty-maven-plugin</artifactId> 
<version>9.3.0.M2</version> 
<configuration> 
     <scanIntervalSeconds>10</scanIntervalSeconds> 
     <contextHandlers> 
      <contextHandler 
       implementation="org.eclipse.jetty.maven.plugin.JettyWebAppContext"> 
       <war>${project.basedir}/project-war/target/project-war-${project.version}.war</war> 
       <contextPath>/</contextPath> 
      </contextHandler> 
     </contextHandlers> 
    </configuration> 
</plugin> 

http://eclipse.org/jetty/documentation/current/jetty-maven-plugin.html#running-more-than-one-webapp

0

So che stai chiedendo configurazione del plugin, ma si può solo definire il progetto nel comando Maven:

$ mvn jetty:run --projects project-war 
Problemi correlati