(...) Sono abbastanza sicuro questo può essere fatto, ad esempio, tramite il plugin antrun, ma non mi è familiare. Qual è il modo più semplice per raggiungere questo obiettivo?
Si potrebbe infatti usare resources:copy-resources
e diversi <execution>
in POM (notare che resources:copy-resources
non permette di cambiare il nome del file di destinazione però).
Supponiamo di avere la seguente struttura:
$ tree .
.
├── pom.xml
└── src
├── main
│ ├── filters
│ │ ├── filter-node1.properties
│ │ └── filter-node2.properties
│ ├── java
│ └── resources
│ ├── log4j.properties
│ └── another.xml
└── test
└── java
Dove log4j.properties
sta usando segnaposto ei file filter-nodeN.properties
contengono i valori.Per esempio:
# filter-node1.properties
log.location=D:/logs
log.file.postfix=_1
Poi, nel vostro pom.xml
, configurare il plugin risorse e definire una <execution>
per nodo di chiamare copy-resources
con una directory di output specifico e un filtro specifico da utilizzare:
<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>
esecuzione mvn process-resources
produrrebbe il seguente risultato:
$ 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 i valori appropriati per ogni 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
funziona questo genere di, ma è prolisso e questo potrebbe essere un problema se si dispone di una discreta quantità di nodi.
ho provato a scrivere qualcosa di più concisa e gestibile utilizzando l'AntRun Plugin Maven, ma non ho potuto ottenere il compito
for
da
ant-contrib
di lavorare sotto Maven (per un motivo sconosciuto, il compito
for
non viene riconosciuto) e ho rinunciato allo
.
Ecco un'alternativa utilizzando il plug-in Maven AntRun. Niente di complicato, nessun ciclo, sto semplicemente copiando il file di origine in un'altra posizione, cambiando il suo nome al volo e filtrare il contenuto:
<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>
Nota che Ant utilizza @
di default come delimitatori per Token (couldn' t farlo usare delimitatori stile Maven) in modo che il log4j.properties
divenne:
[email protected]@/[email protected]@.log
[email protected]@/[email protected]@.log
Ma, dal momento che questi valori sembrano essere nodo specifico, avete considerato utilizzando le proprietà del sistema invece (tha si può inserire negli script di avvio)? Questo è qualcosa che ho già fatto (con uno log4j.xml
), funziona bene e semplificherebbe notevolmente le cose.
Grazie per le idee.Usando le risorse: copia-risorse, non sarebbe possibile copiare _ lo stesso file_ più volte su target diversi, con proprietà diverse? Tuttavia, non sono riuscito a capire come configurare le proprietà per le diverse esecuzioni: potresti indicarmi un esempio concreto? –
È possibile richiamare l'obiettivo di copia-risorse più volte nel proprio pom, ogni volta specificando la stessa destinazione diversa. Non so se copy-resources consente di rinominare i file, ma consente di impostare la directory di destinazione. Il sole splende - Devo andare a lavorare in giardino, ma cercherò di mettere qualcosa di concreto insieme più tardi. – mdma