java maven-2 package war phase

java - Cadena de reemplazo de texto de recursos web



maven-2 package (5)

Otra solución de mi parte, perdón por llegar tarde a la fiesta, pero aún así podría ser útil para algunas personas. La solución anterior simplemente no me funcionó porque tenía superposiciones en su lugar y, por lo tanto, usar el complemento de reemplazo fue difícil en la fuente principal. Por lo tanto, utilicé maven-war-plugin para generar el directorio temporal para mí en la fase de preparación del paquete y tengo un plugin de reemplazo para manipularlo y liberar la guerra desde ese directorio para que nada más se anule con él.

<plugin> <artifactId>maven-war-plugin</artifactId> <executions> <execution> <id>prepare</id> <phase>prepare-package</phase> <goals> <goal>exploded</goal> </goals> <configuration> <webappDirectory>${project.build.directory}/${project.build.finalName}-patched/</webappDirectory> </configuration> </execution> <execution> <id>default-war</id> <phase>package</phase> <goals> <goal>war</goal> </goals> <configuration> <useCache>true</useCache> <warSourceDirectory>${project.build.directory}/${project.build.finalName}-patched/</warSourceDirectory> </configuration> </execution> </executions> </plugin> <plugin> <groupId>com.google.code.maven-replacer-plugin</groupId> <artifactId>replacer</artifactId> <executions> <execution> <phase>prepare-package</phase> <goals> <goal>replace</goal> </goals> </execution> </executions> <configuration> <file>${project.build.directory}/${project.build.finalName}-patched/fileToBeChanged.txt</file> <token>ValueToChange</token> <value>ValueToReplace</value> </configuration> </plugin>

Tengo una aplicación web de Maven con archivos de texto en

src / main / webapp / textfilesdir

Como lo entiendo, durante la fase del paquete, este directorio textfilesdir se copiará en el

target / project-1.0-SNAPSHOT

directorio, que luego es comprimido en un

target / project-1.0-SNAPSHOT.war

Problema

Ahora, necesito hacer un reemplazo de cadena en el contenido de los archivos de texto en target / project-1.0-SNAPSHOT / textfilesdir. Esto se debe hacer después de que textfilesdir se copie en target / project-1.0-SNAPSHOT, pero antes de crear el archivo target / project-1.0-SNAPSHOT.war. Creo que todo esto se hace durante la fase del paquete.

¿Cómo puede un complemento (potencialmente maven-antrun-plugin), conectarse a la fase del paquete para hacer esto?

Los archivos de texto no contienen propiedades, como $ {nombre-propiedad} para filtrar. El reemplazo de cadena es probablemente la única opción.

Opciones

  1. Modifique los archivos de texto después de la copia en el directorio target / project-1.0-SNAPSHOT, pero antes de la creación de WAR.

  2. Después del empaquetado, extraiga los archivos de texto de WAR, modifíquelos y vuelva a agregarlos a WAR.

Estoy pensando que hay otra opción aquí que me estoy perdiendo. ¿Pensamientos a alguien?


Puede utilizar el complemento de reemplazo de maven:

<plugin> <groupId>com.google.code.maven-replacer-plugin</groupId> <artifactId>maven-replacer-plugin</artifactId> <version>1.3.7</version> <executions> <execution> <phase>prepare-package</phase> <goals> <goal>replace</goal> </goals> </execution> </executions> <configuration> <file>target/${project.artifactId}-${project.version}/WEB-IN/site.xml</file> <replacements> <replacement> <token>ear.version</token> <value>${ear.version}-${maven.build.timestamp}</value> </replacement> </replacements> </configuration> </plugin>

Pero necesitas dos trucos más. Uno es agregar el objetivo de explosión al plugin de guerra:

<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.1.1</version> ..... <executions> <execution> <phase>prepare-package</phase> <goals> <goal>exploded</goal> </goals> </execution> </executions> </plugin>

Y, finalmente, tener que llamar a mvn clean antes del paquete. Puedes hacerlo desde tu pom:

<plugin> <artifactId>maven-clean-plugin</artifactId> <version>2.4.1</version> <executions> <execution> <id>auto-clean</id> <phase>initialize</phase> <goals> <goal>clean</goal> </goals> </execution> </executions> </plugin>

Si está utilizando una versión de maven-war-plugin más reciente que 2.0.1, deberá incluir true en la configuración de maven-war-plugin; de lo contrario, los cambios en sus archivos se almacenarán cuando War Plugin copia tu aplicación web en una segunda vez. Si está utilizando Hudson / Jenkins, tendrá que usar una versión más reciente que 2.0.1.


Tuve el mismo problema y estaba jugando mucho con este problema, así que responderé aunque esta pregunta es bastante antigua. Como lo indicaron leandro y Phil, se puede usar el complemento de reemplazo de maven. Pero su solución no funcionó para mí. Habilitar useCache causó un error que hizo imposible construir el proyecto. Además, no puedo hacer que la limpieza automática funcione correctamente. Como aún no tengo permiso para comentar sobre la publicación, proporcionaré mi solución completa aquí:

En primer lugar, configure el complemento-reemplazo-maven:

<plugin> <groupId>com.google.code.maven-replacer-plugin</groupId> <artifactId>maven-replacer-plugin</artifactId> <version>1.3.7</version> <executions> <execution> <phase>prepare-package</phase> <goals> <goal>replace</goal> </goals> </execution> </executions> <configuration> <includes> <include>target/${project.build.finalName}/static/**/*.css</include> </includes> <regex>false</regex> <token>someString</token> <value>replaceString</value> </configuration> </plugin>

Antes de que se construya la guerra real, creamos una guerra explotada. Esto significa que todo el contenido del archivo war se almacena en un subdirectorio (que es target / $ {project.build.finalName} de forma predeterminada). Después de eso, el complemento de reemplazo de maven cambiará el contenido de los archivos como hemos especificado. Finalmente, el .war será empaquetado en la fase del paquete por el trabajo default-war . Para evitar que el contenido de la carpeta de guerra explotada se sobrescriba, uno tiene que configurar warSourceDirectory en el directorio donde se almacenan las cosas de la guerra explotada. El siguiente fragmento de configuración hará este trabajo:

<plugin> <artifactId>maven-war-plugin</artifactId> <version>2.1.1</version> <executions> <execution> <id>prepare</id> <phase>prepare-package</phase> <goals> <goal>exploded</goal> </goals> </execution> <execution> <id>default-war</id> <phase>package</phase> <goals> <goal>war</goal> </goals> <configuration> <warSourceDirectory>${project.build.directory}/${project.build.finalName}</warSourceDirectory> </configuration> </execution> </executions> </plugin>

El paquete con el contenido reemplazado puede construirse usando mvn clean package


Tuve un problema con las fases, utilizando el paquete de preparación no copié el archivo a war, mi solución fue la siguiente:

Añade esta configuración en maven-war-plugin

<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.1.1</version> <executions> <execution> <phase>prepare-package</phase> <goals> <goal>exploded</goal> </goals> </execution> <executions> <configuration> <webResources> <resource> <directory>${basedir}/WebContent?</directory> <excludes> <!--Exclude the file because it is copied using the maven replacer plugin --> <exclude>/style.scss</exclude> </excludes> </resource> </webResources> </configuration> </plugin> Add the configuration to replacer <plugin> <groupId>com.google.code.maven-replacer-plugin</groupId> <artifactId>replacer</artifactId> <version>1.5.1</version> <executions> <execution> <id>scss-replacement</id> <phase>prepare-package</phase> <goals> <goal>replace</goal> </goals> <configuration> <file>WebContent?/css/style.scss</file> <!-- My local file(WebContent?/css/style.scss) have a param $url: "http://localhost:8080/interface"; --> <!-- regex with match to $url: "http://localhost:8080/interface"; --> <token>/$url:.</token> <!-- Replace to --> <value>/$url: "www.myapplication.com.br/css/style.css";</value> <outputFile>target/app/css/style.scss</outputFile> </configuration> </execution> <executions> <plugin>

El archivo de salida no sobrescribe el archivo, así que puse la configuración maven-war-plugin para excluir el archivo style.scss. adiós!


La opción 1 no es factible, prepare-package es demasiado pronto, el package es demasiado tarde, así que no veo dónde se puede conectar ningún trabajo personalizado. La opción 2 es factible pero una IMO dolorosa. Así que aquí hay algunas proposiciones más (todas basadas en AntRun y ​​las ReplaceRegExp y / o Replace ).

Solución 1:

  1. Cree una nueva carpeta donde coloque los archivos de texto que necesitan ser procesados.
  2. Enlace el complemento antrun con prepare-package y configúrelo para procesar los archivos y coloque los archivos procesados ​​en algún directorio debajo del target (por ejemplo, target/textfilesdir ).
  3. Configure el complemento de guerra para incluir target/textfilesdir como un webResource . Consulte Agregar y filtrar recursos web externos para obtener más información.

Solución 2:

  1. Enlace el complemento antrun con prepare-package y configúrelo para procesar los archivos de texto desde src/main/webapp/textfilesdir y coloque los archivos procesados ​​en target/project-1.0-SNAPSHOT .
  2. Configure el plugin war para excluir los archivos procesados ​​previamente. De nuevo, consulte Agregar y filtrar recursos web externos para obtener más información.

Creo que iría por la segunda solución.