ขอบเขตการพึ่งพา Maven

1. บทนำ

Maven เป็นหนึ่งในเครื่องมือสร้างที่ได้รับความนิยมมากที่สุดในระบบนิเวศของ Java และหนึ่งในคุณสมบัติหลักของมันคือการจัดการการพึ่งพา

ในบทความนี้เราจะอธิบายและสำรวจกลไกที่ช่วยในการจัดการการพึ่งพาสกรรมกริยาในโครงการ Maven - ขอบเขตการพึ่งพา

2. การพึ่งพาสกรรมกริยา

พูดง่ายๆก็คือมีการอ้างอิงสองประเภทใน Maven โดยตรงและสกรรมกริยา

การอ้างอิงโดยตรงคือสิ่งที่รวมอยู่ในโครงการอย่างชัดเจน สิ่งเหล่านี้สามารถรวมอยู่ในโครงการโดยใช้ แท็ก:

 junit junit 4.12 

ในทางกลับกันการพึ่งพาสกรรมกริยาคือการอ้างอิงที่จำเป็นโดยการอ้างอิงโดยตรงของเรา การอ้างอิงที่จำเป็นจะรวมอยู่ในโครงการของเราโดยอัตโนมัติโดย Maven

เราสามารถแสดงรายการการอ้างอิงทั้งหมดรวมถึงการอ้างอิงแบบสกรรมกริยาในโครงการโดยใช้คำสั่ง: mvn dependency: tree

3. ขอบเขตการพึ่งพา

ขอบเขตการพึ่งพาสามารถช่วย จำกัด การส่งผ่านของการอ้างอิงและปรับเปลี่ยนคลาสพา ธ สำหรับงานที่สร้างขึ้นที่แตกต่างกัน Maven มี 6 เริ่มต้นการพึ่งพาขอบเขต

และสิ่งสำคัญคือต้องเข้าใจว่าแต่ละขอบเขตยกเว้นการนำเข้าจะมีผลกระทบต่อการอ้างอิงสกรรมกริยา

3.1. รวบรวม

นี่คือขอบเขตเริ่มต้นเมื่อไม่มีการระบุขอบเขตอื่น ๆ

การอ้างอิงกับขอบเขตนี้มีอยู่ในคลาสพา ธ ของโปรเจ็กต์ในงานบิลด์ทั้งหมดและจะแพร่กระจายไปยังโปรเจ็กต์ที่ขึ้นต่อกัน

ที่สำคัญกว่านั้นการอ้างอิงเหล่านี้ยังเป็นสกรรมกริยา:

 commons-lang commons-lang 2.6 

3.2. ให้

ขอบเขตนี้ใช้เพื่อทำเครื่องหมายการอ้างอิงที่ควรจัดเตรียมไว้ที่รันไทม์โดย JDK หรือคอนเทนเนอร์ดังนั้นชื่อ

กรณีการใช้งานที่ดีสำหรับขอบเขตนี้คือเว็บแอปพลิเคชันที่ใช้งานในคอนเทนเนอร์บางส่วนซึ่งคอนเทนเนอร์มีไลบรารีอยู่แล้ว

ตัวอย่างเช่นเว็บเซิร์ฟเวอร์ที่ให้บริการ Servlet API ที่รันไทม์อยู่แล้วดังนั้นในโครงการของเราการอ้างอิงเหล่านั้นสามารถกำหนดได้ด้วยขอบเขตที่ให้ไว้ :

 javax.servlet servlet-api 2.5 provided 

การอ้างอิงที่ระบุจะพร้อมใช้งานเฉพาะในเวลาคอมไพล์และในคลาสพา ธ ทดสอบของโปรเจ็กต์ ยิ่งไปกว่านั้นพวกเขาไม่ได้เป็นสกรรมกริยา

3.3. รันไทม์

จำเป็นต้องมีการอ้างอิงกับขอบเขตนี้ในรันไทม์แต่ไม่จำเป็นสำหรับการคอมไพล์โค้ดโครงการ ด้วยเหตุนี้การอ้างอิงที่ทำเครื่องหมายด้วยขอบเขตรันไทม์จะปรากฏในรันไทม์และคลาสพา ธ ทดสอบ แต่จะหายไปจากคลาสพา ธ คอมไพล์

ตัวอย่างที่ดีของการอ้างอิงที่ควรใช้ขอบเขตรันไทม์คือไดรเวอร์ JDBC:

 mysql mysql-connector-java 6.0.6 runtime 

3.4. ทดสอบ

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

กรณีการใช้งานมาตรฐานสำหรับขอบเขตนี้กำลังเพิ่มไลบรารีทดสอบเช่น JUnit ในแอปพลิเคชันของเรา:

 junit junit 4.12 test 

3.5. ระบบ

ขอบเขตของระบบคล้ายกับขอบเขตที่ให้ไว้มาก ความแตกต่างที่สำคัญระหว่างขอบเขตทั้งสองนี้คือระบบต้องการให้เราชี้ไปที่โถเฉพาะบนระบบโดยตรง

สิ่งสำคัญที่ต้องจำไว้คือการสร้างโครงการที่มีการอ้างอิงขอบเขตของระบบอาจล้มเหลวในเครื่องอื่นหากไม่มีการอ้างอิงหรืออยู่ในสถานที่ที่แตกต่างจากที่systemPathชี้ไปที่:

 com.baeldung custom-dependency 1.3.2 system ${project.basedir}/libs/custom-dependency-1.3.2.jar 

3.6. นำเข้า

ขอบเขตนี้ถูกเพิ่มใน Maven 2.0.9 และใช้ได้เฉพาะกับปอมประเภทการพึ่งพาเท่านั้น เราจะพูดเพิ่มเติมเกี่ยวกับประเภทของการอ้างอิงในบทความในอนาคต

การนำเข้าบ่งชี้ว่าการอ้างอิงนี้ควรถูกแทนที่ด้วยการอ้างอิงที่มีประสิทธิภาพทั้งหมดที่ประกาศไว้ใน POM:

 com.baeldung custom-project 1.3.2 pom import 

4. ขอบเขตและความเปลี่ยนแปลง

ขอบเขตการพึ่งพาแต่ละรายการมีผลต่อการพึ่งพาสกรรมกริยาในแบบของตัวเอง ซึ่งหมายความว่าการอ้างอิงสกรรมกริยาที่แตกต่างกันอาจจบลงในโครงการด้วยขอบเขตที่แตกต่างกัน

อย่างไรก็ตามการอ้างอิงกับขอบเขตที่จัดไว้ให้และการทดสอบจะไม่ถูกรวมอยู่ในโครงการหลัก

จากนั้น:

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

5. สรุป

ในบทช่วยสอนฉบับย่อนี้เรามุ่งเน้นไปที่ขอบเขตการพึ่งพา Maven จุดประสงค์และรายละเอียดวิธีการดำเนินงาน

หากคุณต้องการเจาะลึกลงไปใน Maven เอกสารเป็นจุดเริ่มต้นที่ดี