Maven: Lifecycle vs. Phase vs. Plugin vs. Goal
การตอบช้าเพียงเพื่อชี้แจงความละเอียดอีกระดับที่ขาดหายไปในชุดข้อความนี้นั่นคือการประหารชีวิต (ของเป้าหมาย) ซึ่งเป็นหน่วยที่เล็กที่สุดของโครงสร้าง Maven
ดังนั้นเราจึงสร้างวงจร (โดยทั่วไปคือชุดของการดำเนินการสำหรับเป้าหมายโดยรวมที่เฉพาะเจาะจง) ซึ่งประกอบด้วยขั้นตอน (ความละเอียดต่ำกว่าขั้นตอนรอบ) ซึ่งสามารถเรียกใช้ชุดของเป้าหมายที่กำหนดโดยปลั๊กอินบางตัวได้ นั่นคือ Maven (ยัง) เป็นตัวดำเนินการปลั๊กอินแต่ละปลั๊กอินสามารถเสนอเป้าหมายได้ตั้งแต่หนึ่งเป้าหมายขึ้นไป จากนั้นคุณ (ยัง) ตัดสินใจว่าเป้าหมายใดที่เชื่อมโยงกับระยะใดซึ่งส่วนใหญ่ในวงจรชีวิตที่ผิดปกติ (ไม่ต้องมีนั่นคือค่าเริ่มต้น) แต่คุณสามารถมีอีกระดับได้จริง ๆ : การดำเนินการ (เป้าหมายเดียวกันจากปลั๊กอินเดียวกันหรือเป้าหมายที่แตกต่างจากปลั๊กอินที่แตกต่างกัน)
ภาพที่ฉันเตรียมที่จะดำเนินการต่อทั้งหมด
และนี่คือวิธีที่ Maven แสดงให้เห็น (หน่วยงานที่เล็กที่สุด) ผ่านสตริงที่ไม่ซ้ำกันในบันทึกการสร้าง:
plugin-artifactId:plugin-version:plugin-goal (goal-execution-id) @ project-name
ตัวอย่างเช่นเราจะมี:
[INFO] --- maven-compiler-plugin:2.5.1:compile (default-compile) @ sample-project ---
ซึ่งหมายความว่า (ผ่านระดับความละเอียดที่แตกต่างกัน):
- ใน
compile
ช่วง (ไม่ได้กล่าวถึงขออภัย)>
- ฉันกำลังเรียกใช้ปลั๊กอิน Maven Compiler (
artifactId
และversion
)>
- ฉันกำลังเรียกใช้
compile
เป้าหมาย>
- ตามที่กำหนดโดยการ
default-compile
ดำเนินการ
มันไม่เหมือนใครเพราะจริงๆแล้วคุณสามารถมีเป้าหมายเดียวกัน (ของปลั๊กอินเดียวกัน) ที่ผูกไว้กับเฟสที่แตกต่างกันหรือไปยังเฟสเดียวกัน แต่ในการดำเนินการที่แตกต่างกัน (นั่นคือการกำหนดค่าที่แตกต่างกัน) maven-compiler-plugin
เช่นนี้ยังใช้ในช่วงtest-compile
ระยะ (เฟสที่แตกต่างกัน) เพื่อรวบรวมรหัสการทดสอบ (ผ่านทางtestCompile
ประตู) ในการดำเนินการที่แตกต่างกัน ( default-testCompile
) นอกจากนี้คุณยังสามารถคอมไพล์ (โดยใช้ปลั๊กอินและเป้าหมายเดียวกัน) โค้ดที่สร้างขึ้นโดยอัตโนมัติในระหว่างเฟสอื่นตามที่กำหนดโดยการดำเนินการที่คุณระบุไว้ใน POM (และอาจเป็นการกำหนดค่าที่แตกต่างกัน)
การดำเนินการตามค่าเริ่มต้นจะจัดเตรียมไว้ให้ทันทีผ่านการเชื่อมบรรจุภัณฑ์ Mavenนั่นคือโดยค่าเริ่มต้น (และบังคับใช้การกำหนดค่ามากกว่าการกำหนดค่า) Maven ได้เรียกใช้เป้าหมายบางอย่าง (ของปลั๊กอินมาตรฐาน) ในบางช่วงแล้ว รหัสการประหารชีวิตของสวดเริ่มต้นเหล่านี้จะถูกกำหนดตามการประชุมบางอย่าง
นอกจากนี้ยังอธิบายว่าเหตุใดหากคุณต้องการแทนที่พฤติกรรมเริ่มต้น (การเชื่อมโยง) ของโครงสร้าง Maven คุณต้องระบุ (แทนที่) รหัสการดำเนินการเดียวกันทั้งหมดใน POM ของคุณสำหรับปลั๊กอินเดียวกัน ตัวอย่างเช่นคุณสามารถข้ามการคอมไพล์ได้เพียงแค่กำหนดการเรียกใช้งานmaven-compiler-plugin
ด้วยdefault-compile
id เดียวกันแต่ผูกไว้กับเฟสที่ไม่มีอยู่ (หรืออันที่ว่างเปล่า)
หากต้องการทำให้สั้น : การดำเนินการจะบอก Maven ว่าเป้าหมายใดที่จะดำเนินการกับการกำหนดค่าภายในระยะใด
การดำเนินการบางอย่างมีให้โดยค่าเริ่มต้น (การผูกแบบ defaul) ซึ่งอธิบายได้ว่าทำไมmaven ต่ำสุดเพียง6บรรทัดสามารถทำอะไรได้มากมาย (คอมไพล์ทดสอบแพ็กเกจ ฯลฯ ): การดำเนินการตามเป้าหมายของปลั๊กอินมาตรฐานในบางช่วง: เป็นไปตามการประชุม การกำหนดค่า จากนั้นผ่านการpom.xml
กำหนดค่าคุณสามารถเพิ่มสิ่งต่างๆ (การดำเนินการ) ในการสร้างหรือมีอิทธิพลต่อพฤติกรรมของปลั๊กอินที่กำหนดค่าไว้แล้ว (ในกรณีนี้ไม่มีexecutions
ส่วน แต่configuration
ก็เพียงพอแล้ว)
ใช่คุณสามารถข้ามรอบการสร้าง (และขั้นตอน) และเรียกใช้เป้าหมาย (ของปลั๊กอิน) ได้โดยตรง ลองนึกภาพต่อไปนี้:
mvn compiler:compile
mvn compiler:testCompile
mvn surefire:test
mvn jar:jar
(หมายเหตุ: คุณสามารถเรียกใช้อินไลน์ได้ในการโทรเพียงครั้งเดียว)
ที่นี่เรากำลังรวบรวมโค้ดแอพโค้ดทดสอบรันการทดสอบและแพ็กเกจ: ลองนึกดูว่าสิ่งนี้จะเป็นแบบแมนนวลเกิดข้อผิดพลาดซ้ำซากและใช้เวลานานแค่ไหน การประชุมมากกว่าการกำหนดค่าช่วยให้เรา: Maven แนะนำวงจรชีวิตและขั้นตอนการสร้าง วงจรชีวิตเริ่มต้น (ไม่มีชื่อนั่นคือค่าเริ่มต้น) จัดเตรียมช่วงต่างๆตามแนวทางปฏิบัติที่ดีที่สุดและอนุสัญญา (มนต์ของ Maven)
หากคุณต้องการบรรลุผลดังกล่าวข้างต้นเพียงแค่เรียกใช้: จากmvn package
นั้นจะรวบรวมทดสอบและจัดแพ็คเกจโครงการของคุณโดยอัตโนมัติ อย่างไร? การเรียกใช้ปลั๊กอิน นั่นคือขั้นตอนเป็นชุดการดำเนินการปลั๊กอิน (เป้าหมาย) ที่มีความหมายและกำหนดค่าได้ เพื่อให้เป็นมาตรฐานยิ่งขึ้นสำหรับแต่ละเฟส Maven จะเรียกขั้นตอนก่อนหน้าใด ๆ ก่อนดังนั้นเช่นถ้าคุณต้องการทดสอบคุณจะต้องแน่ใจว่าคุณรวบรวมก่อน
ps โปรดทราบว่าเมื่อระบุหลายเป้าหมายสำหรับสิ่งเดียวกันexecution
คุณจะยังคงเห็นได้อย่างชัดเจนในบันทึกการสร้างการดำเนินการที่แตกต่างกันสองรายการ (ด้วยรหัสเดียวกัน) สำหรับเป้าหมายที่แตกต่างกันสองเป้าหมาย (ดังนั้นทูเปิลยังคงไม่ซ้ำกัน)