หนึ่งในสิ่งที่ต้องมีในวันที่ 21-22 คือ Apache Maven ครับเนื่องจากเราจะตัดปัญหาเรื่อง Project Structure โ ดยจะใช้ Structure มาตรฐานของ Maven ดังนั้นผลดีที่ตามมาคือเราสามารถใช้ IDE อะไรก็ได้ตามถนัดครับ (Netbeans, Eclipse และ IntelliJ) และจะใช้ command line ต่างๆในการสั่งงานเป็นหลัก
Apache Maven คืออะไรมันคือ Build Tool (แต่จริงๆทำได้มากกว่านั้น) เราจึงสามารถสั่ง Compile, Clean, Test, Pack, Deploy ได้นออกจากนี้ Maven เองยังช่วนเราในเรื่องของการทำ Labrary Management ได้อีกด้วยแต่ทำอย่างไรเดี๋ยวค่อยมาดูกันครับตอนนี้วัยรุ่นอยากรู้แล้วว่าจะติดตั้งอย่างไร “ง่ายมาก”
- Download ก่อนเลยโดยการสอนครั้งนี้จะใช้รุ่น Maven 2.0.10 ครับอย่างรอช้าไฟล์ขนาดไม่ใหญ่ครับ (ผมไม่แน่ใจสำหรับคนที่ใช้ Ubuntu ว่าสสามารถเรียก apt-get install maven ได้เลยหรือป่าวครับ)
- คนที่ใช้ Windows ก็แตกมันออกไว้ในไดเรคทอรี่ที่เราต้องการเช่น D:\DEV\TOOLS\MAVEN\2010 ครับ
- จากนั้นไปสร้าง ENVIRONMENT_VARIABLE ชื่อ M2_HOME ให้มีค่าเท่ากับ D:\DEV\TOOLS\MAVEN\2010
- เพื่อให้สามารถเรียกใช้ Maven ได้จาก Command Prompt ต้องไปเพื่มที่อยู่ของคำสั่งที่ต้องการไว้ใน PATH โดยให้เพิ่ม $M2_HOME$\bin เข้าไป
- เรียบร้อยครับ จากนั้นให้เปิด Command Prompt แล้วพิมพ์ mvn-version เราจะได้คำตอบออกมาแบบนี้
Maven version: 2.0.10
Java version: 1.6.0_10
OS name: “windows xp” version: “5.1″ arch: “x86″ Family: “windows”
ต่อไปเราลองมาสร้าง Project โง่ๆหนึ่งอันเพื่อให้เราสามารถเข้าใจ Maven ได้ดีมากขึ้น
ไปที่ไดเรคทอรี่ที่เราใช้ทำงานเช่น D:\WORKSPACE\JAVA\SPRING66
พิมพ์คำสั่ง mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=my-app ยาวไหมนี่ยังไม่ยาวเท่าไหร่นะเหอๆๆๆ หลังจากนี้มันจะไปโหลดอะไรวุ่นวายไปหมด อีกอย่างครับใช้ Maven ครั้งแรกต้องมีอินเทอร์เน็ทนะครับ ไม่เช่นนั้นตาย
คำสั่งนี้แปลว่าสร้างโปรเจคชื่อ my-app ครับโดยให้มีชื่อแพคเกจพื้นฐาน com.mycompany.app ครับโดยถ้าเราไปเปิดดูในโปรเจคเราจะเห็นไฟล์ชื่อ pom.xml หน้าตาเป็นแบบนี้
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>my-app</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
ไฟล์นี้คือพระเอกของเราเพราะมันจะเป็นตัวกำหนดรายละเอียดของโปรเจคของเรา นอกจากนี้ยังระบุไลบรารี่ที่เราจะต้องใช้ในโปรเจคนี้อีกต่างหาก โดยเราสามารถดูได้ที่บริเวณ dependencies ที่ต้องทำแบบนี้เนื่องจากในจาวาเองนั้น ไลบรารี่มีประมาณล้านแปด แต่ละตัวมีอีกสองล้านเวอร์ชั่น ดังนั้นถ้าทีมไม่มีมาตรฐานในการกำหนดเวอร์ชั่นของไลบรารี่แล้วนั้น ในกรณีที่มีคนทะลึ่งเปลี่ยนเวอร์ชั่นของไลบรารี่ไป ไม่บอกคนอื่น “นรก” รอเราอยู่ที่หน้าจอเพราะมันจะลำบากนิดหน่อย เหงื่อหยดสองเม็ด
ข้อดีอีกอย่างคือ ยกตัวอย่างเช่นเราใช้ JUnit 3.8.1 โปรเจคนี้ถ้าเป็นแต่เก่าก่อนเราต้องไปไล่หาเอาเองว่าแล้วไอ้ Junit เวอร์ชั่นนี้มันต้องใช้ไลบรารี่ตัวไหนอีกแต่ JUnit ไม่สะใจเอาเป็นว่าเราจะใช้ Hibernate Annotation ละกันเราต้องใช้อะไรบ้าง
วิธีการคือให้เพิ่ม dependency เข้าไปที่ dependencies ดังนี้
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-annotations</artifactId>
<version>3.3.0.ga</version>
</dependency>
ไม่ต้องรอช้าที่ root โปรเจคของเรา (ที่ที่มีไฟล์ pom.xml) พิพม์ mvn compile โลดมันจะเริ่ม download ไฟล์อีกแล้วเยอะแยะไปหมด สงสัยไหมว่ามันรู้ได้ไงว่าต้องโหลดอะไรบ้าง ถ้าสงสัยตามมา
ใครไม่สงสัยให้เลิกอ่านต่อ
สงสัยต้องรู้ก่อนว่าไฟล์ทั้งหมดที่ Maven ทำการ Download ลงมานั้นจะอยู่ที่ C:\Documents and Settings\twinp\.m2\repository สำหรับ *nix จะอยู่ที่ {home}/.m2/repository ครับ
ให้เราไปเปิดไดเรคทอรี่นี้ดูครับ {repository}\hibernate\hibernate-annotations\3.1beta4 จะพบไฟล์ชื่อ hibernate-annotations-3.1beta4.pom หน้าตาเป็นแบบนี้
<?xml version="1.0"?>
<project
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"
>
<modelVersion>4.0.0</modelVersion>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-annotations</artifactId>
<packaging>jar</packaging>
<version>3.4.0.GA</version>
<name>Hibernate Annotations</name>
<description>Annotations metadata for Hibernate</description>
<url>http://annotations.hibernate.org</url>
<licenses>
<license>
<name>GNU LESSER GENERAL PUBLIC LICENSE</name>
<url>http://www.gnu.org/licenses/lgpl.txt</url>
</license>
</licenses>
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>ejb3-persistence</artifactId>
<version>1.0.2.GA</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-commons-annotations</artifactId>
<version>3.1.0.GA</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>3.3.0.SP1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.4.2</version>
</dependency>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
</dependencies>
</project>
เดาได้แล้วใช่ไหมครับว่า ไลบรารี่แต่ละตัวในนี้ก็จะมีการบอกโลกว่า “จะใช้ฉัน ต้องไปหาใครมาด้วย” เล่นกันเราจึงหมดกังวลเรื่องการขึ้นต่อกันของไลบรารี่ไปได้ระดับหนึ่ง จบภาคนี้ครับภาคต่อไป

ทำไมผมถึงรู้สึกว่า Maven ดูวุ่นวายกว่า Ant หว่า
ถ้าเปรียบมวยระหว่าง Maven กับ Ant แล้ว ท่านอาจารยมีความเห็นว่าอย่างไรครับ ใครดีเด่นในเรื่องอะไร
error ครับ
ตอน compile ไปซักพักนึงมันแจ้งขึ้นมาว่า
Failed to resolve artifact.
Missing:
————-
1> javax.transaction:jta:jar:1.0.1B
Try downloading the file manually from:
http://java.sun.com/products/jta
Then, install it using the command:
mvn install:install-file -DgroupId=javax.transaction -DartifactId=jta -version=1.0.1B -Dpackageing=jar -Dfile=/path/to/file
Alternatively, …
…
อะไรประมาณเนี้ย เหมือนไฟล์มันไม่ครบ
@him_aeng แน่นอนว่า ant จะดูคล่องตัวสะดวกสบายมากเมื่อก่อนผมเกลียด Maven เข้าใส้แต่พอออก v2 มันก็แก้ปัญหาเรื่องการใช้งานได้ดีขึ้นเลยลองกลับมาใช้ใหม่ครับ
ปัญหาหลักของ Ant คือเรื่องการจัดการ Library Dependency และ Complex Project Structure
ข้อแรกสามารถแก้ได้ด้วยการใช้งานร่วมกับ Ivy ครับแต่สำหรับผม Ivy ผมไม่ได้ลองใช้งานเป็นเรื่องเป็นราวเท่าไหร่ ส่วนเรื่อง Project Structure นี่มุมมองผมว่า Maven จัดการได้ดีกว่าเยอะมาก
แต่ทั้งหมดเป็นความเห็นส่วนตัวนะครับ ทั้งสองตัวทำงานได้เหมือนกัน สุดอยู่ที่ใครใช้งานได้คล่องกว่ากันเท่านั้นเองครับ
@him_aeng ไปอ่านวิธีแก้ที่ Prototype for Training Day, please try dude!!! ครับท้ายๆมีวิธีแก้ครับ
@him_aeng เล่น Twitter หรือป่าวครับถ้าเล่น tweet หาผม @roofimon ครับ
**** มีบางส่วนต้องทำมือครับเช่น jta1.0.1B เราต้องไป download ไฟล์ที่นี่ก่อนครับ
http://java.sun.com/javaee/technologies/jta/index.jsp
แต่ไฟล์ท่ได้มาจะเป็น zip ไฟล์และชื่อไม่ตรงตามที่เราต้องการ ทางออกให้แก้ชื่อเป็น jta-1.0.1B.jar ครับ
จากนั้นให้วางไฟล์ .jar ที่ได้มาตามตำแหน่งที่ต้องการ เช่น ที่ root ของโปรเจค(ของผม D:\workspace\spring66-training) จากนั้นสั่งให้ maven ทำการ add ไฟล์นี้เข้าไปใน repository ด้วยคำสั่ง
mvn install:install-file -DgroupId=javax.transaction -DartifactId=jta -Dversion=1.0.1B -Dpackaging=jar -Dfile=D:\workspace\spring66-training\jta-1.0.1B.ja
ผมเล่น twitter ครับ เดี๋ยวขออนุญาติ follow ท่านอาจารย์นะครับ
ว่าแต่ทำไม Maven เขาต้องเหลือ process ให้ต้องทำมือด้วยน๊า ทำเป็น automate ให้หมดก็ไม่ได้
มาลองทำตามครับ …..
เพิ่งว่างมาเตรียมตัว
ทำไมมันรันใน command line ไม่ได้ครับ มันบอก
‘mvn-version’ is not recognized as an internal or external command,operable program or batch file
ผมใช้ vista นะ เกี่ยวป่าวอะ
ได้แล้วครับ พอดีเป็นมือใหม่ครับ อ่านข้างบนแล้วงงเล็กน้อย เครื่องหมาย ‘$’ เหมือนว่าจะใช้กับ Unix-based Operating Systems (Linux, Solaris and Mac OS X)รึป่าวครับ
แต่ Window เราใช้ ‘%’ แทนใช้มั้ยครับ
ใน Window ใช้ % แทนครับผม
จาก $M2_HOME$\bin เป็น %M2_HOME%\bin