2010-09-03 9 views
34

Estoy tratando de dividir un proyecto Maven WAR en dos módulos, de modo que pueda construir un archivo JAR separado con herramientas de línea de comandos. El resultado tiene la siguiente estructura:proyecto y embarcadero de múltiples módulos Maven: ejecutar

  • pom.xml (embalaje pom, tiene dos módulos)
  • project-jar/
    • pom.xml (embalaje jar)
  • project-war/
    • pom.xml (envases war, depende de project-jar)

Si me quedo mvn comandos desde la raíz, todo funciona bien. Me gustaría seguir usando mvn jetty:run, pero para eso necesito ejecutar el comando en el subproyecto WAR. Si lo hago, no puedo encontrar el subproyecto project-jar, por lo que no se ejecutará. Incluso mvn jetty:run-war con un archivo WAR completamente ensamblado en el directorio target falla, porque primero intenta "construir" el proyecto. Solo he logrado hacer que funcione instalando project-jar en el repositorio local de Maven, lo cual no es muy agradable.

¿Hay alguna manera de utilizar el plugin Jetty en una configuración Maven de varios módulos?

Respuesta

11

No existe una solución mágica y la única que conozco es un poco hacky y confío en el elemento extraClasspath que puede usar para declarar directorios de clase extra, relativamente. Como esto (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, esto no realmente me ayude, porque falla con un error BUILD "Falló la resolución del artefacto". (el proyecto hermano JAR) antes de que se ejecute el plugin Jetty. Entonces parece que necesito una solución general para Maven en primer lugar. :( –

+1

@ Lukáš Maven usa el repositorio local para resolver dependencias, por lo que ** debe ** instalarse (es decir, primero debe "instalar" todos los módulos ejecutando una generación de reactor en el elemento primario al menos una vez). trabajo, incluso si los JAR instalados están "desactualizados". –

+0

Ah, esperaba evitar eso. Una alternativa que descubrí fue establecer el plugin jetty en el padre y apuntarlo al archivo war correcto (y luego usar embarcadero: ejecutar -war), pero probablemente necesite ejecutar la instalación de todos modos para que NetBeans sea feliz. –

1

Usando extraClasspath en la configuración embarcadero funciona ... pero por alguna razón, si frascos dependientes (de otros módulos) son obsoletas algunas cosas no funcionan correctamente.

30

Cree un perfil dentro del módulo de guerra (project-war). Dentro de este perfil, configure embarcadero para adjuntarlo a una fase de ciclo de vida y ejecutar el objetivo run explícitamente. Ahora cuando maven ejecute desde el proyecto toplevel con ese perfil habilitado, invocará jetty: run y tendrá una resolución de dependencia de módulo hermana (como es normal al ejecutar comandos maven desde el proyecto to top).

La configuración de ejemplo, cuando se coloca en el pom.xml del módulo web (project-war), hace que embarcadero: ejecución se ejecute durante la fase test. (Puede elegir otra fase, pero asegúrese de que sea posterior a compile).

Ejecutar desde el nivel superior: mvn test -Pjetty-run o mvn test -DskipTests=true -Pjetty-run. Esto compilará dependencias según sea necesario y las hará disponibles, pero invocar embarcadero: ejecutar dentro del módulo correcto.

<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

Añadir plugin de amarre a la raíz del pom y configurar un contextHandler apuntando a la guerra deseada. Esto funciona para mí en un proyecto con múltiples módulos de jar y dos guerras de superposición.

<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

Sé que estás pidiendo configuración del complemento, pero sólo podría definir el proyecto en el comando experto:

$ mvn jetty:run --projects project-war 
Cuestiones relacionadas