Để phân tách cấu hình cho các giai đoạn khác nhau như phát triển, kiểm thử hay sản xuất, dự án Java thường cần cơ chế đóng gói linh hoạt. Giải pháp tối ưu là tận dụng Maven Profiles kết hợp với maven-resources-plugin để thay thế tài nguyên phù hợp khi build.
Trước hết, cần tổ chức lại cấu trúc thư mục within src/main/resources. Thay vì để tất cả file cấu hình chung một chỗ, hãy tạo các thư mục con đặt tên theo môi trường mục tiêu.
Tiếp theo, cập nhật file pom.xml để định nghĩa các profile và cấu hình plugin xử lý tài nguyên. Dưới đây là cách thiết lập property điều khiển và logic sao chép file:
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<deploy.profile>dev</deploy.profile>
</properties>
</profile>
<profile>
<id>test</id>
<properties>
<deploy.profile>test</deploy.profile>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<deploy.profile>prod</deploy.profile>
</properties>
</profile>
</profiles>
<build>
<finalName>${project.artifactId}</finalName>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.xls</include>
<include>**/*.xlsx</include>
<include>**/*.png</include>
<include>**/*.bpmn</include>
<include>**/*.dtd</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
<include>**/*.xsd</include>
</includes>
<excludes>
<exclude>dev/*</exclude>
<exclude>test/*</exclude>
<exclude>prod/*</exclude>
</excludes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.3.1</version>
<executions>
<execution>
<id>inject-env-config</id>
<phase>process-resources</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<overwrite>true</overwrite>
<outputDirectory>${project.build.outputDirectory}</outputDirectory>
<resources>
<resource>
<directory>src/main/resources/${deploy.profile}</directory>
<filtering>false</filtering>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
Trong cấu hình trên, mục excludes đóng vai trò quan trọng để ngăn các file cấu hình cụ thể của từng môi trường bị đóng gói chung vào artifact nếu không được chọn. Plugin sẽ chỉ sao chép nội dung từ thư mục tương ứng với profile đang kích hoạt vào thư mục output.
Để thực hiện đóng gói, sử dụng câu lệnh Maven kèm theo tham số -P để chỉ định profile mong muốn:
mvn clean package
mvn clean package -Pdev
mvn clean package -Ptest
mvn clean package -Pprod
Khi thực thi, Maven sẽ kích hoạt profile tương ứng, gán giá trị cho property deploy.profile và plugin sẽ tự động lấy file cấu hình từ thư mục con phù hợp để đưa vào thành phẩm cuối cùng.