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
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.
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:
- Cree una nueva carpeta donde coloque los archivos de texto que necesitan ser procesados.
- Enlace el complemento antrun con
prepare-package
y configúrelo para procesar los archivos y coloque los archivos procesados en algún directorio debajo deltarget
(por ejemplo,target/textfilesdir
). - Configure el complemento de guerra para incluir
target/textfilesdir
como unwebResource
. Consulte Agregar y filtrar recursos web externos para obtener más información.
Solución 2:
- Enlace el complemento antrun con
prepare-package
y configúrelo para procesar los archivos de texto desdesrc/main/webapp/textfilesdir
y coloque los archivos procesados entarget/project-1.0-SNAPSHOT
. - 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.