2010-08-20 36 views
7

Giả sử tôi có một mô-đun A:jar, có thời gian chạy và tập hợp các phụ thuộc phụ thuộc vào phiên bản JDK. Trong ví dụ của tôi, tôi có một số pre-jdk6-profile cho JAXB API: trước JDK 1.6.0, tôi cần bao gồm jaxb-api-nnn.jar làm phụ thuộc biên dịch. Hồ sơ này được đặt ở A.pom.Làm thế nào để kích hoạt cấu hình Maven trong một mô-đun phụ thuộc?

Tôi cũng có mô-đun B:war, phụ thuộc vào A:jar. Tôi muốn có thể kích hoạt hồ sơ này trên máy chủ xây dựng để xây dựng JDK 1.5.x có thể phân phối. Khi tôi thực hiện Maven với một hồ sơ được kích hoạt, tôi nhận được thông báo:

mvn -Ppre-jdk6-profile -o install 
[WARNING] 
     Profile with id: 'pre-jdk6-profile' has not been activated. 

jaxb-api-nnn.jar là mất tích trong kết quả B.war. Tuy nhiên, nếu tôi kích hoạt hồ sơ này khi xây dựng từ phụ huynh pom.xml, mọi thứ đều ổn. Điều đó có nghĩa là các cấu hình không được thừa kế từ các phụ thuộc và pom.xml đa mô-đun cha mẹ có thể xây dựng mọi thứ một cách chính xác vì có vẻ như tất cả các cấu hình được hợp nhất trong lò phản ứng.

Việc chuyển cấu hình sang pom chính sẽ khiến mọi thứ trở nên tồi tệ hơn vì phụ thuộc được áp dụng cho tất cả các dự án khác (ví dụ: C:ear). Có những giải pháp tốt đẹp cho nhiệm vụ này, cụ thể là, nếu bất kỳ mô-đun A phụ thuộc vào mô-đun B, sau đó tất cả các phụ thuộc biên dịch và thời gian chạy được kích hoạt bởi một cấu hình, được xử lý một cách chính xác?

Hồ sơ trong dự án A:jar sau:

<project ...> 
    <artifactId>A</artifactId> 
    <packaging>jar</packaging> 
    ... 
    <parent> 
     <artifactId>P</artifactId> 
     ... 
    </parent> 

    <profiles> 
     <profile> 
      <id>pre-jdk6-profile</id> 

      <activation> 
       <jdk>(,1.6.0)</jdk> 
      </activation> 

      <dependencies> 
       <dependency> 
        <groupId>javax.xml.ws</groupId> 
        <artifactId>jaxws-api</artifactId> 
       </dependency> 
      </dependencies> 
     </profile> 
    </profiles> 
... 
</project> 

Trả lời

8

a) Trong một đa mô-đun xây dựng, bạn nên luôn luôn xây dựng từ pom đầu, không bao giờ từ một module riêng biệt. Nếu bạn muốn xây dựng chỉ có một mô-đun, sử dụng tùy chọn lò phản ứng tiên tiến (xem --help mvn) như thế này:

mvn -pl mymodule 

b) Xác định và kích hoạt cấu hình trong pom mẹ, nhưng thêm các cấu hình trong pom con .

mẹ pom.xml

<profiles> 
    <profile> 
     <id>pre-jdk-6</id> 
     <activation> 
      <jdk>(,1.6.0)</jdk> 
     </activation> 
    </profile> 
</profiles> 

pom.xml con

<profiles> 
    <profile> 
     <id>pre-jdk-6</id> 

     <dependencies> 
      <dependency> 
       <groupId>javax.xml.ws</groupId> 
       <artifactId>jaxws-api</artifactId> 
      </dependency> 
     </dependencies> 
    </profile> 
</profiles> 
+0

Tôi có cần thêm phần thứ 2 vào mô-đun 'A' hoặc mô-đun' B' không? –

+0

cả hai. Trong JAR với ' được cung cấp ', trong webapp với phạm vi mặc định. Nhưng trong cả hai bên trong hồ sơ. –

+0

Tôi tin rằng, tôi có thể sử dụng chỉ (b) nếu tôi chạy xây dựng trên Hudson.Cảm ơn bạn đã gợi ý. –

1

Một số lưu ý cách sau khi thực tế:

  1. Khi bạn sử dụng -P profName, nó kích hoạt một tiểu sử có tên ' profName '
  2. Sau đó, nó vô hiệu hóa tất cả hồ sơ s có một thẻ <activation> cho chúng. Nó không quan trọng cho dù chúng được kích hoạt bởi phiên bản java, như trong ví dụ, hoặc theo mặc định hoặc giá trị env hoặc bất cứ điều gì.
  3. Điều đó có nghĩa là -P khiến bất kỳ hồ sơ nào được kích hoạt khác bị vô hiệu hóa.

Giải pháp: Hoặc sử dụng <activation><jdk>...</jdk></activation> hoặc sử dụng -P nhưng không sử dụng cả hai.

Các vấn đề liên quan