2014-12-31 16 views
13

Cách tốt nhất để khai báo sự phụ thuộc Maven là chỉ được sử dụng cho đường dẫn lớp thử nghiệm (nhưng không biên dịch thử nghiệm) là gì?Khai báo phụ thuộc Maven là thời gian chạy thử nghiệm chỉ

Cụ thể, tôi muốn slf4j-api (mặt tiền ghi) là phụ thuộc phạm vi biên dịch điển hình, nhưng tôi muốn slf4j-simple (việc triển khai thanh barebones phù hợp với kiểm tra đơn vị) chỉ trên đường dẫn lớp thử nghiệm (không cần thiết để biên dịch thử nghiệm)). Tôi đã làm điều này:

<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-api</artifactId> 
</dependency> 
<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-simple</artifactId> 
    <scope>test</scope> 
</dependency> 

Tuy nhiên, nhược điểm của việc này là dependency:analyze báo cáo slf4j-simple như không sử dụng, có lẽ vì nó không cần thiết cho biên soạn:

[WARNING] Unused declared dependencies found: 
[WARNING] org.slf4j:slf4j-simple:jar:1.7.7:test 

tôi có thể không sử dụng một runtime phụ thuộc vì tôi không muốn sự phụ thuộc quá thừa kế đó (ví dụ như các phụ thuộc hạ lưu có thể sử dụng log4j, vv thay thế). Tôi đã thử runtime với optional=true, nhưng điều đó dẫn đến cùng cảnh báo.

(Lưu ý rằng tôi cũng có thể thiết ignoreNonCompile cho các plugin phụ thuộc, nhưng điều đó dường như là một công cụ rất cùn rằng sẽ che giấu các vấn đề tiềm năng khác.)

+0

yêu cầu này là gì khi chạy cho nguồn chính? nó sẽ không phàn nàn về sự phụ thuộc vào phạm vi 'runtime'? –

+0

Nói chung phụ thuộc transitive không cần phải được khai báo. Đối với một phụ thuộc tùy chọn (thường như đăng nhập có thể sử dụng các khung công tác khác nhau), quy trình của bạn là đúng. Có lẽ bạn cũng có thể thêm thử nghiệm phạm vi. –

+0

Nó cũng khiếu nại (sai, IMHO) cho một phụ thuộc 'thời gian chạy', vì vậy nó có vẻ như phạm vi một mình không phải là câu trả lời ở đây. Những gì tôi thực sự muốn là một phạm vi đó là giao điểm của 'test' và' runtime' (theo như đường dẫn lớp) và cho plugin phụ thuộc để ít hoạt động hơn về các phụ thuộc "runtime" không được sử dụng. –

Trả lời

7

Không có phạm vi nào thực hiện chính xác những gì bạn muốn ở đây; test là tùy chọn khả dụng tốt nhất.

A test-runtime phạm vi đã được yêu cầu trước (Re: Need for a test-runtime scope?) và cách giải quyết được đề xuất chính xác là cấu hình ignoreNonCompile bạn đã khám phá.

dependency:analyze đã có một số hạn chế ("some cases are not detected (constants, annotations with source-only retention, links in javadoc)"). Bạn có thể phải chấp nhận rằng bất kỳ phụ thuộc nào của test -scope mà cảnh báo chống lại là dương tính giả.

(Bạn thể chia định nghĩa của các bài kiểm tra của bạn thành một mô-đun riêng biệt, trong đó sẽ không có slf4j phụ thuộc thực hiện, sau đó chạy chúng trong mô-đun khác. Tôi không nghĩ rằng sẽ có giá trị nó.)

+1

Đối với vấn đề javadoc tôi đã sử dụng để liên kết đến tên lớp đầy đủ và thêm url liên kết cơ sở vào plugin javadoc và không khai báo sự phụ thuộc vào dự án.Điều này tránh có một tuyên bố nhập khẩu và các vấn đề tiêu cực tiềm năng khác của việc có một sự phụ thuộc được liệt kê mà không thực sự được yêu cầu. –

4

Không có khái niệm về kiểm tra-runtime trong maven. Nhược điểm thực sự duy nhất là phân tích phụ thuộc xác định các phụ thuộc kiểm tra thời gian chạy này là không sử dụng. Tuy nhiên, vì chúng chỉ là các phụ thuộc thử nghiệm, điều này khá lành tính và không thể gây ra các vấn đề cho các dự án khác quá phụ thuộc vào dự án này.

2

Vì plugin phụ thuộc maven 2.10 (revision 1649454, tháng 1 năm 2015), bạn cũng có thể thêm vào cấu hình danh sách ignoredDependencies, ignoredUnusedDeclaredDependenciesignoredUsedUndeclaredDependencies.

+0

Bạn có thể giải thích thêm một chút không? –

+0

Các tùy chọn này đã được thêm ngay sau khi tôi đặt câu hỏi, và tôi nghĩ rằng chúng, cùng với câu trả lời được chấp nhận, là phương pháp tốt nhất có sẵn để giải quyết vấn đề này. –

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