Maven ใช้งาน part 3 — Phases & Plugins

Phai Panda
3 min readJul 11, 2020

--

กลไกหลักของ Maven คือ build lifecycle อันประกอบด้วย phase ต่างๆที่มีลำดับการทำงานต่อเนื่องกันขึ้นอยู่ว่าเลือกทำงาน ณ phase ไหน เป็นที่มาของบทความนี้ครับ

https://visualpathdevopsmaterial.blogspot.com/2018/11/maven-build-lifecycle.html

ความเดิม 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 ดังนี้

  1. Default Lifecycle
  2. Clean Lifecycle
  3. 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/

--

--

No responses yet