maven 2 - servlet - Proyecto y embarcadero Maven de varios módulos: ejecución
javax servlet jstl maven (5)
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:
-
pom.xml
(packagingpom
, tiene dos módulos) -
project-jar/
-
pom.xml
(envasejar
)
-
-
project-war/
-
pom.xml
(war
embalaje, depende delproject-jar
)
-
Si mvn
comandos mvn
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 de target
falla, porque primero intenta "construir" el proyecto. Solo he logrado hacerlo funcionar instalando project-jar
en el repositorio local de Maven, que no es muy bueno.
¿Hay alguna forma de usar el plugin Jetty en una configuración Maven de varios módulos?
Agregue el plugin jetty al pom raíz y configure un contextHandler que apunte 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
Cree un perfil dentro del módulo war ( project-war
). Dentro de este perfil, configure embarcadero para adjuntarlo a una fase de ciclo de vida y ejecutar el objetivo de 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
), organiza que jetty: run se ejecute durante la fase de test
. (Puede elegir otra fase, pero asegúrese de que sea después de la compile
).
Ejecute desde el nivel mvn test -Pjetty-run
: 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>
El uso de extraClasspath en la configuración de embarcadero funciona ... pero por alguna razón, si los frascos dependientes (de otros módulos) están desactualizados, algunas cosas no funcionarán correctamente.
No existe una solución mágica y el único que conozco es un poco hacky y confía en el elemento extraClasspath
que puedes usar para declarar directorios de clase extra, relativamente. Me gusta 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>
Sé que estás pidiendo la configuración del complemento, pero puedes definir el proyecto en el comando maven:
$ mvn jetty:run --projects project-war