2010-02-11 38 views
14

Tôi có một dự án Maven2 đa mô hình để xây dựng một ứng dụng web. Ứng dụng được kết nối với máy chủ phụ trợ và DB. Có một số trường hợp máy chủ được triển khai trong môi trường của chúng tôi, và cũng có nhiều phụ trợ và DB trường cho sự phát triển, UAT, sản xuất, vv Vì vậy, trên thực tế, mỗi cấu hình ứng dụng cần những 3 tọa độ:Tại sao tôi không thể kích hoạt cấu hình Maven2 từ cấu hình khác?

  • front-end máy chủ
  • back-end máy chủ
  • DB

tôi đang làm việc trên thống nhất và tự động cấu hình ứng dụng. Nó rất dễ dàng và rõ ràng để đại diện cho các cấu hình khác nhau này như các cấu hình trong Maven. Sau đó, tôi có thể tạo cấu hình cụ thể bằng cách kích hoạt một cấu hình từ mỗi nhóm, ví dụ:

mvn -Pserver.Server1,backend.prod,db.uat clean install 

Điều này hơi tẻ nhạt và dễ xảy ra lỗi - nếu máy chủ cụ thể bị định cấu hình sai để kết nối với DB sai, giá có thể cao. Một cách rõ ràng để khắc phục điều này là đặt tất cả các kết hợp hồ sơ hữu ích vào các tệp tập lệnh.

Nhưng tôi nghĩ rằng tôi có thể thông minh hơn điều đó bằng cách kích hoạt back-end và DB profile cần thiết trực tiếp từ hồ sơ máy chủ. Hồ sơ máy chủ nằm trong pom chính, ví dụ:

<profile> 
    <id>server.myserver</id> 
    <properties> 
     <jboss.home>D:\Programs\jboss-4.2.1.GA</jboss.home> 
     <server.name>NightlyBuild</server.name> 
     <hosttobind>192.168.1.100</hosttobind> 
     <servlet.port>8080</servlet.port> 
     ... 
     <db>dev02</db> 
    </properties> 
</profile> 

Và phụ trợ và cấu hình DB nằm trong phần phụ của mô-đun con Config, ví dụ:

<profile> 
    <id>db.dev02</id> 
    <activation> 
     <property> 
      <name>db</name> 
      <value>dev02</value> 
     </property> 
    </activation> 
    <properties> 
     <jdbc.address>jdbc:oracle:thin:@192.168.0.101:1521:dbdev02</jdbc.address> 
    </properties> 
</profile> 

Vì vậy, về mặt lý thuyết, kể từ khi hồ sơ server.myserver đặt db tài sản để dev02, điều này sẽ gây ra sự hoạt hóa hồ sơ cá nhân db.dev02 trong pom con. Tuy nhiên, điều này không xảy ra. (Không phải nếu hai cấu hình nằm trong cùng một pom, btw). Nếu tôi đặt thuộc tính từ dòng lệnh với

mvn -Ddb=dev02 help:active-profiles 

thì cấu hình được kích hoạt, vì vậy dường như tôi chưa viết sai chính tả.

Tôi đã bỏ qua điều gì đó chưa? Có cách nào khác để thực hiện công việc này không?

Tôi thấy rằng có một câu hỏi tương tự: Can I make one maven profile activate another?
Tuy nhiên, IMHO không trùng lặp - tôi thấy rằng cách tiếp cận của tôi không hoạt động và tôi muốn hiểu tại sao. (Tôi đã đọc các tài liệu tham khảo, nhưng tôi có thể đã bỏ qua một cái gì đó hiển nhiên).

Trả lời

16

Tính năng này không tồn tại. Trình kích hoạt thuộc tính sử dụng các thuộc tính gửi đến, không phải bất kỳ thứ gì được thiết lập bởi các cấu hình (nếu không nó sẽ không biết thứ tự kích hoạt chúng mà không có một số logic phức tạp hơn).

Giải pháp bạn đã sử dụng, có đặc tính giống nhau để kích hoạt những thứ bạn muốn làm cùng nhau, là giải pháp tốt nhất. Tôi nhận ra rằng có thể không phải lúc nào cũng thỏa đáng - trong trường hợp đó tất cả những gì bạn có thể làm là quay trở lại để làm cho các hồ sơ cá nhân càng đơn giản càng tốt để bạn có thể kết hợp chúng theo cách bạn muốn trên dòng lệnh mà không cần sao chép mọi thứ trên chúng.

Vấn đề bao gồm tính năng này là: https://issues.apache.org/jira/browse/MNG-3309
Vấn đề bao gồm các kích hoạt tài sản là: https://issues.apache.org/jira/browse/MNG-2276

+0

@Brett, cảm ơn, điều này đã xóa mọi thứ. Một điều cuối cùng, tuy nhiên: bạn đã viết "Giải pháp bạn đã sử dụng, có tính chất giống nhau để kích hoạt những thứ bạn muốn làm cùng nhau, là giải pháp tốt nhất". Theo nghĩa nào? Về mặt thẩm mỹ có thể, nhưng nó vẫn không hoạt động ... –

+1

Tôi có nghĩa là một "từ dòng lệnh". Vì vậy, nếu bạn cần 'profile1' để ngụ ý rằng' profile2' được kích hoạt, hãy đảm bảo chúng được kích hoạt bằng 'propertyX', sau đó sử dụng' mvn -DpropertyX' thay vì 'mvn -Pprofile1'. Nó không phải là khá linh hoạt như những gì bạn đang tìm kiếm mặc dù. –

3

Issue MNG-2276 đề cập bởi Brett đã được giải quyết trong maven 3.x, vì vậy bây giờ bạn được phép để xác định thuộc tính trong cài đặt. xml để kích hoạt hồ sơ trong pom của bạn. Dưới đây là một ví dụ:

Trong settings.xml:

<profile> 
    <id>localDist</id> 
    <activation> 
     <property><name>localDist</name></property> 
    </activation> 
    <properties> 
     <doReleaseTasks>true</doReleaseTasks> 
    </properties> 
</profile> 

Trong pom của bạn (hoặc tốt hơn nữa, trong pom mẹ của bạn):

<profile> 
    <id>doReleaseTasks</id> 
    <activation> 
     <property><name>doReleaseTasks</name></property> 
    </activation> 
    <build> 
     <plugins> 
      ... mvn -DlocalDist will activate these plugins 
     </plugins> 
    </build> 
</profile> 

Ý tưởng tốt để sử dụng plugin để buộc chấp hành viên mvn 3.0 hoặc cao hơn:

<build> 
    <plugins> 
     <plugin> 
      <artifactId>maven-enforcer-plugin</artifactId> 
      <executions> 
       <execution> 
        <id>enforce-maven</id> 
        <goals> <goal>enforce</goal> </goals> 
        <configuration> 
         <rules> 
          <requireMavenVersion> 
           <version>[3.0,)</version> 
           <message> 
*** Maven 3.x required to allow cascading profiles to be activated in settings.xml (MNG-2276) 
           </message> 
          </requireMavenVersion> 
         </rules> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 
Các vấn đề liên quan