Sự khác biệt giữa loại phụ thuộc "pom" với phạm vi "nhập" và không có "nhập" là gì?


112

Bắt đầu từ Maven 2.0.9, có thể bao gồm

<type>pom</type>
<scope>import</scope>

trong <dependencyManagement>phần.

Theo tôi hiểu, nó sẽ được "thay thế" bằng các phụ thuộc có trong pom này như thể chúng được định nghĩa ban đầu ở đây.

Sự khác biệt giữa giải pháp ở trên và sự phụ thuộc đơn giản đối với pom không có importphạm vi này là gì (tôi thấy phần sau được gọi là "nhóm phụ thuộc")? Có phải sự khác biệt duy nhất mà các phụ thuộc "được nhóm" như vậy có mức độ ưu tiên thấp hơn trong khi giải quyết mức độ ưu tiên của các phụ thuộc không?

Câu trả lời:


187

Bạn chỉ có thể nhập các phần phụ thuộc được quản lý . Điều này có nghĩa là bạn chỉ có thể nhập các dependencyManagementPOM khác vào phần POM của dự án. I E

...
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>other.pom.group.id</groupId>
            <artifactId>other-pom-artifact-id</artifactId>
            <version>SNAPSHOT</version>
            <scope>import</scope>
            <type>pom</type>
        </dependency>   
    </dependencies>
</dependencyManagement>
...

Điều gì xảy ra sau đó là tất cả các phụ thuộc được xác định trong dependencyManagementphần của phần này other-pom-artifact-idđều được đưa vào dependencyManagementphần POM của bạn . Sau đó, bạn có thể tham chiếu các phụ thuộc này trong dependencyphần POM của bạn (và tất cả các POM con của nó) mà không cần phải bao gồm versionv.v.

Tuy nhiên, nếu trong POM của bạn, bạn chỉ cần xác định một phụ thuộc thông thường other-pom-artifact-idthì tất cả dependenciestừ dependencyphần của phần này other-pom-artifact-idsẽ được đưa vào dự án của bạn - tuy nhiên các phần phụ thuộc được xác định trong dependencyManagementphần của phần này hoàn toàn other-pom-artifact-idkhông được đưa vào.

Vì vậy, về cơ bản hai cơ chế khác nhau được sử dụng để nhập / bao gồm hai loại phụ thuộc khác nhau (phụ thuộc được quản lý và phụ thuộc bình thường).

Có một trang tốt trên trang web maven, có thể giải thích điều này tốt hơn nhiều so với tôi, Quản lý phụ thuộc trong Maven và nó cũng chứa thông tin cụ thể về việc nhập các phụ thuộc .


1
Nếu pomA in là cha của pomB, bạn có thể đặt B vào quản lý phụ thuộc của dự án A với phạm vi importkhông?
Janez Kuhar

câu trả lời tuyệt vời để giải thích cách nó hoạt động, nhưng tại sao ?? tại sao bạn không muốn bao gồm các phụ thuộc khác chuyển tiếp? bạn cũng có thể làm cả hai? nhập khác-pom-tạo tác-id và sau đó khai báo khác-pom-tạo tác-id cũng như phụ thuộc?
Junchen Liu

Một bài báo trên DZone nói một điều gì đó khác biệt: ... <dependencies> <dependency> <groupId>${project.groupId}</groupId> <artifactId>pomlib-lib</artifactId> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>${project.groupId}</groupId> <artifactId>pomlib-war</artifactId> <type>war</type> </dependency> </dependencies> </project>Cuộc chiến KHÔ và Gầy
coz

1
@JunchenLiu: Vì vậy, giả sử bạn chỉ đang sử dụng một vài tính năng của dự án A, vì vậy bạn có thể chọn chỉ bao gồm những phụ thuộc bắc cầu được yêu cầu cho tính năng đó. Bạn có thể giải quyết vấn đề đó bằng cách sử dụng <exclude> trong <dependency>. Ví dụ, hãy kiểm tra cái này: jdbi.org/#_getting_started
Nitiraj

15

Bạn không thể có một pomloại dự án như simple dependencytrong một dự án khác. (Chà, bạn có thể - nhưng nó sẽ không hữu ích gì cả). Chỉ có thể có một parent-childmối quan hệ. Đây thực chất là managing dependency through inheritance.

importphạm vi pomphụ thuộc kiểu trong <dependencyManagement>phần cho phép bạn đạt được tương đương với multiple inheritance.

Bạn có thể có nhiều thứ khác nhau poms- mỗi thứ managingmột loạt các phụ thuộc liên quan. Các dự án sử dụng chúng có thể importnhững điều này pomsvà sau đó chỉ định các phụ thuộc mà chúng cần mà không cần phải lo lắng về phiên bản. Đây thực chất là bill of materialskhái niệm, được minh họa trong các liên kết được chỉ định bởi @ DB5.

Điều này giúp giữ cho parent pomscác dự án nhiều mô-đun phức tạp không trở nên quá lớn và khó sử dụng.


8
Bạn có chắc không? Tôi đã đặt pom thông thường (có các phụ thuộc riêng) như một phụ thuộc thường xuyên trong dự án khác (chiến tranh đóng gói) và nhận tất cả các phụ thuộc từ dự án pom được đưa vào WEB-INF / lib của dự án mục tiêu. Đó là lý do tại sao tôi đang hỏi câu hỏi này :)
grafthez

2
Cảm ơn @Raghuram, hoàn toàn quên đề cập đến tùy chọn POM chính khi trả lời câu hỏi. Đối với việc có một dự án kiểu pom như một sự phụ thuộc đơn giản, điều này là có thể. Như đã đề cập trong câu hỏi ban đầu nó có thể được sử dụng để phụ thuộc nhóm
DB5


5

Hai khái niệm, rất giống với mô hình lập trình hướng đối tượng, sẽ giúp trả lời câu hỏi:

  1. Phần dependencyManagement chỉ khai báo các phụ thuộc và thông tin chi tiết của chúng trong dự án hiện tại - mục đích là quản lý các chi tiết và sử dụng lại trong các dự án khác, thông qua kế thừa ( cha ) hoặc nhập ( phạm vi ). Điều này giống như khai báo một kiểu dữ liệu trong chương trình và làm cho nó có sẵn để sử dụng.

  2. Phần phụ thuộc xác định việc sử dụng thực tế của các phần phụ thuộc trong dự án, tùy chọn kế thừa các chi tiết (tức là, phiên bản, v.v.) của các phần phụ thuộc được khai báo trong dependencyManagment . Đó là lý do tại sao bạn sẽ thiếu các phụ thuộc nếu bạn chỉ đặt chúng trong dependencyManagment . Điều này tương tự như việc khởi tạo một phiên bản biến của kiểu dữ liệu trong một chương trình khi nó cần thiết.


Điều đó tốt và rõ ràng nhưng nó trả lời một câu hỏi khác với câu hỏi ở trên. :-)
Rick-777
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.