2012-03-03 26 views
16

Tôi muốn có thể sử dụng cấu hình log4j khác nhau cho các môi trường khác nhau.Cách cấu hình maven để sử dụng các tệp log4j.properties khác nhau trong các môi trường khác nhau

Trong môi trường phát triển của mình, tôi muốn sử dụng log4j.properties (A). Nhưng khi tôi xây dựng trong Maven cho môi trường sản xuất, tôi muốn sử dụng log4j.properties (B).

Vui lòng cho tôi biết cách định cấu hình điều này trong tệp pom.xml của tôi?

+0

Bạn có sử dụng maven-release-plugin quản lý sản xuất xây dựng? – yorkw

+0

Không, tôi không bao giờ là trái tim của maven-release-plugin trước đây. Tuy nhiên, cảm ơn, tôi sẽ tìm thấy nếu nó có thể đối phó với vấn đề. – Kedron

+5

Đây là một câu hỏi định kỳ yên tĩnh và tôi muốn thêm hai xu của tôi. Việc tạo nhiều bản dựng cho môi trường khác nhau thường không được khách hàng chấp nhận. Họ muốn ONE xây dựng cho tất cả các môi trường để loại bỏ bất kỳ vấn đề hồi quy nào với nhiều bản dựng. Tệp log4j phải được khai báo bên ngoài ứng dụng của bạn như bất kỳ biến môi trường cụ thể nào. Triết lý 'xây dựng một khi triển khai bất cứ nơi nào' dường như luôn bị lạc với các cấu hình xây dựng maven. – tom

Trả lời

3
  1. trong dự án của bạn thêm 3 thư mục:

    dự án của bạn \ src \ chính resources \ \

    \A > log4j.properties 
        \B > log4j.properties 
        \Default > log4j.properties 
    
  2. trong pom.xml

    Mặc định

    <build> 
        <resources> 
         <resource> 
          <directory>src/main/resources/${param}</directory>   
         </resource> 
        </resources> 
    </build> 
    
    • nếu: mvn clean install: classpath => log4j.properties (Default)

    • nếu: mvn clean install -Dparam = A: classpath => log4j.properties (A)

    • nếu: mvn clean install -Dparam = B: classpath => log4j.proper quan hệ (B)

tốt hơn nhiều so với sử dụng hồ sơ được mở rộng hơn mà không chạm vào pom

+0

add: \t \t Mặc định

+0

nguồn lực quá tải cấu hình pom, vì vậy nếu bạn có một tập tin hoặc thư mục, bạn phải xác định tất cả :( – MychaL

11

Bạn có thể sử dụng cấu hình để đạt được các hành vi mong muốn:

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-resources-plugin</artifactId> 
      <version>2.5</version> 
      <executions> 
       <execution> 
        <id>log4j</id> 
        <phase>process-resources</phase> 
        <goals> 
         <goal>copy-resources</goal> 
        </goals> 
        <configuration> 
         <outputDirectory>output_directory</outputDirectory> 
         <resources> 
          <resource>${log4j.file}</resource> 
         </resources> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 

<profiles> 
    <profile> 
     <id>dev</id> 
     <activation> 
      <activeByDefault>true</activeByDefault> 
     </activation> 
     <properties> 
      <log4j.file>path_to_file_A</log4j.file> 
     </properties> 
    </profile> 
    <profile> 
     <id>prod</id> 
     <properties> 
      <log4j.file>path_to_file_B</log4j.file> 
     </properties> 
    </profile> 
</profiles> 
+1

Xin chào. Yếu tố tài nguyên chỉ cần một chút tình yêu: ' someResourceDir \t path_to_file_A ' – demaniak

+0

chỉ là một câu hỏi nhanh: là sao chép các nguồn lực một phần từ maven lifecylce "bình thường" hay nó đi kèm với các plugin ? –

+0

@al. Bạn phải xác định rõ ràng. 'resources: resources' là một phần của vòng đời của maven. –

1

Cách đơn giản nhất đối với tôi,

  • Xác định một hệ thống ENV biến và thiết lập giá trị của nó _dev cho phát triển env của bạn.
  • đâu bạn tham khảo sử dụng tập tin này như log4j này $ {ENV .properties}

Vì vậy,

Trong sản xuất nó chỉ đơn giản sử dụng log4j.xml và cho log4j_dev.xml dev của bạn

  • Để ngăn chặn các vấn đề, tốt hơn nên tạo biến ENV cho sản xuất dưới dạng _pro để sản xuất log4j_pro.xml, đối với dev log4j_dev.xml sẽ được sử dụng.

Tôi tin rằng việc dựa vào các tệp khác nhau hơn là sao chép tài nguyên là thực hành tốt hơn.

2

Bạn không cần plugin-maven-resources nếu bạn có một môi trường đơn giản.

Trong ví dụ này, log4j.properties B là file bạn sử dụng cho sản xuất và đang trong thư mục src/main/javalog4j.properties A là file bạn sử dụng để phát triển và đang trong thư mục /Users/junger/.m2/.

Trong pom.xml của bạn:

<properties> 
    <log4j.properties.directory>src/main/java</log4j.properties.directory> 
</properties> 

<build> 
    <resources> 
     <resource> 
      <directory>${log4j.properties.directory}</directory> 
      <includes> 
       <include>log4j.properties</include> 
      </includes> 
     </resource> 
    </resources> 
</build> 

Bây giờ, trong /Users/junger/.m2/settings.xml của bạn (tạo một nếu nó không tồn tại):

<profiles> 
    <profile> 
     <id>dev</id> 
     <activation> 
      <activeByDefault>true</activeByDefault> 
     </activation> 
     <properties> 
      <log4j.properties.directory>/Users/devuser/.m2/</log4j.properties.directory> 
     </properties> 
    </profile> 
</profile> 

Bằng cách sử dụng phương thức này, mỗi nhà phát triển có thể có một thư mục log4j.properties khác và bạn giữ sạch pom.xml của mình.

1

Ở một mức độ nào đó, bạn có thể tham chiếu các biến môi trường bên trong log4j.properties để thêm hành vi phụ thuộc vào môi trường. ví dụ:

log4j.rootLogger=${rootLoggerLevel}, ${appender} 
Các vấn đề liên quan