(...) Estoy bastante seguro de que esto se puede hacer, por ejemplo, a través del plugin antrun, pero no estoy familiarizado con eso. ¿Cuál es la forma más simple de lograr esto?
Se podría utilizar efectivamente resources:copy-resources
y varios <execution>
en su POM (nótese que resources:copy-resources
no permite cambiar el nombre del archivo de destino sin embargo).
Asumamos que tiene la siguiente estructura:
$ tree .
.
├── pom.xml
└── src
├── main
│ ├── filters
│ │ ├── filter-node1.properties
│ │ └── filter-node2.properties
│ ├── java
│ └── resources
│ ├── log4j.properties
│ └── another.xml
└── test
└── java
Dónde log4j.properties
es el uso de marcadores de posición y los archivos filter-nodeN.properties
contienen los valores.Por ejemplo:
# filter-node1.properties
log.location=D:/logs
log.file.postfix=_1
Luego, en su pom.xml
, configurar el plugin recursos y definir una <execution>
por nodo para llamar copy-resources
con un directorio de salida específica y una filtro específico a utilizar:
<project>
...
<build>
<resources>
<!-- this is for "normal" resources processing -->
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering><!-- you might still want to filter them -->
<excludes>
<!-- we exclude the file from "normal" resource processing -->
<exclude>**/log4j.properties</exclude>
</excludes>
</resource>
</resources>
<plugins>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>2.4.3</version>
<executions>
<execution>
<id>copy-resources-node1</id>
<phase>process-resources</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${basedir}/target/node1</outputDirectory>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/log4j.properties</include>
</includes>
</resource>
</resources>
<filters>
<filter>src/main/filters/filter-node1.properties</filter>
</filters>
</configuration>
</execution>
<execution>
<id>copy-resources-node2</id>
<phase>process-resources</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${basedir}/target/node2</outputDirectory>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/log4j.properties</include>
</includes>
</resource>
</resources>
<filters>
<filter>src/main/filters/filter-node2.properties</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
mvn Correr process-resources
produciría el siguiente resultado:
$ tree .
.
├── pom.xml
├── src
│ ├── main
│ │ ├── filters
│ │ │ ├── filter-node1.properties
│ │ │ └── filter-node2.properties
│ │ ├── java
│ │ └── resources
│ │ ├── log4j.properties
│ │ └── another.xml
│ └── test
│ └── java
└── target
├── classes
│ └── another.xml
├── node1
│ └── log4j.properties
└── node2
└── log4j.properties
con los valores apropiados en cada log4j.properties
.
$ cat target/node1/log4j.properties
log4j.appender.Application.File=D:/logs/application_1.log
log4j.appender.tx_info.File=D:/logs/tx_info_1.log
funciona esto un poco, pero es prolijo y esto podría ser un problema si usted tiene una buena cantidad de nodos.
traté de escribir algo más conciso y fácil de mantener con el Maven Plugin antRun pero no pude conseguir la tarea de
for
ant-contrib
para trabajar bajo Maven (por razones desconocidas, la tarea no es reconocido
for
) y renuncié al
.
Aquí hay una alternativa usando el Plugin de Maven AntRun. Nada complicado, ningún bucle, sólo estoy copiando el archivo de origen a otro lugar, cambiando su nombre sobre la marcha y filtrando el contenido:
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.3</version>
<executions>
<execution>
<id>copy-resources-all-nodes</id>
<phase>process-resources</phase>
<configuration>
<tasks>
<copy file="src/main/resources/log4j.properties" toFile="target/antrun/log4j-node1.properties">
<filterset>
<filter token="log.location" value="D:/logs"/>
<filter token="log.file.postfix" value="_1"/>
</filterset>
</copy>
<copy file="src/main/resources/log4j.properties" toFile="target/antrun/log4j-node2.properties">
<filterset>
<filter token="log.location" value="D:/logs"/>
<filter token="log.file.postfix" value="_2"/>
</filterset>
</copy>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
Tenga en cuenta que la hormiga utiliza @
por defecto como delimitadores de token (podías t conseguir que se utilice delimitadores estilo maven) por lo que la convirtió en log4j.properties
:
[email protected]@/[email protected]@.log
[email protected]@/[email protected]@.log
Pero, ya que estos valores parecen ser nodo específico, ¿Consideró utilizando las propiedades del sistema en lugar (tha t podría colocar en las secuencias de comandos de inicio)? Esto es algo que ya hice (con log4j.xml
), funciona bien y simplificaría mucho las cosas.
Gracias por las ideas.Usando recursos: copy-resources, ¿no sería posible copiar _el mismo archivo_ varias veces a diferentes objetivos, con diferentes propiedades? Sin embargo, no pude encontrar la manera de configurar las propiedades para las diferentes ejecuciones, ¿podría indicarme un ejemplo concreto? –
Puede invocar el objetivo copy-resources varias veces en su pom, cada vez que especifique el mismo objetivo diferente de origen. No sé si los recursos de copia permiten cambiar el nombre de los archivos, pero sí permiten establecer el directorio de destino. El sol está brillando, tengo que ir a trabajar al jardín, pero trataré de armar algo concreto más tarde. – mdma