อะไรคือความแตกต่างระหว่างการพึ่งพาประเภท "pom" กับขอบเขต "นำเข้า" และไม่มี "นำเข้า"


112

เริ่มจาก Maven 2.0.9 มีความเป็นไปได้ที่จะรวมไว้ด้วย

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

ใน<dependencyManagement>ส่วน

ตามที่ฉันเข้าใจมันจะถูก "แทนที่" ด้วยการอ้างอิงที่รวมอยู่ใน pom นี้ราวกับว่าเดิมถูกกำหนดไว้ที่นี่

อะไรคือความแตกต่างระหว่างโซลูชันด้านบนและการพึ่งพาอย่างง่ายกับ pom นี้โดยไม่มีimportขอบเขต (ฉันเห็นว่าหลังนี้เรียกว่า "การจัดกลุ่มการพึ่งพา") ความแตกต่างเพียงประการเดียวที่การอ้างอิงแบบ "จัดกลุ่ม" ดังกล่าวมีลำดับความสำคัญต่ำกว่าในขณะที่แก้ไขความสำคัญของการอ้างอิงหรือไม่?

คำตอบ:


187

คุณสามารถนำเข้าได้เฉพาะการอ้างอิงที่มีการจัดการเท่านั้น ซึ่งหมายความว่าคุณสามารถนำเข้า POM อื่น ๆ ไปยังdependencyManagementส่วนของ POM ของโปรเจ็กต์ของคุณได้เท่านั้น กล่าวคือ

...
<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>
...

สิ่งที่เกิดขึ้นคือการอ้างอิงทั้งหมดที่กำหนดไว้ในdependencyManagementส่วนของการอ้างอิงother-pom-artifact-idจะรวมอยู่ในdependencyManagementส่วนของ POM ของคุณ จากนั้นคุณสามารถอ้างอิงการอ้างอิงเหล่านี้ในdependencyส่วนของ POM ของคุณ (และ POM ลูกทั้งหมด) โดยไม่ต้องรวมversionฯลฯ

แต่ถ้าใน POM ของคุณคุณก็กำหนดพึ่งพาปกติไปother-pom-artifact-idแล้วทั้งหมดdependenciesจากdependencyส่วนของother-pom-artifact-idที่จะถูกรวมสกรรมกริยาในโครงการของคุณ - แต่การอ้างอิงที่กำหนดไว้ในdependencyManagementส่วนของการother-pom-artifact-idไม่ได้รวมอยู่ในทุก

โดยพื้นฐานแล้วกลไกทั้งสองจะใช้สำหรับการนำเข้า / รวมถึงการอ้างอิงสองประเภทที่แตกต่างกัน (การอ้างอิงที่มีการจัดการและการอ้างอิงตามปกติ)

มีหน้าที่ที่ดีในเว็บไซต์ Maven ซึ่งสามารถอธิบายเรื่องนี้ดีกว่าที่ฉันสามารถทำได้คือการบริหารจัดการในการพึ่งพา Mavenและมันยังมีข้อมูลที่เฉพาะเจาะจงในการพึ่งพาการนำเข้า


1
ถ้าpomA in เป็นพาเรนต์ของpomB คุณสามารถวาง B ในการจัดการการพึ่งพาของโปรเจ็กต์ A ที่มีขอบเขตได้importหรือไม่?
Janez Kuhar

คำตอบที่ดีในการอธิบายวิธีการทำงาน แต่ทำไม ?? ทำไมคุณไม่ต้องการรวมการอ้างอิงอื่น ๆ ในลักษณะสกรรมกริยา คุณสามารถทำได้ทั้งสองอย่าง? นำเข้า -pom-artifact-id อื่น ๆ แล้วประกาศ-pom-artifact-id อื่น ๆ เป็นการอ้างอิงด้วยหรือไม่
Junchen Liu

บทความหนึ่งใน DZone รัฐบางสิ่งบางอย่างที่แตกต่างกัน: ... <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>แห้งและผอมสงคราม
coz

1
@JunchenLiu: สมมติว่าคุณใช้คุณลักษณะเพียงไม่กี่อย่างของโครงการ A ดังนั้นคุณสามารถเลือกที่จะรวมเฉพาะการอ้างอิงสกรรมกริยาที่จำเป็นสำหรับคุณลักษณะนั้น คุณสามารถแก้ไขได้โดยใช้ <exclude> ใน <dependency> ด้วย ตัวอย่างการชำระเงินนี้: jdbi.org/#_getting_started
Nitiraj

15

คุณไม่สามารถมีpomโปรเจ็กต์ประเภทเป็นโปรเจ็กต์simple dependencyอื่น (คุณทำได้ - แต่จะไม่ทำประโยชน์อะไรเลย) มีได้เฉพาะparent-childความสัมพันธ์ managing dependency through inheritanceนี้เป็นหลัก

importขอบเขตสำหรับการpomพึ่งพาประเภทใน<dependencyManagement>ส่วนช่วยให้คุณบรรลุความเท่าเทียมกันของmultiple inheritance.

คุณอาจมีการอ้างอิงที่แตกต่างกันpoms- แต่ละmanagingกลุ่มของการอ้างอิงที่เกี่ยวข้อง ซึ่งโครงการเหล่านี้อาจใช้importเหล่านี้pomsแล้วระบุการอ้างอิงที่พวกเขาต้องการโดยไม่ต้องกังวลเกี่ยวกับรุ่น นี่คือbill of materialsแนวคิดหลักซึ่งแสดงในลิงก์ที่ระบุโดย @ DB5

ซึ่งจะช่วยป้องกันไม่ให้parent pomsโครงการหลายโมดูลที่ซับซ้อนมีขนาดใหญ่เกินไปและเทอะทะ


8
คุณแน่ใจไหม? ฉันได้ใส่ pom ปกติ (มีการอ้างอิงของตัวเอง) เป็นการพึ่งพาปกติในโครงการอื่น ๆ (สงครามบรรจุภัณฑ์) และได้รับการอ้างอิงทั้งหมดจากโครงการ pom ที่รวมอยู่ใน WEB-INF / lib ของโครงการเป้าหมาย นั่นเป็นเหตุผลว่าทำไมฉันถึงถามคำถามนี้ :)
grafthez

2
ขอบคุณ @Raghuram ลืมพูดถึงตัวเลือก POM ของผู้ปกครองโดยสิ้นเชิงเมื่อตอบคำถาม สำหรับการมีโครงการประเภทปอมเป็นการพึ่งพาอย่างง่ายนี้เป็นไปได้ ตามที่กล่าวไว้ในคำถามเดิมสามารถใช้เพื่อจัดกลุ่มการอ้างอิง
DB5


5

สองแนวคิดซึ่งคล้ายกับกระบวนทัศน์การเขียนโปรแกรมเชิงวัตถุมากจะช่วยตอบคำถาม:

  1. dependencyManagementเพียงบางส่วนประกาศอ้างอิงและรายละเอียดของพวกเขาในโครงการปัจจุบัน - จุดประสงค์คือการจัดการของรายละเอียดและกลับมาใช้ในโครงการอื่น ๆ โดยทางมรดก ( ผู้ปกครอง ) หรือนำเข้า ( ขอบเขต ) นี่เหมือนกับการประกาศประเภทข้อมูลในโปรแกรมและทำให้พร้อมใช้งาน

  2. พึ่งพาส่วนกำหนดใช้งานจริงของการอ้างอิงในโครงการเลือกที่สืบทอดรายละเอียด (เช่นรุ่นอื่น ๆ ) การอ้างอิงประกาศภายใต้dependencyManagment นั่นเป็นเหตุผลที่คุณจะขาดการอ้างอิงหากคุณใส่ไว้ในdependencyManagmentเท่านั้น สิ่งนี้คล้ายคลึงกับการสร้างอินสแตนซ์ตัวแปรของชนิดข้อมูลในโปรแกรมที่จำเป็น


ดีและชัดเจน แต่ตอบคำถามที่แตกต่างจากคำถามข้างต้น :-)
Rick-777
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.