Maven ใช้งาน part 3 — Phases & Plugins
กลไกหลักของ Maven คือ build lifecycle อันประกอบด้วย phase ต่างๆที่มีลำดับการทำงานต่อเนื่องกันขึ้นอยู่ว่าเลือกทำงาน ณ phase ไหน เป็นที่มาของบทความนี้ครับ
ความเดิม part ที่แล้ว
ขณะนี้เราทราบแล้วว่าโครงสร้างของโปรเจกต์ที่ได้เลือก Maven เป็น build tool นั้น Maven จะดูแลประดา .jar ทั้งหลายที่เกี่ยวข้องให้ ทั้งยังมีกลไกการ build .jar ให้ผ่านสิ่งที่เรียกว่า build lifecycle
Maven Build Lifecycle
ก่อนอื่นมาดูสิ่งที่เราเรียนรู้กันจากคำสั่งที่ได้รันไปครับ
javac src/main/java/com/example/pros/Main.java
ความหมาย แปล .java ให้เป็น .class
java -classpath src/main/java com.example.pros.Main
หรือjava -cp src/main/java com.example.pros.Main
ควมหมาย ทำงาน .class (main method)
mvn package
ความหมาย สร้าง .jar
java -cp target/hello-1.0-SNAPSHOT.jar com.example.pros.Main
ความหมาย ทำงาน .class (main method) ใน .jar
mvn dependency:resolve
ความหมาย update dependency ให้เป็นปัจจุบัน
mvn test
ความหมาย ทำ unit test
คำถาม mvn package
ทำ unit test หรือไม่? คำตอบคือ ทำ
คำถาม mvn test
ได้ไฟล์ .jar หรือไม่? คำตอบ ไม่ได้
นั่นหมายความว่าแต่ละ phase มีลำดับที่ต่อเนื่องกันขึ้นอยู่กับว่า phase ไหนทำก่อนหลัง
Build Lifecycle & Phases
Phases เรียงลำดับการทำงานจากแรกถึงสุดท้ายดังนี้
เราเรียก phases ทั้งหมดข้างต้นนี้ว่า Default Lifecycle หรือพูดในทางกลับกันได้ว่า Default Lifecycle ประกอบด้วย phases ข้างต้นนี้ทั้งหมด
แล้วมีกี่ lifecycle? คำตอบ Maven ได้กำหนดให้มี 3 build lifecycles ดังนี้
- Default Lifecycle
- Clean Lifecycle
- Site Lifecycle
Default Lifecycle
เป็น lifecycle แรกเริ่มประกอบด้วย phases ที่ไม่เกี่ยวข้องกับ plugin ใดๆ ทว่าตามการใช้งานแล้วเรามักจะเลือกตัวบรรจุ (packaging) ว่าอยากให้ target ที่ได้เป็นอะไร เช่น .jar หรือ .war ด้วยเหตุนี้ Default Lifecycyle จึงถูกแบ่งย่อยตาม packaging ที่เลือกใช้เป็นสำคัญ
packaging
ที่มีให้เลือกได้แก่
- pom packaging
- jar packaging
- ejb packaging
- maven-plugin packaging
- war packaging
- ear packaging
- rar packaging
packaging เหล่านี้กลับถูกเขียนให้ผูกกับ plugin ครับ ทำไมล่ะ? แล้ว plugin คืออะไร?
plugin ในที่นี้คือโปรแกรมสคริปต์หรือการเขียนโปรแกรมย่อยขึ้นมาเพื่ออำนวยความสะดวกหรือเพื่อทำให้งานย่อยใดๆนั้นบรรลุเป้าหมาย เช่น อยากให้ Maven สร้าง .jar ซึ่งแท้จริงแล้ว Maven จู่ๆจะทำให้เลยไม่ได้เพราะมันไม่รู้เรื่อง จำเป็นต้องเขียนโปรแกรมแยกต่างหากเพื่อทำให้เรื่องนี้เกิดขึ้นโดยยึดเอา phase ต่างๆมาประกอบกัน
packaging เหล่านี้เมื่อถูกผูกกับ plugin จึงเรียกว่า Plugin Bindings for Default Lifecycle และเมื่อนำมาแยกตาม packaging ดังกล่าวก็ได้ชื่อใหม่เป็น
- Plugin Bindings for pom packaging
- Plugin Bindings for jar packaging
- Plugin Bindings for ejb packaging
- Plugin Bindings for maven-plugin packaging
- Plugin Bindings for war packaging
- Plugin Bindings for ear packaging
- Plugin Bindings for rar packaging
หน้าตาของประดา plugin bindings for packagings ข้างต้นเป็นแบบนี้ครับ (เลขเวอร์ชันยังไม่ต้องสนใจ เพราะขึ้นอยู่กับ Maven version ที่ติดตั้ง)
Plugin Bindings for pom packaging
Plugin Bindings for jar packaging
Plugin Bindings for ejb packaging
Plugin Bindings for maven-plugin packaging
Plugin Bindings for war packaging
Plugin Bindings for ear packaging
Plugin Bindings for rar packaging
เอามาให้ดูเยอะแยะไม่รู้หรอกมันคืออะไร สำคัญเมื่อไร อย่างนั้นกลับมาที่โปรเจกต์ hello ของเราครับ
เปิด pom.xml
โดย default หากไม่ระบุ packaging ที่ต้องการ ค่านี้จะเป็น plugin bindings for jar packaging
ทราบได้อย่างไร? คำตอบ ตรวจสอบสิ่งที่จะเกิดขึ้นเมื่อเรียกใช้ POM สิ่งนี้เรียกว่า effective POM ซึ่งสามารถพิสูจน์ด้วยคำสั่ง mvn help:effective-pom
หรือทำให้ผลลัพธ์นั้นดูง่ายขึ้นไปอีก
mvn help:effective-pom | grep -n '<plugin' -A 2
ผล
ผลลัพธ์คือหน้าตาของ plugin bindings for jar packaging หรือพูดง่ายๆว่าเลือก .jar เป็นผลลัพธ์ (jar packaging)
แน่นอนว่าเรากำหนด packaging อย่างชัดเจนเลยก็ได้ใน pom.xml
<groupId>com.example.pros</groupId><artifactId>hello</artifactId><packaging>jar</packaging><version>1.0-SNAPSHOT</version>
Clean Lifecycle
มีไว้เพื่อ clean คือลบทุกไฟล์ที่เกิดขึ้นจากการ build ก่อนหน้านี้
ประกอบด้วย
จากคำสั่ง mvn test
หรือ mvn package
ที่ผ่านมาจะได้ folder ชื่อ target ดังนั้นคำสั่ง mvn clean
ก็จะลบ folder นี้ทิ้ง
Site Lifecycle
สร้างโปรเจกต์ site documentation (ส่วนตัวไม่เคยใช้งานเลย)
ประกอบด้วย
สรุป
เพื่อนๆจะเห็นว่างานที่ Maven ทำก็คือ phases โดยที่แต่ละ phase ก็มี plugin รับผิดชอบ เราเรียกกลุ่มของ phases ว่า build lifecycle ซึ่ง Maven ได้เตรียม (built-in) มาให้ 3 build lifecycles ได้แก่ default, clean และ site ทั้งนี้โปรเจกต์ที่สร้างด้วย Maven จะต้องกำหนด packaging เสมอ โดย default แล้วก็คือ jar packaging
ผมอยากพูดเรื่องนี้ให้มีเค้าโครงก่อน ไม่เข้าใจทั้งหมดไม่เป็นไร เพราะเรายังมี part ถัดไปคอยท่าอยู่ ไว้พบกันครับ
อ่านต่อ
อ้างอิง
http://maven.apache.org/ref/3.6.3/maven-core/lifecycles.html
http://maven.apache.org/ref/3.6.3/maven-core/default-bindings.html#Plugin_bindings_for_pom_packaging
http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
https://www.baeldung.com/maven-goals-phases
https://medium.com/@anandmattikopp/maven-lifecycle-phases-plugins-and-goals-25d8e33fa22
https://mincong.io/2017/11/07/maven-plugins-understanding/