Tengo un proyecto maven con uno war
y varios proyectos ear
. Cada proyecto ear
requiere un war
/ WEB-INF/web.xml
ligeramente diferente. Cada ear
's pom.xml
usa com.google.code.maven-replacer-plugin:replacer
y org.codehaus.mojo:truezip-maven-plugin
para reemplazar las fichas en el web.xml
, y luego coloca ese nuevo web.xml
en el { {X11}}. Todo esto funciona muy bien con la construcción y creación de los artefactos EAR finales.
El problema que tengo es que cuando run
(usando Netbeans, pero eso no debería importar), el web.xml
utilizado para la implementación (<project>/target/gfdeploy/first-app/web_war/WEB-INF/web.xml
) es la versión tokenizada. Intenté agregar fases de ejecución para deploy
, pero eso no funciona.
¿Cómo puedo asegurarme de que la implementación de ejecución tenga el web.xml
modificado para que pueda probar mi aplicación durante el desarrollo?
Aquí están las partes relevantes del oído pom.xml
:
<plugin>
<groupId>com.google.code.maven-replacer-plugin</groupId>
<artifactId>replacer</artifactId>
<version>1.5.3</version>
<executions>
<execution>
<id>package-replace</id>
<phase>package</phase>
<goals>
<goal>replace</goal>
</goals>
</execution>
<execution>
<id>deploy-replace</id>
<phase>deploy</phase>
<goals>
<goal>replace</goal>
</goals>
</execution>
</executions>
<configuration>
<file>${project.parent.basedir}/${web.xml}</file>
<outputFile>${project.build.directory}/${web.xml}</outputFile>
<replacements>
<replacement>
<token>@REALM_NAME@</token>
<value>${web.realm}</value>
</replacement>
</replacements>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>truezip-maven-plugin</artifactId>
<version>1.2</version>
<executions>
<execution>
<id>package-replace-web-xml</id>
<goals>
<goal>copy</goal>
</goals>
<phase>package</phase>
<configuration>
<files>
<file>
<source>${project.build.directory}/${web.xml}</source>
<outputDirectory>${project.build.directory}/${project.build.finalName}/${web.zip}/WEB-INF</outputDirectory>
</file>
</files>
</configuration>
</execution>
<execution>
<id>package-replace-web</id>
<goals>
<goal>copy</goal>
</goals>
<phase>package</phase>
<configuration>
<files>
<file>
<source>${project.build.directory}/${project.build.finalName}/${web.zip}</source>
<outputDirectory>${project.build.directory}/${project.build.finalName}.ear</outputDirectory>
</file>
</files>
</configuration>
</execution>
<execution>
<id>deploy-replace-web-xml</id>
<goals>
<goal>copy</goal>
</goals>
<phase>deploy</phase>
<configuration>
<files>
<file>
<source>${project.build.directory}/${web.xml}</source>
<outputDirectory>${project.build.directory}/gfdeploy/${project.artifactId}/web-${project.version}_war/WEB-INF</outputDirectory>
</file>
</files>
</configuration>
</execution>
</executions>
</plugin>
3 respuestas
Le sugiero que mantenga su src / main / webapp / WEB-INF / web.xml por defecto completamente funcional para ejecutarse durante el desarrollo. Luego, mantenga un archivo similar llamado src / main / webapp / WEB-INF / web-ear.xml con toda la preparación de reemplazo.
Envuelva toda su estrategia de complemento de reemplazo dentro de un perfil de Maven y apunte al archivo web-ear.xml . Agregue a este perfil una configuración de plugin de maven-war que usará el archivo alternativo web-ear.xml durante la compilación, en lugar del web.xml predeterminado (marque: < a href = "http://maven.apache.org/plugins/maven-war-plugin/" rel = "nofollow noreferrer"> http://maven.apache.org/plugins/maven-war-plugin/ ):
<profiles>
<profile>
<id>change-war-profile</id>
<build>
<plugins>
<!-- all your replacement plugins here -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<webXml>src/main/webapp/WEB-INF/web-ear.xml</webXml>
</configuration>
</plugin>
<plugins>
</build>
</profile>
</profiles>
Asegúrese de activar este perfil durante la construcción EAR maven:
mvn package -Pchange-war-profile
Puedes ejecutar tu guerra con el complemento jetty-maven que elige el objetivo de la guerra de ejecución. Ese objetivo ejecuta la guerra empaquetada. Ver: https://www.eclipse.org/jetty/documentation/9.4.x/jetty-maven-plugin.html#running-assembled-webapp-as-war
En primer lugar, la fase de implementación (del ciclo de vida de la construcción) significa implementación un artefacto listo para la producción en el repositorio remoto de Maven (por ejemplo, Nexus o Artifactory). En términos generales, despliegue de artefactos se puede tratar como copiando el artefacto . Lea la Introducción al Build Lifecycle para obtener más detalles .
En segundo lugar, Apache Maven no es compatible con implementación de aplicaciones en el servidor de aplicaciones listo para usar. Sin embargo, hay varias formas de hacerlo, dependiendo del servidor de aplicaciones que use. ¿Cuál usas?
Se puede encontrar un complemento especial para JBoss Application Server - jboss-as-maven-plugin. Consulte ejemplo de uso:
<project>
...
<build>
...
<plugins>
...
<plugin>
<groupId>org.jboss.as.plugins</groupId>
<artifactId>jboss-as-maven-plugin</artifactId>
<version>7.9.Final</version>
<executions>
<execution>
<phase>install</phase>
<goals>
<goal>deploy</goal>
</goals>
</execution>
</executions>
</plugin>
...
</plugins>
...
</build>
...
</project>
Se puede encontrar un complemento similar para GlassFish Server: glassfish-maven-plugin.
Además, si esto es aceptable para usted, puede realizar implementación en 2 pasos desde Netbeans:
- Cree el proyecto: ejecute
mvn package
con todos sus complementos configurados en la fase de paquete. - Implemente el proyecto: ejecute la aplicación en el servidor de aplicaciones desde Netbeans si es compatible (consulte NetBeans Java EE Servers Support página).
Espero que esto ayude.
Nuevas preguntas
java
Java es un lenguaje de programación de alto nivel. Utilice esta etiqueta cuando tenga problemas para usar o comprender el idioma en sí. Esta etiqueta rara vez se usa sola y se usa con mayor frecuencia junto con [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] y [maven].