แต่ผมยังไม่กล้าใช้สักที
เนื่องจากเคยมีประสบการณ์ที่ขมขื่นกับการ 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 อื่นๆยังมีอีกเยอะแยะเลย
อย่างนี้ไม่ใช้ไม่ได้แล้ว
No comments:
Post a Comment