Tuesday, February 28, 2006

Maven2

maven2 ออกมานานแล้ว
แต่ผมยังไม่กล้าใช้สักที
เนื่องจากเคยมีประสบการณ์ที่ขมขื่นกับการ upgrade maven มาแล้ว

วันนี้เห็น feature Archetype ของ Maven2 ก็เลยได้ฤกษ์ทบทวนและทดลองใช้เสียที
ใน maven2 ตัว execute file ของ maven ใช้วิธีเปลี่ยนชื่อเป็น mvn
เพื่อหลีกเลี่ยง Name conflict กับ maven 1.0.x

ที่ชอบก็คือ project เก่าเราที่ใช้ maven 1.0.x
สามารถใช้ maven 2.x co-exists กับ maven 1.x พร้อมๆกันได้ด้วย

โดยใน maven 1.x ปกติจะใช้ file ชุดนี้
  • project.xml
  • maven.xml
  • project.properties
  • build.properties

maven 2.x เปลี่ยนไปใช้ file ชุดนี้แทน
  • pom.xml
  • settings.xml


เนื้อหาของ pom.xml ก็คือเนื้อหาเก่าที่เคยอยู่ใน project.xml
เพียงแต่มีการเปลี่ยนชื่อและเพิ่มเติม element ใหม่ๆเข้ามา

default source structure ของ Maven 2.x หน้าตาเป็นแบบนี้
  • src/main/java
  • src/main/resources
  • src/main/filters
    เก็บพวก properties file ที่ใช้ transform resources file
  • src/main/assembly
    (อันนี้เดาว่าเก็บพวก ejb descriptor ทั้งหลาย)
  • src/main/config
  • src/test/java
  • src/test/resources
  • src/test/filters
  • src/sites
  • LICENSE.txt
  • README.txt


output files ทั้งหลายจะถูกสร้างใน sub-directory target
เหมือนใน maven 1.x

ใน maven2 มีการเพิ่ม concept ของ Build Lifecycle เข้ามา
ซึ่งจะมาแทนที่การใช้ tag preGoal, postGoal เดิม ที่เราใช้ใน maven.xml
โดย phase หลักๆใน lifecycle จะประกอบด้วย
  • validate
    ตรวจว่า project เรามีข้อมูลเบื้องต้นครบถ้วนหรือไม่
  • generate-sources
  • process-sources
  • generate-resources
  • process-resources
  • compile
  • process-classes
    ทำพวก bytecode enhacement ที่จุดนี้
  • generate-test-sources
  • generate-test-resources
  • process-test-resouces
  • process-test-resources
  • test-compile
  • test
    unit testing
  • package
  • before-integration-test
  • integration-test
  • after-integration-test
    อันนี้เป็นการ deploy และ test บน test environment
  • verify
    test package ว่า valid หรือไม่
  • install
    install package ไปที่ local repository เพื่อให้ project อื่นๆ
    ที่ต้องการใช้ artifact ตัวนี้ สามารถอ้างใช้งานได้
  • deploy

การ integrate goal จาก plugin ที่ต้องการ
เข้าไปใน project ทำได้โดยการ add
element plugin เข้าไปใน pom.xml
ซึ่ง plugin แต่ละตัว จะรู้บทบาทว่า
ตัวเองควรจะเข้าไป cooperate ใน phase ไหน
(แต่เราสามารถ overwrite ระบุ phase ที่เราต้องการให้ plugin run ได้ด้วย)

ยกตัวอย่าง antlr plugin ที่ปกติจะ run ในช่วง generate-sources
(เพราะต้อง compile .g -> ให้เป็น .java)

<project>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antlr-plugin</artifactId>
<configuration>
<grammars>java.g</grammars>
</configuration>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
...
</project>


วิธีการพัฒนา plugin ใน maven 2.x
ก็มีการเปลี่ยนแปลงไปเช่นกัน
เดิมต้องมี jelly script เสมอ
ก็เปลี่ยนไปใช้ java ล้วนๆ
โดยใช้ศัพท์ Mojo (Maven [plain] Old Java Object) สำหรับ plugin แบบนี้

Dependency Management ก็มีการปรับปรุงใหม่
มีการเพิ่ม Transitive Dependencies, Dependency Scope เข้ามา

Feature อื่นๆยังมีอีกเยอะแยะเลย
อย่างนี้ไม่ใช้ไม่ได้แล้ว

Related link from Roti

No comments: