2012-06-15 51 views
11

Tôi có 2 dự án sử dụng Maven. Đầu tiên là một thư viện chứa các lớp và các phương thức tiện ích. Dự án thứ hai là một ứng dụng thực tế có thư viện như một sự phụ thuộc. Thư viện của tôi sử dụng thư viện bên thứ ba.Hạn chế sự phụ thuộc quá độ vào phạm vi thời gian chạy trong Maven

Vì vậy, đây là những phụ thuộc:

  • Thư viện của tôi: phụ thuộc vào thư viện của bên thứ ba
  • Ứng dụng của tôi: phụ thuộc vào thư viện của tôi

Tuy nhiên, tôi không muốn các lớp thư viện của bên thứ ba có sẵn tại thời gian biên dịch trong đơn đăng ký của tôi. Điều này là do ứng dụng được hỗ trợ bởi một nhóm lớn và tôi muốn ngăn không cho người khác vô tình sử dụng các phương thức từ thư viện của bên thứ ba trong ứng dụng cho rằng một số tên lớp và một số tên phương thức tương tự nhau. Tất nhiên thư viện thứ ba ngang hàng sẽ phải có sẵn trong đơn của tôi theo số thời gian chạy.

Nếu phạm vi cho tất cả các phụ thuộc của tôi là biên dịch, nó sẽ không đạt được mục tiêu của tôi. Có cách nào để đạt được điều này trong Maven 3?

Trả lời

16

Câu hỏi rất hay và không may là bạn không thể làm điều này bằng Maven 3, hoặc 2, hoặc bất kỳ phiên bản nào khác, vì thiết kế cơ bản của nó. Những gì bạn đang hỏi về thực sự là một hành vi mong muốn và lý tưởng vì trên thực tế, bất kỳ phụ thuộc nào của đồ tạo tác đều phải được chuyển đổi với phạm vi runtime. Tuy nhiên, thiết kế như thế này dẫn đến một số vấn đề. Như bạn có thể đọc tại Maven's Introduction to the Dependency Mechanism về compile phạm vi:

Dự kiến ​​này nên phạm vi thời gian chạy thay vào đó, để tất cả phụ thuộc biên dịch phải được liệt kê một cách rõ ràng - tuy nhiên, có những trường hợp nơi thư viện bạn phụ thuộc mở rộng một lớp học từ thư viện khác, buộc bạn phải có sẵn tại thời gian biên dịch. Vì lý do này , phụ thuộc thời gian biên dịch vẫn là phạm vi biên dịch ngay cả khi chúng là số nguyên.

Vì vậy, như bạn thấy, những gì bạn yêu cầu thực sự là thiết kế phù hợp của hành vi này mà không may là không thể thực hiện được.

+1

Tôi đã hy vọng có một cách để làm điều đó . Cảm ơn câu trả lời của bạn, Michal. – Juanal

+0

Điều này đã được trả lời năm trước. Có cách nào để làm điều này ngay bây giờ không? Tôi tự hỏi nếu bạn bằng cách nào đó có thể sử dụng một phạm vi 'nhập khẩu' để hack một giải pháp ở đây? –

+1

Tôi không nghĩ có gì thay đổi ở đây. Như tôi đã nói vào năm 2012, thiết kế Maven rất cơ bản. Tôi tin rằng không có cách nào bây giờ để thay đổi điều này vì nó chỉ là cách Maven làm những điều ngay từ đầu. –

4

Không có gì thay đổi trong ba năm qua, vì vậy câu trả lời của Michal vẫn chính xác: Không có cách nào để hạn chế khả năng hiển thị chuyển tiếp trong Maven. Tuy nhiên, bạn nên xem xét việc thiết kế lại thư viện của bạn để chia nhỏ nó thành một api-artifact cần thiết như phụ thuộc thời gian biên dịch và bản thân nó không phụ thuộc vào thư viện của bên thứ ba và một tạo phẩm triển khai. và tùy thuộc vào thư viện của bên thứ ba.

2

Trong ứng dụng của bạn, bạn có thể khai báo sự phụ thuộc rõ ràng trên thư viện của bên thứ ba bằng phạm vi "thời gian chạy".

Điều này ngăn không cho thư viện của bên thứ ba được nhìn thấy tại thời gian biên dịch và do đó không có tập quán trực tiếp có thể lẻn vào. Tuy nhiên, nó vẫn có mặt tại thời gian chạy (vì thư viện của bạn cần).

Tác phẩm này, nhưng rất khó xử và xứng đáng nhận xét XML giải thích trong pom.

0

Các câu trả lời khác là chính xác. Bên cạnh làm việc xung quanh xung quanh một tính năng rất quan trọng còn thiếu trong maven bằng cách tách ra một module API chỉ nhân tạo, bạn cũng có những lựa chọn thay thế:

  • loại trừ sự phụ thuộc bắc cầu, sau đó phụ thuộc vào chúng trực tiếp (bạn phải quản lý các số phiên bản chính bạn)
  • Sử dụng kiểm soát nhập kiểu séc và CI. Bằng cách đó, các thành viên trong nhóm có thể sử dụng các phần tử chuyển tiếp, nhưng sau đó xác minh maven sẽ thất bại
  • Sử dụng chế độ Gradle. Đây là một giải pháp cho nhiều hạn chế của Maven
Các vấn đề liên quan