2011-01-17 29 views
62

Tôi đang cố gắng tìm một cách "chung chung" để loại trừ một sự phụ thuộc quá độ từ việc được đưa vào mà không phải loại trừ nó khỏi tất cả các phụ thuộc phụ thuộc vào nó. Ví dụ, nếu tôi muốn loại trừ slf4j, tôi thực hiện như sau:Có cách nào để loại trừ phụ thuộc Maven trên toàn cầu không?

<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-jmx</artifactId> 
    <version>3.3.2.GA</version> 
    <exclusions> 
     <exclusion> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
     </exclusion> 
    </exclusions> 
    </dependency> 
    <dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-entitymanager</artifactId> 
    <version>3.4.0.GA</version> 
    <type>jar</type> 
    <exclusions> 
     <exclusion> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
     </exclusion> 
    </exclusions> 
    </dependency> 

Đây là một phần để làm sạch các tập tin pom, một phần để tránh các vấn đề trong tương lai với những người bổ sung phụ thuộc mà phụ thuộc vào sự phụ thuộc đó loại trừ - và quên loại trừ nó.

Có cách nào không?

+2

Không giải quyết vấn đề, nhưng maven-enforcer-plugin có một [cấm phụ thuộc đặc trưng] (https://maven.apache.org/ thi hành/thi hành-quy tắc/cấmDependencies.html) sẽ thất bại trong việc xây dựng nếu phụ thuộc không mong muốn lẻn vào. Bạn vẫn phải tự loại trừ chúng, mặc dù: -/ – dnault

+0

Một câu trả lời thay thế có sẵn ở đây: http://stackoverflow.com/a/39979760/363573 – Stephan

Trả lời

49

Điều này có hữu ích không? http://jlorenzen.blogspot.com/2009/06/maven-global-excludes.html

"Giả sử tôi muốn loại trừ avalon-framework từ WAR của tôi, tôi sẽ thêm dòng sau vào các dự án của tôi pom với một phạm vi cung cấp. Điều này hoạt động trên tất cả các phụ thuộc bắc cầu và cho phép bạn xác định nó một lần.

<dependencies> 
    <dependency> 
     <artifactId>avalon-framework</artifactId> 
     <groupId>avalon-framework</groupId> 
     <version>4.1.3</version> 
     <scope>provided</scope> 
    </dependency> 
</dependencies> 

Điều này thậm chí hoạt động khi chỉ định trong POM mẹ, điều này sẽ ngăn các dự án phải khai báo điều này trong tất cả các POM con. "

+1

Nó đã làm các trick, hoàn hảo! –

+36

Nó vẫn chỉ là một phần hack - sự phụ thuộc sẽ không kết thúc bên trong tạo tác xây dựng nhưng nó vẫn có sẵn trong các thử nghiệm. –

+0

@TuukkaMustonen Phạm vi 'thời gian chạy' thay vì phạm vi 'được cung cấp' là gì? – Stephan

14

Tôi tạo ra một lọ rỗng và tạo ra sự phụ thuộc này:

<dependency> 
    <groupId>commons-logging</groupId> 
    <artifactId>commons-logging</artifactId> 
    <scope>system</scope> 
    <systemPath>${basedir}/src/lib/empty.jar</systemPath> 
    <version>0</version> 
</dependency> 

Nó không phải là hoàn hảo bởi vì từ bây giờ trở đi bạn có một lọ rỗng trên đường đi biên dịch/thử nghiệm của bạn. Nhưng đó chỉ là mỹ phẩm.

3

Xin nhắc lại, đây là câu trả lời từ tài liệu chính thức Maven:

Tại sao loại trừ được thực hiện trên một cơ sở cho mỗi phụ thuộc, chứ không phải ở cấp POM

Đây là chủ yếu được thực hiện để chắc chắn rằng đồ thị phụ thuộc có thể dự đoán được và để giữ các hiệu ứng kế thừa từ loại trừ một sự phụ thuộc không nên bị loại trừ. Nếu bạn nhận được phương pháp cuối cùng và phải đưa vào một loại trừ, bạn nên hoàn toàn chắc chắn mà phụ thuộc của bạn là đưa vào đó phụ thuộc không mong muốn transitive.

Nếu ai muốn làm một xây dựng mạnh mẽ hơn, một loạt phiên bản có thể được sử dụng. Điều này sẽ đảm bảo rằng không có phiên bản mới hơn của sự phụ thuộc có thể can thiệp vào dự án.

<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-api</artifactId> 
    <version>[1.4.2,)</version> 
    <scope>provided</scope> 
</dependency> 

Bất kỳ phiên bản slf4j-api> = 1.4.2 sẽ được coi là cung cấp (cung cấp) trong thời gian chạy, hoặc bằng cách JDK bản thân hoặc một container.

Tài liệu tham khảo

2

Mở rộng trên dnault's comment:

Người ta có thể sử dụng Maven Enforcer plugin's Banned Dependencies rule để đảm bảo phụ thuộc được loại trừ. Người ta vẫn phải loại trừ chúng theo cách thủ công, nhưng việc xây dựng sẽ thất bại nếu có ai đó thêm phụ thuộc vào nơi khác do nhầm lẫn.

<dependencies> 
    <dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-jmx</artifactId> 
    <version>3.3.2.GA</version> 
    <exclusions> 
     <exclusion> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
     </exclusion> 
    </exclusions> 
    </dependency> 
</dependencies> 

<plugins> 
    <plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-enforcer-plugin</artifactId> 
    <version>1.4.1</version> 
    <executions> 
     <execution> 
     <goals> 
      <goal>enforce</goal> 
     </goals> 
     <configuration> 
      <rules> 
      <bannedDependencies> 
       <excludes> 
       <exclude>org.slf4j:slf4j-api</exclude> 
       </excludes> 
      </bannedDependencies> 
      </rules> 
     </configuration> 
     </execution> 
    </executions> 
    </plugin> 
</plugins> 

Cũng có một tính năng yêu cầu mở: MNG-1977 Global dependency exclusions

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