2010-09-03 6 views
34

J'essaie de diviser un projet WAR Maven en deux modules, afin de pouvoir créer un fichier JAR séparé avec des outils de ligne de commande. Le résultat a la structure suivante:Projet Maven multi-module et jetty: run

  • pom.xml (pom emballage, comporte deux modules)
  • project-jar/
    • pom.xml (emballage jar)
  • project-war/
    • pom.xml (emballage war, dépend project-jar)

Si je lance mvn commandes de la racine, tout fonctionne bien. Je voudrais continuer à utiliser mvn jetty:run, mais pour cela, j'ai besoin d'exécuter la commande dans le sous-projet WAR. Si je fais cela, ne trouve pas le sous-projet project-jar, donc il ne fonctionnera pas. Même mvn jetty:run-war avec un fichier WAR complètement assemblé dans le répertoire target échoue, car il essaie d'abord de "construire" le projet. J'ai seulement réussi à le faire fonctionner en installant project-jar dans le dépôt Maven local, ce qui n'est pas très agréable.

Existe-t-il un moyen d'utiliser le plugin Jetty dans une configuration Maven multi-module?

Répondre

11

Il n'y a pas de solution magique et la seule que je connaisse est un peu hacky et repose sur l'élément extraClasspath que vous pouvez utiliser pour déclarer des répertoires de classes supplémentaires, relativement. Comme cela (de 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, cela ne me permet pas en fait, car il échoue avec une erreur BUILD "Impossible de résoudre l'artefact." (le projet JAR frère) avant même que le plugin Jetty ne soit exécuté. Il semble donc que j'ai besoin d'une solution générale pour Maven en premier lieu. :( –

+1

@ Lukáš Maven utilise le référentiel local pour résoudre les dépendances afin qu'elles ** soient ** installées (ie vous devez d'abord 'installer' tous les modules en exécutant une construction de réacteur sur le parent au moins une fois). même si les fichiers JAR installés sont "obsolètes" –

+0

Ah, j'espérais éviter cela: une alternative que j'ai trouvée était de placer le plugin jetty sur le parent et de le diriger vers le bon fichier war (puis d'utiliser jetty: run -war), mais je vais probablement besoin de lancer l'installation quand même pour rendre NetBeans heureux –

1

En utilisant extraClasspath dans la configuration de la jetée fonctionne ... mais pour une raison quelconque, si des pots dépendants (d'autres modules) sont obsolètes certaines choses ne fonctionnent pas correctement.

30

Créez un profil à l'intérieur du module guerre (project-war). Dans ce profil, configurez jetty pour attacher à une phase de cycle de vie et exécutez l'objectif run explicitement. Maintenant, quand maven s'exécute du projet toplevel avec ce profil activé, il appellera jetty: run et aura la résolution de dépendance du module frère (comme d'habitude lors de l'exécution des commandes maven du projet toplevel).

L'exemple de configuration, lorsqu'il est placé dans le fichier pom.xml du module Web (project-war), fait en sorte que jetty: run soit exécuté pendant la phase test. (Vous pouvez choisir une autre phase, mais assurez-vous que c'est après compile.)

Exécuter de haut niveau: mvn test -Pjetty-run ou mvn test -DskipTests=true -Pjetty-run. Cela compilera les dépendances si nécessaire et les rendra disponibles mais invoquera jetty: run dans le bon module.

<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

Ajoutez un plugin jetty à la racine pom et configurez un contextHandler pointant vers la guerre souhaitée. Cela fonctionne pour moi dans un projet avec plusieurs modules de pot et deux guerres de superposition.

<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

Je sais que vous vous demandez pour la configuration du plug-in, mais vous pouvez simplement définir le projet dans la commande maven:

$ mvn jetty:run --projects project-war 
Questions connexes