Tuesday, November 28, 2006

Maven vs. Ant

ช่วงนี้ mk, community builder ของเรา
เกิดต้องหันมาจับ java
ก็เลย post ตั้งคำถาม ไว้จำนวนหนึ่ง
ผมจะค่อยๆหยิบมาทยอยเขียนตอบ
โดยเริ่มที่คำถาม "Ant กับ Maven ต่างกันอย่างไร"

เริ่มที่ Ant ก่อน
Ant คือ build tool ตัวหนึ่ง
เขียนโดย James Duncan Davidson ซึ่งเป็นคนเขียน Tomcat
วัตถุประสงค์ในตอนแรกที่เขาเขียน ก็ชัดเจนมาก
นั่นคือ ใช้ในการ build tomcat

การทำงานของ ant ก็คล้ายๆพวก makefile ของพวก unix
มีหน้าที่คำ build ให้ได้ target file
ซึ่งอาจจะเป็น jar file, war file, javadoc file, ฯลฯ
ซึ่งแน่นอนว่าประเด็นที่สำคัญในการ build ก็คือ ลำดับการทำงาน
ดังนั้นการเขียน ant ก็คือ การร้อยเรียงลำดับการทำงานต่างๆเข้าด้วยกัน

ที่นี้แล้ว maven หล่ะ
maven ก็มีที่กำเนิดคล้ายๆ ant
โดยเกิดในระหว่างการพัฒนาโปรเจค jakarta turbine
(อันนี้เป็น web framework รุ่นแรกๆของ java)
สาเหตุก็คือเมื่อ project ใหญ่ขึ้นมาก
เรามักจะ split project ออกเป็น sub project ย่อยๆ
project structure มีลักษณะเป็น hierarchy structure
แต่ละ sub project ก็มี team ทำงานแยกกัน

+ project X
+ sub project Domain
+ sub project Service
+ sub project Web App
+ sub project Main App
+ sub project Admin App

คนที่เคยใช้ ant กับ project ที่มีลักษณะแบบนี้
จะรู้ว่าการ maintain ant file เป็นเรื่องน่ารำคาญใจเรื่องหนึ่งทีเดียว
การเขียน ant script จะใช้วิธี copy & paste ไปมา
ถ้าเปิดดู build file แต่ละตัว ก็จะเห็นว่ามีส่วนที่ซ้ำกันไปซ้ำกันมาเต็มไปหมด
jar file ของ subproject ก็ซ้ำๆกัน
แถมยังถูก check-in เข้า version control
นอกจากนี้ยังต้องทำ ant script ตัวใหญ่
ไว้คอยคุมลำดับการ build ของโปรเจค, ฯลฯ

maven ก็เลยเกิดมา เพื่อเติมรอยโหว่ในจุดนี้
ลองดูวัตถุประสงค์ของ maven

  • Making the build process easy
    หลักการของ maven ก็คือ ทำอย่างไรให้ช่วงเวลาที่ใช้ในการ setup
    build file น้อยที่สุด
    อันนี้ก็เลยมี feature พวก archetype,
    library repository ที่ช่วยแยก library ออกจาก project

  • Providing a uniform build system
    ถ้าเราเข้าใจกลไกการ build ของ project ที่ใช้ maven อันหนึ่ง
    เราก็จะเข้าใจ project อื่นๆที่ใช้ maven ทันที

  • Providing quality project information
    maven ให้ความสำคัญของ กลไกการ generate document จาก code

  • Providing guidelines for best practices development
    อันนี้ค่อนข้างสำคัญ, สมัยแรกๆที่ใช้ ant
    project แต่ละ project ก็จะมี idea การวางโครงสร้าง directory, การตั้งชื่อ
    กันหลากหลายมาก
    ส่วนของ maven ก็เลยกำหนดมาตรฐาน (default, best practices) ขึ้นมาอันหนึ่ง

  • Allowing transparent migration to new features
    ตรงนี้ประสบการณ์ผมไม่ตรงที่โฆษณาไว้
    จำได้ว่า maven1.x เคย upgrade version แล้ว build มันมั่ว
    ต้องลบทิ้งลงใหม่


feature ที่ผมชอบใน maven ก็มี
  • share repository
    library ที่เราใช้ใน project ต่างๆ จะรวมเก็บไว้ที่เดียว
  • transitive dependency
    ระบุ dependency เฉพาะตัวที่เราต้องการ
    พวกที่เหลือเดี๋ยว maven จะหามาให้เอง
  • การเขียน build file ในลักษณะ extend
    พวก sub project จะ extend คุณสมบัติจาก parent project


ส่วนที่ไม่ค่อยชอบ
  • เริ่มต้นไม่ถูก ไม่รู้จะเรียกคำสั่งไหน เมื่อไร
    จะรู้ได้ไงว่ามีคำสั่งอะไรใช้บ้าง
  • การ integrate project ที่มีโครงสร้างแบบ hierarchy
    เข้ากับ eclipse (IDE) นี่ มันไม่ธรรมดาเหมือนกัน
    ไม่ยาก แต่ก็ไม่สนุก


ที่นี้ก็มาถึงคำถามสำหรับการเลือกใช้
สำหรับผมนะ
project เขียนคนเดียว ไม่ยั่งยืน ผมใช้ build ของ IDE
project เล็กๆที่เผยแพร่ให้คนอื่น ใช้ ant
project กลางๆ ถ้ารีบก็ใช้ ant, ถ้าไม่รีบก็ maven
(เนื่องจากการเรียนรู้ maven ใช้เวลามากกว่า ant)
project ใหญ่เป็นเรื่องเป็นราว ใช้ maven

Related link from Roti

2 comments:

Mk said...

ขอบคุณครับ

ยิ่งอ่านแล้วยิ่งชอบแนวคิด one size fit all แบบ make มากขึ้น เฮ้อ ไปรอดไหมเนี่ยตู

Anonymous said...

ขอบคุณ ครับ สำหรับข้อมูลดีๆ ที่มีให้