2013-06-03 25 views
26

Tôi đã đọc tài liệu và có một số hiểu biết.Sự khác biệt giữa các phạm vi phụ thuộc Maven này là gì: được cung cấp/biên dịch/hệ thống/nhập

Vui lòng sửa hoặc thông báo cho tôi sự thật; theo hiểu biết của tôi:

  • provided
    Các phụ thuộc phải sẽ là trên máy bạn chạy các mã trên, và phải được bao gồm trong đường dẫn

  • compile
    Các phụ thuộc sẽ không được trên máy tính này chạy mã, vì vậy hãy bao gồm chúng trong phần xây dựng

  • system
    Chính xác như được cung cấp, nhưng bạn cần phụ thuộc để có mặt trong tệp jar đúng

  • import
    Có vẻ như nó nên nhập phụ thuộc từ một số tập tin POM khác nhưng tôi không biết làm thế nào/tại sao, do đó, một chút xây dựng sẽ được đánh giá

+3

http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html –

+0

Đó là nơi tôi đọc từ, nhưng bằng cách nào đó tôi cảm thấy tôi không hiểu điều đó đúng cách, do đó câu hỏi về SO. Cảm ơn mặc dù! –

+0

FYI, ví dụ thực tế về việc sử dụng 'cung cấp' xem Câu hỏi, [Bao gồm thư viện trong khi lập trình & biên dịch, nhưng loại trừ khỏi xây dựng, trong dự án dựa trên NetBeans Maven] (https://stackoverflow.com/q/32087445/642706) –

Trả lời

46

Bạn đang sai/nhập nhằng về provided . Nó có nghĩa là, "jar này nên được biên dịch với địa phương, nhưng nó sẽ được cung cấp trên classpath bởi cái gì khác trong thời gian chạy, do đó, không bao gồm nó trong classpath cho tôi." Ví dụ, tất cả các thùng chứa web (ví dụ: tomcat) bao gồm các lọ cho các servlet. Bạn nên sử dụng provided cho các lớp servlet để bạn có thể biên dịch mã cục bộ, nhưng bạn không muốn ghi đè lên các lớp servlet mà tomcat cung cấp cho bạn khi bạn triển khai nó.


system có nghĩa là "Những phụ thuộc đang trên hệ thống của tôi và tôi muốn chỉ cho họ trực tiếp". Bạn muốn tránh điều này nếu bạn có thể, bởi vì một người khác trên một máy tính khác sẽ không nhất thiết phải có những phụ thuộc này.

Sự khác biệt giữa provided là dễ dàng hơn để hiển thị:

<dependency> 
    <groupId>javax.sql</groupId> 
    <artifactId>jdbc-stdext</artifactId> 
    <version>2.0</version> 
    <scope>system</scope> 
    <systemPath>${java.home}/lib/rt.jar</systemPath> 
</dependency> 

Xem cách nó có mà <systemPath>? Đó là sự khác biệt. Bạn không chỉ định đường dẫn với provided, được cung cấp biết cách nhận phụ thuộc từ kho lưu trữ. system chỉ nhận được từ hệ thống tệp của bạn.


Tôi chưa từng nghe nói đến import. @JigarJoshi liên quan đến http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html mà nói

nhập khẩu (chỉ có sẵn trong Maven 2.0.9 hoặc mới hơn)

phạm vi này chỉ được sử dụng trên một sự phụ thuộc của loại pom trong phần <dependencyManagement>. Nó chỉ ra rằng POM được chỉ định nên được thay thế bằng các phụ thuộc trong phần của POM. Vì chúng được thay thế, các phụ thuộc với một phạm vi nhập khẩu không thực sự tham gia vào việc hạn chế sự chuyển đổi của sự phụ thuộc.

tôi nghĩ này đang nói: "thực hiện tất cả các phụ thuộc dự án này đã và inline họ trong phần <dependencyManagement> này." Ai đó sửa tôi nếu tôi sai.

+0

Có điều đó không rõ ràng. Những gì tôi có nghĩa là (cho cung cấp) 'Tôi có phụ thuộc vào máy tính của tôi ngay bây giờ, vì vậy hiện đang sử dụng chúng. Nhưng khi bạn xây dựng gói, đừng lo lắng về chúng vì máy mà tôi sẽ chạy mã này sẽ có các phụ thuộc và có classpath được thiết lập phù hợp '. Đó là điều tương tự mà bạn đang nói, phải không? –

15

Hãy tìm ra ý nghĩa chính xác của phạm vi trong Maven

tôi giới thiệu đến Maven http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html

phạm vi phụ thuộc được sử dụng để hạn chế transitivity của một phụ thuộc, và cũng có thể làm ảnh hưởng đến classpath sử dụng để xây dựng nhiệm vụ khác nhau.

Có 6 phạm vi có sẵn:

  • biên dịch:

    Đây là phạm vi mặc định, được sử dụng nếu không được chỉ định. Các phụ thuộc biên dịch có sẵn trong tất cả các classpath của một dự án. Hơn nữa, những phụ thuộc đó được truyền cho các dự án phụ thuộc.

  • cung cấp:

    Đây là giống như biên dịch, nhưng chỉ bạn mong đợi JDK hoặc một container để cung cấp các phụ thuộc khi chạy. Ví dụ, khi xây dựng một ứng dụng web cho Java Enterprise Edition, bạn sẽ thiết lập sự phụ thuộc vào API Servlet và các API Java EE có liên quan đến phạm vi được cung cấp bởi vì thùng chứa web cung cấp các lớp đó. Phạm vi này chỉ có sẵn trên đường dẫn biên dịch và kiểm tra, và không phải là transitive.

  • runtime:

    phạm vi này chỉ ra rằng sự phụ thuộc là không cần thiết cho biên soạn, nhưng là để thi hành. Đó là trong thời gian chạy và kiểm tra classpaths, nhưng không phải là classpath biên dịch.

  • kiểm tra:

    phạm vi này chỉ ra rằng sự phụ thuộc không được yêu cầu để sử dụng bình thường của ứng dụng, và chỉ có sẵn cho các thử nghiệm biên soạn và thực hiện giai đoạn.

  • hệ thống:

    phạm vi này cũng tương tự như cung cấp ngoại trừ việc bạn phải cung cấp JAR chứa nó một cách rõ ràng. Tạo phẩm luôn luôn có sẵn và không được tra cứu trong kho lưu trữ.

  • nhập khẩu (chỉ có sẵn trong Maven 2.0.9 hoặc mới hơn):

    phạm vi này chỉ được sử dụng trên một sự phụ thuộc của loại pom trong phần này. Nó chỉ ra rằng POM được chỉ định nên được thay thế bằng các phụ thuộc trong phần của POM. Vì chúng được thay thế, các phụ thuộc với một phạm vi nhập khẩu không thực sự tham gia vào việc hạn chế sự chuyển đổi của sự phụ thuộc.

+2

Chỉ trích dẫn tài liệu không thực sự hữu ích ở đây. Đây là một vấn đề phức tạp có thể sử dụng ** một số lời giải thích và ví dụ ** ngoài câu hoặc hai tài liệu đơn thuần. –