Maven ใช้งาน part 4 — Goals
เป็นอีกหนึ่งเรื่องที่ผมไม่เข้าใจ แต่ถึงเวลาต้องแก้ปัญหาก็มักจะได้เห็นคำว่า goal นี้อยู่เนืองๆ จึงเป็นที่มาของบทความนี้ครับว่า goal คืออะไร อยู่ส่วนไหนของ Maven
ความเดิมจาก part ที่แล้ว
ที่ผ่านมาเรารู้จักกับ Maven Build Lifecycle, Phase และ Plugin เราเชื่อมโยงความสัมพันธ์ของมันทั้ง 3 ได้ว่า
- Maven ออกแบบให้ phase เป็น stage ของ build lifecycle
- ลำดับขั้นตอนการทำงานถูกกำหนดด้วย phase
- phase ประกอบกันเป็น build lifecycle จำนวน 3 รูปแบบ ได้แก่ default, clean และ site
- แต่ละ phase ถูกทำงานด้วย plugin
- การสั่งทำงาน phase ใดๆนั้น phase ก่อนหน้าทั้งหมดจะต้องถูกทำงานตามลำดับ
ตัวอย่าง mvn install
ก็คือ mvn <phase-name> มีผลให้ทำงาน compile phase ต่อด้วย test phase และ package phase จึงจะทำงาน install phase (ตัวอย่างนี้ยกมาแค่บาง phases เท่านั้น)
Goals
Maven Goals หรือ Goal ใดๆแสดงถึงงานที่ต้องทำให้เกิดขึ้นจริงซึ่งมีส่วนช่วยในการสร้างและจัดการโปรเจกต์
หรือพูดง่ายๆว่างานหรือ task ที่เกิดขึ้นภายใน phase ก็คือ goal นั่นเอง งั้นพูดใหม่
build lifecycle ประกอบด้วย phases แต่ละ phase ประกอบด้วย plugins และแต่ plugin จะมี goal ได้ตั้งแต่หนึ่งหรือมากกว่านั้น เมื่อ goal ถูกเรียกใช้จึงเกิด task ในที่สุด
เชิญชม
mvn <phase-name>
เช่น mvn compile
, mvn test
, mvn package
, mvn install
, mvn deploy
เป็นต้น
mvn <plugin-name>:<goal-name>
เช่น mvn compiler:compile
, mvn compiler:testCompile
, mvn surefire:test
, mvn dependency:copy-dependencies
เป็นต้น
แต่ละ plugin:goal ที่ Maven ออกแบบไว้จะถูกผูกด้วย phase เสมอ ดังตารางนี้ที่เราเคยเห็นกันไปแล้วครับ
เราสามารถเลือกรัน phase ได้มากกว่าหนึ่ง หรือเลือกรัน goal แยกออกมาต่างหากจาก phase ก็ได้ (มันเป็นอิสระจากกันได้)
ตัวอย่างต่อไปนี้กำหนดให้รัน phase > goal > phase
mvn clean dependency:copy-dependencies package
ผล
ข้อสังเกตคือเราต่างก็เห็น plugin ถูกเรียกทำงานเต็มไปหมด ทำให้เกิดความสงสัยว่าแล้วมี plugin อะไรบ้างที่ควรเห็นให้ผ่านตาหรือทำความรู้จักบ้าง? คำตอบคือนี่ครับ
ลิงก์ข้างต้นคือ Maven — Available Plugins เขาเขียนไว้ชัดเจนมาก เขาบอกว่ามันนี่แหละที่เป็นหัวใจของ Maven เพราะงานทั้งหมดทำโดย plugin รายการทั้งหมดนั้นคือ core plugins และอื่นๆ แบ่งออกเป็น
- Build Plugins จะถูกทำงานขณะ build สามารถกำหนดได้ในแท็ก </build>
- Reporting Plugins จะถูกทำงานขณะ site generation สามารถกำหนดได้ในแท็ก </reporting>
ขอยกมาเพียงบางส่วน ดังนี้
Default Goal
ไฟล์ pom.xml นั้นถูกกำหนด default goal เป็น install หากเขียนเขียนออกมาจะได้เป็น
<build> <defaultGoal>install</defaultGoal></build>
ทั้งนี้สามารถใส่รายละเอียดปลีกย่อยอื่นๆ ได้แก่
- directory ผลลัพธ์
- รูปแบบชื่อของไฟล์ผลลัพธ์ (ในที่นี้คือ <file-name>.jar)
หากไม่กำหนดสองสิ่งนี้ก็จะได้ directory ผลลัพธ์เป็น target และรูปแบบชื่อไฟล์คือ artifactId คั่นด้วย — ต่อด้วย version
<build> <defaultGoal>install</defaultGoal> <directory>${basedir}/target</directory> <finalName>${project.artifactId}-${project.version}</finalName></build>
สรุป
goal ก็คืองานแท้จริงของ phase ซึ่งถูกเรียกใช้โดย plugin การเรียกทำงาน goal จะเรียกโดยตรงหรือผ่าน phase ก็ได้ เบื้องต้นนั้นเราจำเป็นต้องเข้าใจ phase ก่อนจึงจะทราบว่ามันสัมพันธ์กับ plugin ใดบ้างซึ่งท้ายสุดจะเชื่อมโยงไปยัง goal
แนวทางของเหล่า framework ต่างๆเมื่อเลือก Maven เป็น build tool แล้ว พวกเขาจะยึด Maven Build Lifecycle เป็นหลัก จากนั้นจะสร้าง plugin ของตนออกมาเพื่ออำนวยความสะดวกต่อการจัดการโครงสร้างโปรเจกต์ในแบบที่พวกเขาได้ออกแบบไว้ ตัวอย่าง Spring Boot รันโปรเจกต์จะได้ว่า mvn spring-boot:run
รายละเอียดมีมาก ไว้ผมมีความรู้เพิ่มจะกลับมาแก้ไขและเล่าต่อ เจอกันใหม่ สวัสดีครับ
อ่านต่อ
อ้างอิง
https://www.baeldung.com/maven