Maven เป็นเครื่องมือสำหรับการจัดการการสร้างโปรเจ็กต์ (build tool) ที่นิยมใช้ในโลกของการพัฒนา Java ซึ่งมีฟีเจอร์ที่ช่วยให้นักพัฒนาจัดการกับ dependencies ของโปรเจ็กต์ได้อย่างมีประสิทธิภาพ นอกจากนี้ยังสามารถจัดการกับ plugins ได้อย่างยืดหยุ่นเพื่อเพิ่มความสามารถต่างๆ ในกระบวนการ build
หนึ่งในจุดเด่นของ Maven คือความสามารถในการจัดการกับ "dependency scope" ซึ่งช่วยให้คุณสามารถกำหนดได้ว่า dependencies ใดควรจะใช้งานในขั้นตอนไหนของกระบวนการ build เช่น การ compile, การ test, หรือการ runtime
Dependency scope คือการกำหนดขอบเขตการใช้งานของ dependencies ภายในโปรเจ็กต์ ซึ่ง Maven ให้เราสามารถกำหนดได้ผ่าน POM (Project Object Model) file โดยมี scope หลักๆ ดังนี้:
1. compile: เป็นค่า default หากไม่กำหนด scope ใดๆ จะถูกตั้งค่าเป็น compile scope ทำให้ dependency ใช้ได้ทั้งในขั้นตอน compile, test, และ runtime 2. provided: ทำให้ dependency สามารถใช้ได้ในขั้นตอน compile และ test แต่ไม่ควรรวมอยู่ใน JAR หรือ WAR ที่ถูกสร้าง เนื่องจากคาดว่าจะมีอยู่แล้วใน runtime environment (เช่น libraries ของเซิร์ฟเวอร์) 3. runtime: ใช้ในขั้นตอน runtime และ test แต่ไม่จำเป็นต้องใช้ตอน compile (dependency จะถูกจัดเตรียมให้เมื่อใช้งานจริง) 4. test: ถูกใช้เฉพาะในขั้นตอนการ test เท่านั้น ไม่รวมในการ compile หรือ runtime ของโปรเจ็กต์ 5. system: คล้ายกับ provided แต่ dependency จำเป็นต้องอ้างอิงไปยังไฟล์ในระบบที่กำหนดอย่างชัดเจน 6. import: เฉพาะในกรณีที่ใช้งานกับ dependency management ซึ่งทำให้ POM สามารถนำเข้า dependencies ทั้งหมดจาก BOM (Bill Of Materials) มาใช้งาน
สมมติว่าเรากำลังพัฒนาแอพพลิเคชันที่ใช้ Spring Framework และต้องการจัดการ dependencies ให้เหมาะสมกับความต้องการ ดังนี้
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>3.0.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>3.0.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
ในตัวอย่างนี้ แสดงให้เห็นถึงการตั้งค่า dependency scope หลายแบบ:
- Spring Boot Starter ถูกตั้งเป็น `compile` เพราะเราต้องการใช้งานทั้งในขั้นตอนการ compile และ runtime - Spring Boot Starter Test ถูกตั้งเป็น `test` เพราะเราใช้งานเพียงในขั้นตอนการทดสอบเท่านั้น - Servlet API ถูกตั้งเป็น `provided` เนื่องจากคาดว่าเซิร์ฟเวอร์จะมีอยู่แล้ว (เช่น Tomcat)ภายในโปรเจ็กต์เดียวกัน การตั้งค่า dependency scope ที่ถูกต้องยังสามารถลดปัญหาการโหลด class ที่ซ้ำซ้อนหรือ unnecessary ในระหว่าง runtime ได้ ซึ่งเป็นผลดีทั้งทางด้านประสิทธิภาพและการบำรุงรักษาระบบ
นอกจากการจัดการ dependencies, Maven ยังสามารถใช้งานกับ plugins ที่หลากหลายเพิ่มฟีเจอร์เพิ่มเติมให้กับกระบวนการ build เช่น การทำ clean, compile, package และ deploy
ตัวอย่างของการใช้งาน Maven Plugins:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
</plugins>
</build>
ในตัวอย่างนี้:
- Maven Compiler Plugin ช่วยให้เรากำหนด Java version ในการ compile source code - Maven Surefire Plugin ถูกใช้สำหรับการเรียกใช้งาน unit test ในขั้นตอน buildทั้ง plugins และ dependencies เป็นสองส่วนที่เชื่อมโยงกันในระดับของ POM file ทำให้ Maven เป็นที่นิยมและเป็นที่ยอมรับในการจัดการโปรเจ็กต์ที่ซับซ้อน
การควบคุม dependencies อย่างมีประสิทธิภาพเป็นสิ่งสำคัญสำหรับนักพัฒนา และการเข้าใจในเรื่องของ dependency scope จะช่วยให้โปรเจ็กต์ไม่เพียงมีโครงสร้างที่ดีขึ้น แต่ยังช่วยลดความซับซ้อนและปัญหาที่อาจเกิดขึ้นในภายหลังได้
สำหรับผู้ที่สนใจจะพัฒนาทักษะในด้านการจัดการ dependencies และตั้งค่า Maven อย่างมีประสิทธิภาพ การศึกษาเพิ่มเติมและฝึกปฏิบัติกับโปรเจ็กต์จริงจะช่วยเพิ่มความเชี่ยวชาญได้ ไม่ว่าจะเป็นการเรียนรู้ด้วยตัวเองหรือเข้าร่วมคอร์สการเรียนการสอน เช่นที่ EPT ที่พร้อมให้คำแนะนำและการอบรมที่ครอบคลุมสำหรับนักพัฒนาในสาขานี้.
หมายเหตุ: ข้อมูลในบทความนี้อาจจะผิด โปรดตรวจสอบความถูกต้องของบทความอีกครั้งหนึ่ง บทความนี้ไม่สามารถนำไปใช้อ้างอิงใด ๆ ได้ ทาง EPT ไม่ขอยืนยันความถูกต้อง และไม่ขอรับผิดชอบต่อความเสียหายใดที่เกิดจากบทความชุดนี้ทั้งทางทรัพย์สิน ร่างกาย หรือจิตใจของผู้อ่านและผู้เกี่ยวข้อง
หากเจอข้อผิดพลาด หรือต้องการพูดคุย ติดต่อได้ที่ https://m.me/expert.Programming.Tutor/
Tag ที่น่าสนใจ: java c# vb.net python c c++ machine_learning web database oop cloud aws ios android
หากมีข้อผิดพลาด/ต้องการพูดคุยเพิ่มเติมเกี่ยวกับบทความนี้ กรุณาแจ้งที่ http://m.me/Expert.Programming.Tutor
085-350-7540 (DTAC)
084-88-00-255 (AIS)
026-111-618
หรือทาง EMAIL: NTPRINTF@GMAIL.COM