2011-10-26 27 views
23

Ví dụ, tôi có 2 dự án Maven. Một là "dự án-cha mẹ". Cái còn lại là "project-child". Rõ ràng, "project-child" là dự án con của "project-parent".Làm thế nào để loại trừ một sự phụ thuộc từ dự án của cha mẹ trong Maven?

"dự án-cha mẹ" có sự phụ thuộc của log4j. Nhưng tôi muốn loại trừ nó khỏi "project-child". Là có một cách?

Bạn có thể nói tôi nên di chuyển log4j từ "project-parent" sang "project-child". Điều đó hoàn toàn chính xác. Nhưng giả định là tôi KHÔNG THỂ sửa đổi POM của "project-parent".

Xin cảm ơn trước.

Trả lời

9

Tôi nghĩ rằng trong Maven2 không có cách nào để đạt được điều này, bởi vì đây là những gì POM kế thừa là cho . Tuy nhiên, có một mẹo mà tôi có thể nghĩ đến:

Giả sử bạn có quyền tải lên tạo phẩm cho kho lưu trữ nội bộ của bạn. Bạn có thể tạo một JAR trống, triển khai nó như log4j: log4j, với một phiên bản rõ ràng bất thường (ví dụ: log4j: log4j: 9999). Thêm sự phụ thuộc như vậy vào dự án-con của bạn. Sau đó, nó sẽ ghi đè lên sự phụ thuộc của cha mẹ để phụ thuộc vào một JAR trong thực tế có sản phẩm nào.

+1

Một phụ lưu ý: ai đó đang làm điều tương tự và cung cấp một kho lưu trữ công cộng cho các loại như các hiện vật "trống rỗng" (http://version99.qos.ch/) . Họ sử dụng '99-empty' làm phiên bản. Mọi người xem xét cách tiếp cận được đề xuất bởi tôi có thể sử dụng điều này như là quy ước. –

1

Nếu tôi hiểu câu hỏi, những gì bạn cần là một cái gì đó như sau. Nó kéo theo sự phụ thuộc và loại trừ sự phụ thuộc đó khỏi việc thêm vào danh sách phụ thuộc của nó. Thông thường, điều này được sử dụng nếu bạn muốn tiêm phiên bản mới hơn của gói thay vì gói được tham chiếu trong gói khác.

<dependency> 
    <groupId>log4j</groupId> 
    <artifactId>log4j</artifactId> 
    <version>1.2.15</version> 
    <exclusions> 
     <exclusion> 
      <groupId>com.sun.jmx</groupId> 
      <artifactId>jmxri</artifactId> 
     </exclusion> 
     ... 
    </exclusions> 
    ... 

Nếu bạn đang thay vì nói về một mối quan hệ <parent> sau đó tôi không chắc chắn có một cách để làm điều này. Bạn có thể chuyển đổi từ số điện thoại <parent> thành <dependency> không?

+0

Tôi có nghĩa là một phụ thuộc kế thừa từ dự án mẹ, không phụ thuộc transitive từ phụ thuộc trực tiếp như ví dụ của bạn. Dù sao, cảm ơn rất nhiều. :) – Smartmarkey

+0

Vâng, tôi không chắc chắn nếu bạn có thể làm điều đó. Bạn có thấy câu hỏi này không: http://stackoverflow.com/questions/2681759/is-there-anyway-to-exclude-artifacts-inherited-from-a-parent-pom – Gray

+0

Cảm ơn bạn đã liên kết. Toi đã đọc nó. Có vẻ như không có cách nào trong Maven chính thức. Tôi phải làm loại giải pháp. – Smartmarkey

9

Tôi không biết cách nào thực sự loại trừ sự phụ thuộc, nhưng bạn có thể loại trừ nó khỏi phân phối đích, nhưng đó là một chút của một hack. Bạn cần phải thay đổi phạm vi phụ thuộc vào thứ gì đó mà bạn có thể loại trừ trong bản phân phối cuối cùng.

Vì vậy, nói rằng mẹ tôi đã có một sự phụ thuộc vào junit 4.8, trong pom tôi bạn nói:

<dependency> 
    <groupId>junit</groupId> 
    <artifactId>junit</artifactId> 
    <version>4.8</version> 
    <scope>provided</scope> 
</dependency> 

Vì vậy, chúng tôi đang thay đổi phạm vi để cung cấp. Để được giải thích về cách hoạt động của tính năng này, hãy xem câu trả lời của tôi cho NoClassDefFoundError: org/junit/AfterClass during annotation processing. Thật không may, điều này không ảnh hưởng đến việc xây dựng, nhưng khi bạn đang sao chép các phụ thuộc cho việc phân phối chính thức, bạn có thể sử dụng các yếu tố excludeScope cấu hình để không copy phụ thuộc vào sự phân bố chính thức:

<plugin> 
<artifactId>maven-dependency-plugin</artifactId> 

<executions> 
    <execution> 
     <id>copy-libs</id> 
     <phase>package</phase> 
     <goals> 
      <goal>copy-dependencies</goal> 
     </goals> 
     <configuration> 
      <outputDirectory>${project.build.directory}/lib</outputDirectory> 
      <excludeScope>provided</excludeScope> 
     </configuration> 
    </execution> 
+0

Cảm ơn. Tôi đã loại trừ các phụ thuộc không mong muốn từ gói phân phối, nhưng tôi đang sử dụng trong assembly.xml của Maven Assembly plugin cho nó. Tôi yêu cầu một cách để loại trừ các phụ thuộc không mong muốn khỏi môi trường dev, giống như Eclipse. :) – Smartmarkey

0

Một cách hacky để thực hiện điều này là để xác định sự phụ thuộc trong project-child nhưng với phạm vi 'test' (hoặc bất kỳ phạm vi trọng lượng nhẹ nhất nào có sẵn). Điều này sẽ "ẩn" phạm vi được chỉ định trong dự án-cha mẹ để nó có sẵn chỉ để kiểm tra mã, và không có sẵn để không kiểm tra mã ở cả hai biên dịch và thời gian chạy.

Tôi đã xem xét tính năng lỗi này chủ yếu là do nhầm lẫn. Trong trường hợp của tôi, dự án-con của tôi có một dự án-anh chị em với một phụ thuộc phạm vi 'biên dịch', trong khi dự án-cha mẹ có cùng một phụ thuộc được chỉ định (thực sự được thừa hưởng từ một ông bà) với phạm vi 'được cung cấp'. project-child là một file thực thi, tuy nhiên nó phụ thuộc vào project-sibling, và do đó NoClassDefFoundError được ném vào thời gian chạy từ project-sibling vì classpath thời gian chạy của project-child đang được sử dụng, không bao gồm phụ thuộc 'provided'.Tôi đã sửa lỗi này bằng cách di chuyển phụ thuộc 'biên dịch' từ dự án-anh chị em sang dự án-cha mẹ để 'biên dịch' sẽ "ẩn" phần 'được cung cấp'.

1

Tôi đã gặp cùng một câu hỏi giống như bạn. Trong dự án của tôi, hãy gọi pom cha mẹ là parent.pom. cha mẹ đã xác định log4j, slf4j như sau:

 <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-api</artifactId> 
      <version>${slf4j-api.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>log4j</groupId> 
      <artifactId>log4j</artifactId> 
      <version>${log4j.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>jcl-over-slf4j</artifactId> 
      <version>${slf4j-api.version}</version> 
     </dependency> 

     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-log4j12</artifactId> 
      <version>${slf4j-log4j12.version}</version> 
     </dependency> 

dự án con gọi một số phụ thuộc vào child.pom. Nhưng tôi không muốn phụ thuộc log4j-1.2.x và muốn tăng phiên bản của slf4j.

So. Tôi thêm sự phụ thuộc của cha mẹ

<dependency> 
     <groupId>parent</groupId> 
     <artifactId>myartifactId</artifactId> 
     <version>${my parent version}</version> 
</dependency> 

và sử dụng trừ để loại bỏ các log4j

<dependency> 
     <groupId>parent</groupId> 
     <artifactId>myartifactId</artifactId> 
     <version>${my parent version}</version> 
     <exclusions> 
      <exclusion> 
       <groupId>log4j</groupId> 
       <artifactId>log4j</artifactId> 
      </exclusion> 
     </exclusions> 
</dependency> 

và thêm rõ sự slf4j và phụ thuộc log4j2 trong pom con

<dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
     <version>1.7.6</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.logging.log4j</groupId> 
     <artifactId>log4j-slf4j-impl</artifactId> 
     <version>2.8.2</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.logging.log4j</groupId> 
     <artifactId>log4j-api</artifactId> 
     <version>2.8.2</version> 
    </dependency> 

    <dependency> 
     <groupId>org.apache.logging.log4j</groupId> 
     <artifactId>log4j-core</artifactId> 
     <version>2.8.2</version> 
    </dependency> 

    <dependency> 
     <groupId>com.lmax</groupId> 
     <artifactId>disruptor</artifactId> 
     <version>3.3.4</version> 
    </dependency> 

sau đó sử dụng phụ thuộc mvn: cây để hiển thị danh sách phụ thuộc, vẫn thấy log4j

[INFO] +- org.apache.kafka:kafka_2.10:jar:0.8.2.0:compile 
[INFO] | +- com.yammer.metrics:metrics-core:jar:2.2.0:compile 
[INFO] | +- org.scala-lang:scala-library:jar:2.10.4:compile 
[INFO] | +- org.apache.zookeeper:zookeeper:jar:3.4.6:compile 
[INFO] | | +- org.slf4j:slf4j-log4j12:jar:1.7.5:compile 
[INFO] | | +- log4j:log4j:jar:1.2.17:compile 

tốt, chúng ta hãy thêm các loại trừ sự phụ thuộc vào điều đó ... loại bỏ anh chàng này.

<dependency> 
     <groupId>org.apache.kafka</groupId> 
     <artifactId>kafka-clients</artifactId> 
     <version>0.10.1.1</version> 
     <exclusions> 
      <exclusion> 
       <groupId>log4j</groupId> 
       <artifactId>log4j</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 

sau đó chạy lại lệnh để kiểm tra danh sách phụ thuộc. ĐƯỢC! rõ ràng ~

Hy vọng rằng sẽ có thể giúp bạn:>

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