[Java] รู้จัก Maven ให้มากขึ้น เพื่อก้าวสู่ java professional
ถึงวันนี้คงไม่มี java dev คนไหนไม่ยอมใช้ maven กันอีกแล้ว แต่คงต้องอธิบายกันหน่อยเผื่อบางท่านมาจากภาษาอื่น ไม่ว่ากันครับ :D
ตัวอย่างโครงสร้าง maven project บน IntelliJ IDEA
pom.xml คือ ส่วนสำคัญที่สุดของ maven project เราจะต้องระบุการเรียกใช้งาน dependency, plugin จะถูกเขียนไว้ที่ไฟล์นี้ ในรูปแบบ xml
ตัวอย่าง pom.xml
แต่บางครั้ง dependency ที่เราดึงมาก็อาจดึง dependency อื่นต่ออีกทีนึง เมื่อไรเลือกใช้ library จำนวนมาก ก็อาจจะต้องตรวจสอบกันหน่อย
ถึงแม้ว่าปัจจุบัน gradle จะมาแรง และมีผู้ใช้บ้างแล้ว แต่ถ้าสังเกตดี ๆ การเรียกใช้งาน repository ก็จะชี้ไปที่ maven central อยู่นะ
maven คือ ??
maven เป็น build tool ที่มีคลัง java source code หรือเรียกอีกอย่างว่า dependency เป็นของตัวเองอย่าง maven repository (https://mvnrepository.com/) ซึ่งประกอบด้วย library, plugin, archetype ให้เลือกใช้มากมาย ซึ่ง editor ส่วนใหญ่ก็รองรับกันอยู่แล้ว บางตัวก็มีติดมาในตัวเลย ไม่ต้องติดตั้ง maven เองเพิ่ม แต่ผมก็แนะนำให้ download แยกต่างหากนะตัวอย่างโครงสร้าง maven project บน IntelliJ IDEA
*.idea, *.iml เป็นไฟล์เฉพาะของ IntelliJ project ไม่ต้องสนใจ |
ตัวอย่าง pom.xml
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemalocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelversion>4.0.0</modelversion> <groupid>th.in.lordgift</groupid> <artifactid>DemoMaven</artifactid> <version>1.0-SNAPSHOT</version> <dependencies> <!-- <dependency> <groupid></groupId> <artifactid></artifactId> <version></version> </dependency> ... --> </dependencies> </project>สังเกตว่า maven จะ ใช้ attribute 3 ค่านี้เสมอ
- groupId คือ ชื่อ package ควรใช้ตัวอักษรตัวเล็กทั้งหมด เช่น th.in.lordgft
- artifactId คือ ชื่อ project เช่น DemoMaven
- version คือ version สำหรับ build สามารถใช้อักขระร่วมกับตัวเลขได้ เช่น 1.0-SNAPSHOT
ซึ่งไม่ว่าจะเป็นการสร้าง maven project หรือการ download dependency จำเป็นต้องระบุ attribute ให้ถูกและครบด้วย ไม่งั้น maven อาจดึงของมาให้เราผิด
การใช้งาน maven ผ่าน command-line
การใช้งานต้อง change directory (cd
) ไปที่ root ของ maven project ก่อน จากนั้นจะสามารถใช้งานคำสั่งต่าง ๆ ได้ เช่นmvn clean
mvn package
mvn installหรือจะรวมและสั่งทีเดียว
mvn clean package
แต่บางครั้ง dependency ที่เราดึงมาก็อาจดึง dependency อื่นต่ออีกทีนึง เมื่อไรเลือกใช้ library จำนวนมาก ก็อาจจะต้องตรวจสอบกันหน่อย
mvn dependency:tree
[INFO] +- org.springframework.boot:spring-boot-starter:jar:2.0.0.RELEASE:compile [INFO] | +- org.springframework.boot:spring-boot:jar:2.0.0.RELEASE:compile [INFO] | | \- org.springframework:spring-context:jar:5.0.4.RELEASE:compile [INFO] | +- org.springframework.boot:spring-boot-autoconfigure:jar:2.0.0.RELEASE:compile [INFO] | +- org.springframework.boot:spring-boot-starter-logging:jar:2.0.0.RELEASE:compile .....
Build tool & Dependency
ในส่วนของ maven อาจสร้างความกำกวมให้เล็กน้อย เพราะตัวมันเบ็ดเสร็จในตัวเอง- Build tool เป็นเครื่องมือในการ build project (ไม่ใช่ compiler นะ) ตัวอย่างเช่น gradle, ant เป็นต้น
- Dependency เป็นการดึงเอา source code มาจาก repository ซึ่งในปัจจุบันก็มี repository มากมาย ทั้ง maven เอง (java), jCenter (java), cocoapods (xcode project) หรือในองค์กรก็อาจทำ repository ขึ้นมาเฉพาะก็มี
ถึงแม้ว่าปัจจุบัน gradle จะมาแรง และมีผู้ใช้บ้างแล้ว แต่ถ้าสังเกตดี ๆ การเรียกใช้งาน repository ก็จะชี้ไปที่ maven central อยู่นะ
//build.gradle group 'th.in.lordgift' version '1.0-SNAPSHOT' apply plugin: 'java' sourceCompatibility = 1.8 repositories { mavenCentral() } dependencies { testCompile group: 'junit', name: 'junit', version: '4.12' }แอบแถมของมาให้นิดหน่อย build.gradle เปรียบเสมือน pom.xml แต่เป็นของ Gradle project ดู ๆ ซึ่งดูดีกว่า xml เยอะ ภาษาที่ build.gradle ใช้คือ groovy ซึ่งมาฐานมาจาก java แต่ถึงอย่างนั้นก็ไม่จำเป็นจะต้องศึกษา groovy เพื่อเขียน build.gradle ก็ได้ครับ