(...) Tôi khá chắc chắn điều này có thể được thực hiện, ví dụ: thông qua plugin antrun, nhưng tôi không quen với điều đó. Cách đơn giản nhất để đạt được điều này là gì?
Bạn thực sự có thể sử dụng resources:copy-resources
và một số <execution>
trong POM của bạn (lưu ý rằng resources:copy-resources
không cho phép thay đổi tên của tập tin mục tiêu mặc dù).
Giả sử bạn có cấu trúc sau:
$ tree .
.
├── pom.xml
└── src
├── main
│ ├── filters
│ │ ├── filter-node1.properties
│ │ └── filter-node2.properties
│ ├── java
│ └── resources
│ ├── log4j.properties
│ └── another.xml
└── test
└── java
đâu log4j.properties
đang sử dụng giữ chỗ và filter-nodeN.properties
file chứa các giá trị.Ví dụ:
# filter-node1.properties
log.location=D:/logs
log.file.postfix=_1
Sau đó, trong pom.xml
của bạn, cấu hình các plugin nguồn lực và xác định một <execution>
mỗi nút để gọi copy-resources
với một thư mục đầu ra cụ thể và một bộ lọc đặc biệt để sử dụng:
<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>
Chạy mvn process-resources
sẽ tạo ra kết quả sau:
$ 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
Với các giá trị thích hợp trong mỗi 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
Loại này hoạt động, nhưng tiết ra và đây có thể là vấn đề nếu bạn có số lượng nút lớn.
Tôi cố gắng để viết một cái gì đó ngắn gọn hơn và duy trì sử dụng Maven AntRun Plugin nhưng tôi không thể nhận được nhiệm vụ
for
từ
ant-contrib
làm việc dưới Maven (đối với một lý do không rõ, nhiệm vụ
for
không được công nhận) và tôi đã từ bỏ
.
Đây là giải pháp thay thế bằng Trình cắm AntRun Maven. Không có gì phức tạp, không có vòng lặp, tôi chỉ cần sao chép các tập tin nguồn đến vị trí khác, việc thay đổi tên của nó một cách nhanh chóng và lọc nội dung:
<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>
Lưu ý rằng Ant sử dụng @
theo mặc định như delimiters mã thông báo (couldn' t nhận được nó để sử dụng delimiters phong cách maven) để trở thành log4j.properties
:
[email protected]@/[email protected]@.log
[email protected]@/[email protected]@.log
Nhưng, vì những giá trị này dường như là nút cụ thể, cậu xem xét sử dụng thuộc tính hệ thống thay vì (tha t bạn có thể đặt trong các kịch bản khởi động)? Đây là một cái gì đó tôi đã làm (với một log4j.xml
), nó hoạt động tốt và nó sẽ rất đơn giản hóa mọi thứ.
Cảm ơn ý tưởng.Sử dụng tài nguyên: sao chép tài nguyên, nó sẽ không thể sao chép _ cùng một file_ nhiều lần với các mục tiêu khác nhau, với các thuộc tính khác nhau? Tuy nhiên, tôi không thể tìm ra cách cấu hình các thuộc tính cho các thực thi khác nhau - bạn có thể chỉ cho tôi một ví dụ cụ thể không? –
Bạn có thể gọi mục tiêu sao chép tài nguyên nhiều lần trong pom của bạn, mỗi lần chỉ định cùng một mục tiêu nguồn khác nhau. Tôi không biết liệu tài nguyên sao chép có cho phép đổi tên tệp hay không nhưng nó cho phép đặt thư mục đích. Mặt trời chiếu sáng - Tôi phải đi làm trong vườn, nhưng tôi sẽ cố gắng sắp xếp thứ gì đó cụ thể với nhau sau này. – mdma