2011-01-27 20 views
18

Tôi có trường hợp tôi muốn phụ thuộc vào đường dẫn lớp thời gian chạy nhưng không phải là đường dẫn thử nghiệm. Sự phụ thuộc trong câu hỏi là Logback, một thực thi SLF4J. Trong thời gian chạy, tôi muốn mã của tôi (tùy chọn) phụ thuộc vào logback để nó có sẵn một cơ sở hạ tầng ghi nhật ký. Tuy nhiên, tại thời điểm thử nghiệm, tôi muốn sử dụng triển khai slf4j-nop để lỗ đen đầu ra nhật ký. Với logback là phụ thuộc thời gian chạy và slf4j-nop làm phụ thuộc kiểm tra, tôi nhận được cảnh báo triển khai nhiều từ SLF4J khi chạy thử nghiệm của mình. Tôi không thấy cách loại trừ logback khỏi đường dẫn thử nghiệm.Làm thế nào tôi có thể có một phụ thuộc Maven trên classpath thời gian chạy nhưng không phải là classpath thử nghiệm?

Tôi không muốn chia các bài kiểm tra của mình thành một gói riêng nếu có thể tránh được.

Ý tưởng?

Trả lời

18

Cuối cùng tôi đã tìm được giải pháp thực sự cho điều này. Kể từ phiên bản 2.6 của plugin Maven Surefire, hiện tại có một yếu tố cấu hình classpathDependencyExcludes cho phép các phụ thuộc cụ thể được loại trừ khỏi đường dẫn lớp. Do đó, hoạt động:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>2.8</version> 
    <configuration> 
    <classpathDependencyExcludes> 
     <classpathDependencyExclude>ch.qos.logback:logback-classic</classpathDependencyExclude> 
    </classpathDependencyExcludes> 
    </configuration> 
</plugin> 
+0

Cảm ơn bạn! Bạn đã dành cho tôi rất nhiều thời gian để nghiên cứu với câu trả lời này. –

+1

Cảm ơn một tấn. Buồn nó có vẻ như một hack ... Chúc chúng tôi có thể nhận được một "!" toán tử trong trường phạm vi. –

0

Nó có hoạt động để thêm loại trừ phụ thuộc vào logback từ phụ thuộc phạm vi thử nghiệm slf4j-nop không? Một cái gì đó như

<dependency> 
    <groupId>foo</groupId> 
    <artifactId>slf4j-nop</artifactId> 
    <version>1.0</version> 
    <scope>test</scope> 
    <exclusions> 
    <exclusion> 
     <groupId>foo</groupId> 
     <artifactId>logback</artifactId> 
    </exclusion> 
    </exclusions> 
</dependency> 
+0

Tôi đã thử điều này, nhưng 'loại trừ' chỉ loại trừ phụ thuộc chuyển tiếp của gói được đề cập; thật không may, có vẻ như nó không thể được sử dụng để loại trừ các phụ thuộc tùy ý được truyền vào từ các classpath khác. –

2

Nếu tắt đầu ra nhật ký là những gì bạn muốn, hãy thêm tệp cấu hình đăng nhập vào src/test/resources để loại bỏ tất cả đầu ra.

Nếu bạn cần làm điều này cho nhiều mô-đun trong cùng một lò phản ứng, hãy xem xét sử dụng maven remote resources plugin.

Plugin này được sử dụng để truy xuất JAR tài nguyên từ kho lưu trữ từ xa, xử lý các tài nguyên đó và kết hợp chúng vào các JAR bạn xây dựng với Maven. Một trường hợp sử dụng rất phổ biến là cần phải đóng gói một số tài nguyên nhất quán theo cách nhất quán trong tổ chức của bạn.

+0

Tôi có thể phải đi với điều này; Thật không may, nó cũng sẽ yêu cầu tái cơ cấu dự án hơn nữa (đó là một dự án đa mô-đun, vì vậy tôi phải đảm bảo rằng các tập tin cấu hình có sẵn trong tất cả chúng). –

+0

@Michael: vui lòng xem bản cập nhật của tôi –

1

Theo tôi biết bạn không phải loại trừ nó khỏi đường dẫn lớp thử nghiệm. Maven nên giữ thứ tự phụ thuộc trong classpath. Nếu bạn đặt sự phụ thuộc thử nghiệm của bạn trước khi phụ thuộc thời gian chạy trong các phụ thuộc, nó cũng phải là đầu tiên trong classpath và ClassLoader sẽ tìm các lớp trong phụ thuộc kiểm thử đầu tiên khi 2 phụ thuộc có cùng các lớp. Vì vậy, slf4j sau đó sẽ tìm thấy các ràng buộc tĩnh của slf4j-nop và không phải là ràng buộc logback.

+0

Có, tuy nhiên, SLF4J sau đó in cảnh báo về nhiều đường dẫn lớp. Tôi đang cố tránh cảnh báo. –

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