2013-04-29 30 views
5

Tôi muốn sử dụng Maven để xử lý tạo tác cho các vùng thử nghiệm và địa phương khác nhau. Tôi tin rằng tôi có thể sử dụng các cấu hình khác nhau nhưng tôi không chắc chắn.Làm thế nào để sử dụng Maven và các ứng dụng khác nhau.properties cho tạo tác các vùng thử nghiệm khác nhau trong ứng dụng cấu hình Spring

Trong Maven, tôi có thể chọn các thư mục khác nhau để chọn tệp được sử dụng trên bao bì (chẳng hạn như application.properties) không? Làm thế nào tôi sẽ thiết lập điều đó?

Một ý tưởng về những gì tôi muốn là phải có một thư mục sau đây cho nguồn lực trong dự án của tôi

  • địa phương
  • xây dựng máy chủ
  • dev
  • sys
  • prod

Mỗi thư mục phải chứa một differe Phiên bản nt của application.resources là một tệp trong Spring có thể được sử dụng để xử lý các chuỗi được mã hóa cứng để sử dụng trong các biến. Đối với các bản dựng cục bộ, các nhà phát triển của chúng tôi cũng hoạt động trên các hệ điều hành khác nhau. Tôi có nên yêu cầu tôi muốn làm cho nó liền mạch trên hệ điều hành khác nhau 'cũng có.

kết quả chính sẽ là:

  • kiểm soát Maven lifecycle phases từ bên trong IDE (IntelliJ)
  • Không làm phức tạp giai đoạn và đội xử lý
  • Giữ cho mọi thứ như phù hợp cho mỗi nhà phát triển
  • Làm cho cấu hình khác nhau mỗi nhà phát triển/khu vực xuất hiện vô hình khi chạy một giai đoạn ví dụ cài đặt

Lý tưởng nhất là tôi sẽ thiết lập dự án theo best practices (Duvall, Matyas, Glover).

+1

sử dụng tiểu sử maven (http://maven.apache.org/guides/introduction/introduction-to-profiles.html) và lọc tài nguyên (http: // maven. apache.org/plugins/maven-resources-plugin/examples/filter.html) – willome

Trả lời

4

Chúng tôi cung cấp các thuộc tính khác nhau hiện tại nhưng không phải bằng các thư mục khác nhau. Chúng tôi làm điều này qua một kết hợp của

  • PropertyPlaceholderConfigurer
  • Maven hồ sơ Spring (một cái gì đó chúng tôi sử dụng để xây dựng môi trường Dev của chúng tôi),
  • Build Server (TeamCity trong trường hợp của chúng tôi)
  • giai đoạn Maven để sản xuất tạo tác chính xác
  • khởi động và xây dựng đối số

Hiểu biết của tôi về những gì chúng tôi làm là l imited, nhưng hy vọng điều này phục vụ như là một ví dụ hữu ích cho người khác và có lẽ bản thân tôi để xem xét.

Chúng tôi cung cấp các thông số, như bạn sẽ thấy bên dưới, để trỏ đến các tệp thuộc tính khác nhau. Mỗi tệp thuộc tính có cấu hình cho một vùng/môi trường. Tôi sẽ giải thích việc sử dụng hiện tại là tốt nhất tôi có thể trong trường hợp nó cung cấp một số sử dụng cho người khác.

Để sử dụng các cấu Maven chúng tôi đã tạo ra một profile trong pom của chúng tôi xác định là development trong đó bao gồm một tài sản cấu hình khu vực được gọi là env. Tôi chưa biết hoàn toàn cách mà nó đang được sử dụng trong dự án của chúng tôi tuy nhiên bạn sẽ thấy bên dưới POM của chúng tôi bao gồm một trình biên dịch Maven Compiler và một plugin Maven Tomcat.

Hàng ngày, với tư cách là nhà phát triển, chúng tôi chạy các ứng dụng của chúng tôi cục bộ trên Tomcat từ bên trong IntelliJ và cung cấp thuộc tính env. Khi khởi động, thuộc tính env được cung cấp làm đối số cho được đặt thành classpath*:dev-common.properties. Tệp này là tệp cấu hình thuộc tính - đặt giá trị giữ chỗ cho các khu vực khác nhau của chúng tôi.

Giá trị của env được tạo sẵn cho chúng tôi PropertyPlaceholderConfigurer


Ví dụ 1 - Thực hiện các Maven profile trong pom.xml:

Việc thực hiện một profile trong pom của chúng tôi là:

<profile> 
     <id>development</id> 
     <activation> 
      <property> 
       <name>env</name> 
       <value>development</value> 
      </property> 
     </activation> 
     <build> 
      <pluginManagement> 
       <plugins> 
        <plugin> 
         <artifactId>maven-compiler-plugin</artifactId> 
         <version>2.3.2</version> 
         <configuration> 
          <source>1.6</source> 
          <target>1.6</target> 
         </configuration> 
        </plugin> 
        <plugin> 
         <groupId>org.apache.tomcat.maven</groupId> 
         <artifactId>tomcat7-maven-plugin</artifactId> 
         <version>2.0-SNAPSHOT</version> 
      ... 
        </plugin> 
       </plugins> 
      </pluginManagement> 
     </build> 
    </profile> 

Ví dụ 2 - Sở hữu placeholder configurer cho xây dựng thông thường:

Chúng tôi cũng làm cho thành phần mùa xuân sử dụng ofa, một PropertyPlaceholderConfigurer. Chúng tôi sử dụng tính năng này phối hợp với đối số xây dựng để thiết lập đường dẫn lớp học con trỏ vào tệp tài nguyên.

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="locations"> 
     <list> 
      <value> 
       ${env} 
      </value> 
     </list> 
    </property> 


Ví dụ 3 - giữ chỗ tài sản configurer cho thử nghiệm:

Chúng tôi có mùa xuân bối cảnh đặc biệt được thành lập để thử nghiệm hội nhập mà còn sử dụng PropertyPlaceholderConfigurer. Chúng được chọn bởi một lớp thử nghiệm tích hợp sử dụng kết hợp của @ContextConfiguration(locations = {"classpath:test-dataexchange-application-context.xml"})@RunWith(SpringJUnit4ClassRunner.class)).

Trong bối cảnh thử nghiệm chúng ta cấu hình PropertyPlaceholderConfigurer như sau để nhận các tính chất của một khu vực thử nghiệm tích hợp:

<bean id="testpropertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="locations"> 
     <list> 
      <value>classpath*:dev-local-common.properties</value> 
     </list> 
    </property> 


ghi chú khác:

Chúng tôi sử dụng Team City để quản lý xây dựng nhưng tôi chưa thấy các cài đặt này lànhư thế nàođược sử dụng ở đó, nếu chúng ở tất cả. Tôi có thể hình dung có khả năng kết hợp các phương pháp trên với nhau để hỗ trợ tích hợp liên tục và giao hàng.

Tôi không thấy vị trí hồ sơ được xác định là development đang được sử dụng.Đó là điều tôi phải theo dõi các thành viên trong nhóm của tôi.


Resources:

1

Mục đích để tạo ra một artifact cho từng môi trường cùng một lúc trên máy chủ trung tâm (CI/Build server), nhằm tạo ra một tạo phẩm và bắt đầu/thử nghiệm ứng dụng với một cú nhấp chuột cục bộ, cung cấp một cách dễ dàng nhất để tìm hiểu và chạy bản dựng của bạn, và kiểm tra và cấu hình CI của bạn.

Bạn có thể sử dụng các cấu hình trong Maven và sử dụng các mục tiêu Maven để đạt được quyền xây dựng bằng cách sử dụng một máy chủ xây dựng mà trong trường hợp của chúng tôi là TeamCity.

Sử dụng trình cấu hình trình giữ chỗ của thuộc tính trong ngữ cảnh mùa xuân với một tệp application.resources cho mỗi vùng và mặt nạ tên tệp, ví dụ: application-resources-${region}.

3

Nếu bạn đang sử dụng Khởi động mùa xuân, có một cách dễ dàng để thực hiện việc này.

Tạo hai cấu hình trong maven và đặt thuộc tính trong mỗi cấu hình với tên của cấu hình Spring bạn muốn thực thi.

<profile> 
     <id>dev</id> 
     <activation> 
      <activeByDefault>true</activeByDefault> 
     </activation> 
     <properties> 
      <!-- Default spring profile to use --> 
      <spring.profiles.active>dev</spring.profiles.active> 
      <!-- Default environment --> 
      <environment>develop</environment> 
     </properties> 
    </profile> 

Bên application.properties của bạn, thêm khách sạn này: spring.profiles.active = $ {} spring.profiles.active

Tạo một application.property cho mỗi hồ sơ, sử dụng mô hình này dành cho ứng dụng profile.properties. Ví dụ: application-dev.properties application-prod.properties

Hãy chắc chắn để lọc tích cực trong các plugin tài nguyên:

... 
    <resource> 
    <directory>src/main/resources</directory> 
    <filtering>true</filtering> 
    </resource> 
... 

Một cách khác là tạo ra một tập tin trong quá trình thực của maven gọi activeprofile .tính chất. Khởi động mùa xuân sẽ xem tệp này để tải cấu hình hoạt động. Bạn có thể tạo tệp này như sau:

<plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-antrun-plugin</artifactId> 
      <executions> 
       <execution> 
        <phase>prepare-package</phase> 
        <configuration> 
         <target> 
          <echo message="spring.profiles.active=${spring.profiles.active}" file="target/classes/config/activeprofile.properties" /> 
         </target> 
        </configuration> 
        <goals> 
         <goal>run</goal> 
        </goals> 
       </execution> 
      </executions> 
      <configuration> 
      </configuration> 
     </plugin> 
Các vấn đề liên quan