Maven คืออะไร? การสร้างและการจัดการการพึ่งพาสำหรับ Java

Apache Maven เป็นรากฐานที่สำคัญของการพัฒนา Java และเป็นเครื่องมือจัดการบิลด์ที่ใช้มากที่สุดสำหรับ Java รูปแบบการกำหนดค่าที่ใช้ XML ที่คล่องตัวของ Maven ช่วยให้นักพัฒนาสามารถอธิบายหรือเข้าใจโครงร่างของโครงการที่ใช้ Java ได้อย่างรวดเร็วซึ่งทำให้การเริ่มต้นและการแบ่งปันโครงการใหม่เป็นเรื่องง่าย Maven ยังสนับสนุนการพัฒนาที่ขับเคลื่อนด้วยการทดสอบการบำรุงรักษาโครงการระยะยาวและการกำหนดค่าที่เปิดเผยและปลั๊กอินที่หลากหลายทำให้เป็นตัวเลือกยอดนิยมสำหรับ CI / CD บทความนี้เป็นการแนะนำ Maven โดยย่อรวมถึง Maven POM และโครงสร้างไดเร็กทอรีและคำสั่งสำหรับการสร้างโครงการ Maven แรกของคุณ

โปรดทราบว่า Maven รุ่นล่าสุดในขณะที่เขียนนี้คือ Maven 3.6.3

Maven vs Ant และ Gradle

Maven ไม่ใช่เครื่องมือสร้างเพียงอย่างเดียวในระบบนิเวศของ Java แม้ว่าจะเป็นเครื่องมือที่ได้รับความนิยมมากที่สุด Ant ซึ่งเป็นเครื่องมือกำหนดค่าที่ใช้ XML รุ่นก่อนหน้านี้ขาดการปฏิบัติที่เป็นมาตรฐานตามแบบแผนและการจัดการการพึ่งพาของ Maven แต่มีความยืดหยุ่นที่คุณจะไม่พบใน Maven Gradle เป็นเครื่องมือรุ่นใหม่ที่ทำงานบนระบบนิเวศ Maven (โดยใช้ที่เก็บของ Maven) แต่รองรับการใช้ DSL แบบ Groovy หรือ Kotlin สำหรับการกำหนดค่า ทั้งสามเป็นเครื่องมือสร้างที่ดีในสิทธิของตนเองและแต่ละอย่างสามารถรวมเข้ากับกระบวนการ CI / CD ได้ สิ่งสำคัญคือการเลือกสิ่งที่เหมาะสมกับความต้องการของคุณและการรู้จักใช้อย่างเหมาะสม

Maven ทำงานอย่างไร

เช่นเดียวกับเครื่องมือที่ยอดเยี่ยมมากมาย Maven ใช้สิ่งที่ครั้งหนึ่งเคยมีความซับซ้อนมากเกินไป (การกำหนดค่านรก) และทำให้มันง่ายขึ้นในส่วนที่ย่อยได้ Maven ประกอบด้วยสามองค์ประกอบ:

  • POM: ไฟล์ที่อธิบายโครงการ Maven และการอ้างอิง
  • ไดเร็กทอรี: รูปแบบมาตรฐานสำหรับการอธิบายโปรเจ็กต์ Maven ใน POM
  • ที่เก็บ: ที่จัดเก็บและค้นพบซอฟต์แวร์ของ บริษัท อื่น

Maven POM : ทุกโปรเจ็กต์ Java ที่ใช้ Maven จะมีไฟล์ POM (project object model) ในไดเร็กทอรีรูท pom.xmlอธิบายอ้างอิงของโครงการและบอกถึงวิธีการสร้างมันขึ้นมา (การอ้างอิงเป็นซอฟต์แวร์ของ บริษัท อื่นที่จำเป็นสำหรับโครงการตัวอย่างทั่วไปบางส่วน ได้แก่ JUnit และ JDBC โปรดดูที่ Maven Central Repository สำหรับรายการเครื่องมือที่มีอยู่ทั้งหมดและการอ้างอิงที่เป็นที่นิยม)

ไดเร็กทอรี Maven : ไดเร็กทอรี Maven ใช้สิ่งที่เรียกว่าconvention over configurationซึ่งเป็นโซลูชันที่ยอดเยี่ยมในการกำหนดค่านรก แทนที่จะกำหนดให้นักพัฒนากำหนดโครงร่างและองค์ประกอบกำหนดค่าด้วยมือสำหรับแต่ละโปรเจ็กต์ใหม่ (เช่นเดียวกับในกรณีของmakefileและ Ant) Maven สร้างโครงสร้างโครงการทั่วไปและเสนอรูปแบบไฟล์มาตรฐานสำหรับอธิบายวิธีการทำงาน คุณเพียงแค่เสียบความต้องการของคุณแล้ว Maven ก็เรียกใช้การอ้างอิงและกำหนดค่าโครงการให้คุณ

ที่เก็บแบบรวมศูนย์ : สุดท้าย Maven ใช้ที่เก็บแบบรวมศูนย์เพื่อค้นหาและเผยแพร่แพ็คเกจโครงการเป็นการอ้างอิง เมื่อคุณอ้างอิงการอ้างอิงในโปรเจ็กต์ของคุณ Maven จะค้นพบมันในที่เก็บส่วนกลางดาวน์โหลดไปยังที่เก็บในเครื่องและติดตั้งลงในโปรเจ็กต์ของคุณ โดยส่วนใหญ่แล้วทั้งหมดนี้จะมองไม่เห็นคุณในฐานะนักพัฒนาซอฟต์แวร์

การเข้าถึงการอ้างอิง Maven

ตามค่าเริ่มต้น Maven จะแก้ไขการอ้างอิงจาก Maven Central Repository ทางเลือกทั่วไปคือ JCenter ซึ่งมีชุดแพ็คเกจที่กว้างกว่า องค์กรยังเผยแพร่และโฮสต์ที่เก็บภายในซึ่งอาจเป็นแบบสาธารณะหรือส่วนตัวก็ได้ ในการเข้าถึงที่เก็บคุณระบุ URL ของมันใน Maven POM หรือคุณสามารถสั่งให้ Maven ดูในที่เก็บอื่น

การติดตั้ง Maven

Maven เป็นโปรเจ็กต์ Java ดังนั้นก่อนที่คุณจะติดตั้งคุณจะต้องติดตั้ง JDK ในสภาพแวดล้อมการพัฒนาของคุณ (ดู "JDK คืออะไรบทนำสู่ Java Development Kit" สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการดาวน์โหลดและติดตั้ง JDK)

เมื่อคุณตั้งค่าสภาพแวดล้อมการพัฒนา Java แล้วคุณสามารถติดตั้ง Maven ได้ในไม่กี่ขั้นตอน:

  1. ดาวน์โหลด Maven รุ่นล่าสุด (Maven 3.6.3 ตามที่เขียนนี้)
  2. แตกapache.mavenไฟล์. zip ไปไว้ที่ที่สะดวก
  3. วางไฟล์นั้นบนเส้นทางของคุณ ตัวอย่างเช่นในระบบ Unix หรือ Linux: PATH=$PATH:/home/maven/การส่งออก

ตอนนี้คุณควรเข้าถึงmvnคำสั่งได้แล้ว พิมพ์mvn -vเพื่อให้แน่ใจว่าคุณติดตั้ง Maven เรียบร้อยแล้ว

Maven POM

รูทของทุกโปรเจ็กต์ Maven คือpom.xmlไฟล์ แม้จะมีชื่อเสียงว่าน่าเบื่อ แต่ XML ก็ใช้งานได้ดีสำหรับกรณีการใช้งานนี้ POM ของ Maven นั้นอ่านง่ายและเปิดเผยสิ่งที่เกิดขึ้นในโครงการได้มากมาย (หากคุณเคยทำงานกับ JavaScript สิ่งpom.xmlนี้จะคล้ายกับpackage.jsonไฟล์ของ Node NPM )

รายการที่ 1 แสดงให้เห็นว่าการที่ง่ายมาก pom.xmlMaven

รายการ 1. Maven POM แบบธรรมดา

   4.0.0 com.javaworld what-is-maven 1.0-SNAPSHOT Simple Maven Project jar   junit junit 4.12 test    

ทำความเข้าใจกับ Maven POM

เมื่อคุณได้รับการแขวน POM ไม่ได้ลึกลับ ในการเริ่มต้นคุณสามารถอ่านผ่าน XML preamble ซึ่งอ้างอิงเพียงสคีมา POM อย่างเป็นทางการ สังเกตเห็น XML ที่เริ่มต้นด้วยmodelVersionแต่ ที่บอก Maven ว่าจะใช้ POM เวอร์ชันใดในกรณีนี้ Maven POM 4.0.0

ถัดไปคุณมีgroupId, และartifactId versionเมื่อรวมกันแล้วแอตทริบิวต์ทั้งสามนี้จะระบุรีซอร์สที่จัดการ Maven ทั้งหมดในที่เก็บโดยไม่ซ้ำกัน แอตทริบิวต์เหล่านี้ที่ด้านบนของไฟล์อธิบายโครงการ Maven ของคุณ

ตอนนี้ดูที่dependenciesส่วนของ POM ซึ่งเราอธิบายการอ้างอิงของโครงการ ในกรณีนี้เราได้ดึงการพึ่งพาเพียงครั้งเดียวจนถึงตอนนี้ JUnit ขอให้สังเกตว่า JUnit นอกจากนี้ยังอธิบายในแง่ของgroupId, และartifactIdversion

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

การโฮสต์โครงการของคุณในที่เก็บ Maven

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

  1. ทำให้ใช้ได้ในท้องถิ่น
  2. เผยแพร่ไปยังที่เก็บระยะไกลที่มีการจัดการแบบส่วนตัว
  3. เผยแพร่ไปยังที่เก็บส่วนตัวบนคลาวด์
  4. เผยแพร่ไปยังที่เก็บสาธารณะเช่น Maven Central

ในกรณีแรกคุณไม่ได้ใช้ที่เก็บระยะไกลเลย แต่นักพัฒนาซอฟต์แวร์รายอื่นจะดาวน์โหลดและติดตั้งโปรเจ็กต์ของคุณลงใน Maven repo โดยใช้mvn installคำสั่ง

ในกรณีที่สองคุณใช้พื้นที่เก็บข้อมูล Maven ที่โฮสต์โดยใช้เซิร์ฟเวอร์ที่ควบคุมโดยส่วนตัวเพื่อเผยแพร่และดาวน์โหลดการอ้างอิง สำหรับสิ่งนี้คุณต้องมีตัวจัดการที่เก็บเช่น Apache Archiva

ทางเลือกใหม่กว่าคือการใช้ repo ระยะไกลส่วนตัว แต่ต้องพึ่งพาบริการบนคลาวด์เพื่อจัดการเช่น Cloudsmith สิ่งนี้ให้ประโยชน์ของการอ้างอิงที่โฮสต์จากระยะไกลโดยไม่ต้องยืนขึ้นเซิร์ฟเวอร์ repo บริการนั้นมีค่าธรรมเนียมแน่นอน

ในที่สุดโครงการจำนวนเล็กน้อยจะจบลงใน Central Maven Repository หรือ JCenter ซึ่งมีไว้สำหรับแพ็คเกจสาธารณะที่ใช้กันอย่างแพร่หลาย หากคุณกำลังสร้างการพึ่งพาโอเพนซอร์สเพื่อให้ผู้อื่นใช้คุณจะต้องมีที่เก็บส่วนกลางเหล่านี้เพื่อให้งานของคุณพร้อมใช้งานทั่วโลก

  • เรียนรู้เพิ่มเติมเกี่ยวกับการโฮสต์โครงการของคุณในที่เก็บ Maven และรับรายชื่อที่เก็บที่มีอยู่
  • ดูเอกสาร Maven อย่างเป็นทางการเกี่ยวกับ Maven Release Plugin ซึ่งใช้ในการจัดเตรียมและจัดการซอฟต์แวร์ที่เผยแพร่ไปยังที่เก็บ Maven

สร้างแพ็คเกจ Maven

หากคุณสร้างpom.xmlจาก Listing 1 และวางไว้ในไดเร็กทอรีคุณจะสามารถรันคำสั่ง Maven กับมันได้ Maven มีคำสั่งมากมายและมีอีกมากมายผ่านปลั๊กอิน แต่คุณจำเป็นต้องรู้เพียงไม่กี่คำในการเริ่มต้น

mvn packageสำหรับคำสั่งแรกของคุณลองดำเนินการ แม้ว่าคุณจะยังไม่มีซอร์สโค้ด แต่การรันคำสั่งนี้จะบอกให้ Maven ดาวน์โหลดการพึ่งพา JUnit คุณสามารถตรวจสอบเอาต์พุตการบันทึกของ Maven เพื่อดูว่าการอ้างอิงได้โหลดแล้ว ..

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

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

ขอบเขตทั่วไปอีกประการหนึ่งคือprovidedซึ่งบอกกรอบงานว่าการอ้างอิงนั้นจัดเตรียมโดยสภาพแวดล้อมรันไทม์ สิ่งนี้มักจะเห็นได้จาก Servlet JARS เมื่อปรับใช้กับคอนเทนเนอร์ servlet เนื่องจากคอนเทนเนอร์จะให้ JARS เหล่านั้น ดูเอกสาร Apache Maven สำหรับรายการขอบเขตการพึ่งพา Maven ทั้งหมด

โครงสร้างไดเร็กทอรีของ Maven

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

จากนั้นคุณต้องการเพิ่มไฟล์ Java ซึ่งคุณจะวางไว้ในsrc/ไดเร็กทอรีMaven สร้าง/src/main/java/com/javaworld/Hello.javaไฟล์โดยมีเนื้อหาของ Listing 2

รายการที่ 2. Hello.java

 com.javaworld public class Hello { public static void main(String[] args){ System.out.println("Hello, JavaWorld"); } } 

/srcเส้นทางเป็นจุดที่เป็นมาตรฐานสำหรับโครงการของคุณไฟล์ที่มา โครงการส่วนใหญ่ใส่ไฟล์หลักของพวกเขาใน/src/main/ด้วย Java ไฟล์ที่จะเข้าสู่ classpath /javaภายใต้ นอกจากนี้หากคุณต้องการรวมเนื้อหาที่ไม่ใช่โค้ดเช่นไฟล์ config หรือรูปภาพคุณสามารถ/src/main/resourcesใช้ได้ เนื้อหาในเส้นทางนี้จะถูกเพิ่มไปยัง classpath หลัก /src/test/javaไฟล์ทดสอบไปเป็น

หากต้องการตรวจสอบนี่คือส่วนสำคัญบางส่วนของโครงสร้างโครงการ Maven (ตามที่กำหนดโดยโครงสร้างไดเรกทอรีมาตรฐานของ Maven):

ส่วนสำคัญของโครงสร้างไดเรกทอรีมาตรฐาน Maven

pom.xml ไฟล์ตัวอธิบายโปรเจ็กต์
/ src / main / java ตำแหน่งของไฟล์ต้นฉบับ
/ src / main / resources ตำแหน่งของเนื้อหาที่ไม่ใช่แหล่งที่มา
/ src / test / java ตำแหน่งของไฟล์ต้นฉบับทดสอบ
/ เป้าหมาย ตำแหน่งของเอาต์พุตการสร้าง

การจัดการโครงการ Maven ของคุณ

mvn packageคำสั่งสั่ง Maven จะกำขึ้นโครงการ ออกคำสั่งนี้เมื่อคุณพร้อมที่จะรวบรวมไฟล์โครงการทั้งหมดของคุณในที่เดียว จำได้ว่าในไฟล์ POM สำหรับโปรเจ็กต์นี้เราตั้งค่าประเภทบรรจุภัณฑ์เป็นjarดังนั้นคำสั่งนี้จึงบอกให้ Maven แพ็กเกจไฟล์แอปพลิเคชันลงใน JAR

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

หลังจากที่คุณรวมโครงการแล้วคุณอาจต้องการออกไฟล์mvn install. คำสั่งนี้พุชโปรเจ็กต์ไปยังที่เก็บ Maven ในเครื่อง เมื่ออยู่ในพื้นที่เก็บข้อมูลในเครื่องแล้วจะพร้อมใช้งานสำหรับโครงการ Maven อื่น ๆ ในระบบท้องถิ่นของคุณ สิ่งนี้มีประโยชน์สำหรับสถานการณ์การพัฒนาที่คุณและ / หรือทีมของคุณกำลังสร้าง JAR การพึ่งพาที่ยังไม่ได้เผยแพร่ไปยังที่เก็บส่วนกลาง

คำสั่ง Maven เพิ่มเติม

ป้อนmvn testเมื่อคุณพร้อมที่จะเรียกใช้การทดสอบหน่วยที่คุณกำหนดไว้ใน/src/java/testไดเร็กทอรี

ป้อนmvn compileเมื่อคุณพร้อมที่จะรวบรวมไฟล์คลาสของโปรเจ็กต์ หากคุณกำลังรันการตั้งค่า hot-deploy คำสั่งนี้จะทริกเกอร์ hot-deploying class loader (เครื่องมือ hot-deploy - เช่นmvn spring-boot:runคำสั่งของ Spring Boot - จะคอยดูไฟล์คลาสสำหรับการเปลี่ยนแปลงและการคอมไพล์จะทำให้ไฟล์ต้นฉบับของคุณถูกคอมไพล์และแอปพลิเคชันที่ทำงานอยู่จะแสดงการเปลี่ยนแปลงเหล่านั้น)

เริ่มโครงการใหม่: Archetypes ใน Maven และ Spring

Maven แม่เป็นแม่แบบสำหรับการเริ่มต้นโครงการใหม่บนพื้นฐานของความหลากหลายของการตั้งค่าที่กำหนดไว้ล่วงหน้า แต่ละประเภทมีการอ้างอิงที่บรรจุไว้ล่วงหน้าเช่นสำหรับโครงการ Java EE หรือเว็บแอ็พพลิเคชัน Java คุณยังสามารถสร้างแม่แบบใหม่จากโปรเจ็กต์ที่มีอยู่จากนั้นใช้เพื่อสร้างโปรเจ็กต์ใหม่อย่างรวดเร็วตามเค้าโครงที่กำหนดไว้ล่วงหน้าเหล่านั้น ดูเอกสาร Maven เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับแม่แบบ Apache Maven

Spring framework ซึ่งทำงานได้ดีกับ Maven นำเสนอความสามารถที่ซับซ้อนและซับซ้อนเพิ่มเติมสำหรับการแก้ไขโครงการใหม่ ๆ ตัวอย่างเช่น Spring Initializr เป็นเครื่องมือที่ช่วยให้คุณกำหนดองค์ประกอบที่คุณต้องการในแอปใหม่ได้อย่างรวดเร็ว Initializr ไม่ใช่แม่แบบ Maven แต่มีจุดประสงค์เดียวกันในการสร้างเค้าโครงโครงการตามข้อกำหนดล่วงหน้า จากใน Initializr คุณสามารถพิมพ์mvn archetype:generateและสแกนตัวเลือกต่างๆเพื่อค้นหาแม่แบบที่เหมาะกับสิ่งที่คุณกำลังสร้าง

การเพิ่มการอ้างอิง