Thứ Sáu, 29 tháng 3, 2013

Maven Toan Tap

Đang đánh một dự án sử dụng Maven, cảm thấy cực kỳ ấn tượng với thằng này, nó thật sự rất hay và tiện lợi với các dự án cỡ lớn. OK, giờ chúng ta hãy cùng nhau khám phá Maven nhé


Phần 1: Khái niệm về Maven


Đầu tiên là khái niệm về Maven, Maven là gì, nó có lợi ích gì, cái này các bạn "Gúc" một phát ra đầy rẫy mình chỉ tóm tắt chút đỉnh để mọi người có thể hình dung cơ bản về Maven. Sau đó mình sẽ tiếp vào phần 2 luôn, tính mình không thích lý thuyết dài dòng.

Đối với những Dev nào làm về cách hệ thống lớn, phức tạp sử dụng nhiều thư viện và frame work lại đòi hỏi phải release liên tục cho nên công việc đóng gói (build & deploy), quản lý, nâng cấp và bào trì chúng thực sự rất oải. Ngoài ra việc tích hợp các thư viện mới cũng như quản lý và nâng cấp các thư viện có sẵn là tương đối phức tạp.

Tuy nhiên, những trở ngại nói trên hoàn toàn có thể giải quyết được nhờ vào Apache Maven.

Vậy ưu điểm của Maven là gì đó là:

Tự động hóa toàn bộ quá trình release project, khởi tạo, cập nhật thư viện, build & unit test và release, với một project cỡ lớn thì việc này là tối quan trọng, chỉ cần một sai lầm trong một công đoạn là có để delay cả dự án (lúc đấy thì tha hồ mà OT nhá =)).

Quản lý các dependency (các thư viện) trong project một các ưu việt: tự động cập nhật, mở rộng dễ dàng, đóng gói. Vì thế toàn bộ các file jar thư viện điều được "vứt" cho Maven quản lý điều đó khiến cho dung lượng project của chúng ta nhẹ nhàng đi rất nhiều.

Phân chia 1 project lớn thành các module nhỏ, từ đó cho phép làm việc đồng thời trên các module khác nhau, đồng thời vẫn tạo được tính thống nhất. Không phụ thuộc vào IDE, cho phép chuyển đổi từ Eclipse sang NetBeans, IntelliJ IDEA ... một cách dễ dàng. Mình thấy trong thực thế thấy rất nhiều dự án được nhiều công ty cùng phát triển, mỗi công ty lại phát triển một module và lại có một chuẩn IDE riêng nên Maven quả là một lựa chọn không tồi.

Trong thực tế thì cũng có khá nhiều dự án cũng như các công ty sử dụng Maven như một nền tảng build với những ứng dụng Java Enterprise. Các Dev, các bạn đã khởi đầu với Ant như là Beginner, vậy hãy đến với Maven như một Professional.


Phần 2: Cài đặt Maven.


1. Đầu tiên bạn hãy tải Maven tại địa chỉ: http://maven.apache.org/download.html
Ở đây tôi tải bản 3.0.4 là bản mới nhất tại thời điểm tác giả viết bài này.

2. Giải nén rồi để ở đâu đó tùy bạn, ở đây tôi để Maven tại: C:\apache-maven-3.0.4

3. Thiết lập biến môi trường.

Bạn hãy vào System Properties chọn Environment Variables.



Sau đó chọn New trong mục System variables thiết lập MAVEN_HOME chỉ đến thư mục cài Maven như hình sau.



Sau đó ta hãy thêm (edit) patch cho Maven "%M2_HOME%\bin" trong mục Patch trong mục System variables như trong hình:



Sau đó ta hãy vào Command line (vào run gõ cmd -> enter) thử lệnh maven --version


Nếu như trên hình tức là tức là mọi việc đã được cấu hình chính xác.


Phần 3: Thao tác với Maven trên Eclipse.

Bạn cũng có thể tạo một dự án Maven từ dòng lệnh command line, nhưng ở đây tôi xin phép hướng dẫn thao tác với Maven trên Eclipse. Eclipse mà một IDE tuyệt vời một người bạn không thể thiếu đối với những Java Dev.

Đầu tiên bạn phải tải plugin m2eclispe cho Eclipse tại đây: http://www.eclipse.org/m2e/download/
Ở đây tôi dùng Eclipse mới nhất là bản Eclipse 3.7 (Indigo).
Bạn vào menu Help ấn chọn Install New Software -> điền URL: http://download.eclipse.org/technology/m2e/releases vào mục work with rồi ấn Add -> Gõ tên plugin rồi ấn OK sẽ hiện thị ra như hình sau:



Sau đó việc của bạn là ấn next và chờ plugin cài đặt xong, tranh thủ thư giãn làm cốc caffe cái nhỉ .

Khi plugin cài đặt xong bạn hãy restart lại Eclipse, giờ bạn đã có một công cụ tuyệt với để bắt đầu với một dự án Maven đầu tiên.
Trước khi tạo project bạn hãy config lại thư viện Maven trong eclipse như sau: chọn menu Window -> Preferences -> Maven -> Installations ấn nút Add rồi chỉ đến thư mục cài đặt Maven rồi ấn OK để Eclipse làm việc với Maven mình vừa cài đặt bên trên.



Việc tạo một một Maven bây giờ trở nên dễ hơn ăn kẹo, đơn giản chỉ là chọn New -> Maven project. Trong phần Artifact-Id cho từng loại project khác nhau, ở đây tôi chọn maven-archetype-quickstart



Tiếp theo bạn hãy định nghĩa Group Id, Artifact Id và version cho project ở đây tôi gõ như sau
Group Id: com.iamvtn.maven
Artifact Id: helloworld
Vậy hai thằng này nó có ý nghĩa là gì? Tôi sẽ đề cập trong phần 4: Tìm hiểu các thành phần trong Maven project của bài viết.



Sau khi ấn finish project sẽ có cấu trúc như sau:



Giờ bạn có thể build, clean hay install hoàn toàn trên eclipse bằng cách bạn click chuột phải vào project chọn Run as -> Build, Clean, Install ...
File build được sẽ được lưu vào thư mục target của dự án.

(chú ý hãy enable chức năng Workspace Resolution bằng cách click chuột phải vào project chọn đến menu Maven -> Enable Workspace Resolution)

Phần 4: Tìm hiểu các thành phần trong Maven project.

1. Đầu tiên ta hãy tìm hiểu và file pom.xml, vậy file pom này có ý nghĩa gì mà cách dùng nó thế nào?

Maven dùng khái niệm Project Object Model(POM) để mô tả việc build project, các thành phần phụ thuộc và các module (dependency). Nó định nghĩa trước các target cho việc khai báo task, trình biên dịch, đóng gói và thứ tự hoạt động để mọi việc diến ra tốt nhất. Maven tải các thư viện, plug-in từ 1 hoặc nhiều repositories. Cũng có thể upload các sản phẩm lên repository sau khi đã build xong. Nói chung thì nó là một file config chung cả cả Maven project.

Ta hãy tìm hiểu và mổ xẻ file pom.xml trên project maven ta vừa tạo trên phần 3.

Model version luôn là 4.0.0 với Maven 2.x trở lên
 <modelVersion>4.0.0</modelVersion>

Group ID tương tự như là namespace(tên gói).
 <groupId>com.iamvtn.maven</groupId> 

Đây chính là tên của maven project.
 <artifactId>helloworld</artifactId> 

Định danh version của maven project
 <version>1.0</version>   

Dạng packaging của project có thể là dạng gói jar, pom hay bundle ...
 <packaging>jar</packaging>  

Tên của project
 <name>helloworld</name> 

Đây là nơi gọi các library dependencies ở đây tôi có sử dụng JUnit cho việc viết Unit test
Bạn có thể gọi thêm các library bằng thêm các thẻ dependency vào, vậy đấy việc thêm bớt hay upgrade thư viện chỉ đơn giản là config vài dòng lệnh, khỏe re không các bạn
 <dependencies>
  <dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>3.8.1</version>
   <scope>test</scope>
  </dependency>
 </dependencies>

Ngoài ra bạn có thể Maven còn có hỗ trợ những plugin vô cùng phong phú ví dụ đơn giản như plugin để complie Java, để dùng nó đơn giản bạn chỉ cần config như sau.
    <build>
        <plugins>
            
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.5</source>
                    <target>1.5</target>
                </configuration>
                <version>2.3.2</version>
            </plugin>
        </plugins>
    </build>


Helloworld project vừa tạo mặc định ta có hai phần để chứa các java code đó là src/mail/java để chứa các logic code và src/test/java để chứa các kịch bản Unit test.

Ta hãy xem lớp App.java trong src/mail/java, bạn có thể tự do phát triển và coding tùy ý ở đây.
package com.iamvtn.maven.helloworld;
public class App 
{
    public static void main( String[] args )
    {
        System.out.println( "Hello World!" );
    }
}

Đáng chú ý là lớp AppTest, ở đây bạn có thể viết các kịch bản test case cho việc unit test, khi Maven build nó sẽ chạy qua tất cả các test case và hiện thị ra thông báo ngay khi đang build. Việc tạo Unit test cho các project là việc rất nên làm.
package com.iamvtn.maven.helloworld;

import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;

public class AppTest 
    extends TestCase
{
    /**
     * Create the test case
     *
     * @param testName name of the test case
     */
    public AppTest( String testName )
    {
        super( testName );
    }

    /**
     * @return the suite of tests being tested
     */
    public static Test suite()
    {
        return new TestSuite( AppTest.class );
    }

    /**
     * Rigourous Test :-)
     */
    public void testApp()
    {
        assertTrue( true );
    }
}



Phần 5. Làm việc với nhiều module với Maven


Như phần 1 đã nói maven có điểm mạnh với việc làm việc với nhiều module, sau đây ta sẽ tìm hiểu cách tạo các module và set các chúng sử dụng lẫn nhau (dependency) như thế nào.

Sau đây tôi sẽ tạo ra 4 module là Model, Persistence, Controller và View, nghe quen nhỉ, he he tôi sẽ tạo một Maven project theo kiến trúc MVC bigsmile.

Đầu tiên để tạo một Maven Module thì Parent project phải có kiểu packaging là pom, ta config lại packaging của helloworld project như sau:
<packaging>pom</packaging>

Sau đó click chuột phải vào helloworld project chọn New -> Maven Module cũng tương tự như tạo Maven project bạn chọn Artifact-Id là maven-archetype-quickstart rồi chọn package name ở đây tôi gõ là com.iamvtn.maven.model.domain

Sau khi Maven module được tạo ta sẽ có cấu trúc project như sau


Khi đó file pom.xml trong parent maven project sẽ thêm vào các module vừa tạo như sau:
 <modules>
  <module>model</module>
 </modules>


Tiếp theo ta sẽ tạo một domain class có tên là Hello có một thuộc tình là String sayHello
package com.iamvtn.helloworld.model.domain;

public class Hello {
 String sayHello;

 /**
  * @return the sayHello
  */
 public String getSayHello() {
  return sayHello;
 }

 /**
  * @param sayHello the sayHello to set
  */
 public void setSayHello(String sayHello) {
  this.sayHello = sayHello;
 } 
}


Tương tự ta cũng sẽ tạo lần lượt tạo thêm module Persistence Module này có tác dụng set dữ liệu cho Hello Object bên trên, để muốn dùng module Model thì trong file pom.xml của Persistence ta sẽ phải dependency đến Model module
        <dependency>
            <groupId>com.iamvtn.maven</groupId>
            <artifactId>model</artifactId>
            <version>1.0</version>
        </dependency>

trong Persistence ta sẽ defince ra một Interface là HelloDao và một class implements là HelloDaoImpl

HelloDao
package com.iamvtn.maven.persistence.dao;

import com.iamvtn.maven.model.domain.Hello;

public interface HelloDao {
 public Hello sayHello ();
}

HelloDaoImpl
package com.iamvtn.maven.persistence.dao.impl;

import com.iamvtn.maven.model.domain.Hello;
import com.iamvtn.maven.persistence.dao.HelloDao;

public class HelloDaoImpl implements HelloDao {

 public Hello sayHello() {
  Hello hello = new Hello();
  hello.setSayHello("Hello");
  return hello;
 }
}


Tương tự ta cũng tạo ra Maven module là Controller, thằng Controller này sử dụng đến lớp Persistence và Model thì trong pom.xml của Controller ta cũng phải khai báo các dependency sau:
        
        <dependency>
            <groupId>com.iamvtn.maven</groupId>
            <artifactId>model</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>com.iamvtn.maven</groupId>
            <artifactId>persistence</artifactId>
            <version>1.0</version>
        </dependency>


Trong Controller tôi cũng định nghĩa ra một Interface HelloLogicvà một Class implements HelloLogicImpl để thực hiện gọi đến Persistence và lấy ra dữ liệu của sayHello như sau:
HelloLogic:
package com.iamvtn.maven.controller.logic;

public interface HelloLogic {
 public String sayHello();
}

HelloLogicImpl
package com.iamvtn.maven.controller.logic.impl;

import com.iamvtn.maven.controller.logic.HelloLogic;
import com.iamvtn.maven.model.domain.Hello;
import com.iamvtn.maven.persistence.dao.HelloDao;
import com.iamvtn.maven.persistence.dao.impl.HelloDaoImpl;

public class HelloLogicImpl implements HelloLogic {

 public String sayHello() {
  Hello hello = new Hello();
  HelloDao helloDao = new HelloDaoImpl();
  hello = helloDao.sayHello();
  String sayHello = hello.getSayHello();
  return sayHello;
 }

}


Cuối cùng ta tạo một Maven module là View, module này sẽ gọi đến Controller để hiện thị ra sayHello
tương tự ta cũng config trong file pom.xml dependency đến Controller
        <dependency>
            <groupId>com.iamvtn.maven</groupId>
            <artifactId>controller</artifactId>
            <version>1.0</version>
        </dependency>

Và cuối cùng ta sẽ thực hiện gọi đến Controller
package com.iamvtn.maven.view;

import com.iamvtn.maven.controller.logic.HelloLogic;
import com.iamvtn.maven.controller.logic.impl.HelloLogicImpl;

/**
 * Hello world!
 *
 */
public class App 
{
    public static void main( String[] args )
    {
     HelloLogic helloLogic = new HelloLogicImpl();
     String sayHello = helloLogic.sayHello();
        System.out.println( sayHello );
    }
}


Phù thế là bạn đã thực hiện tạo ra được một Maven project có nhiều các module con hoạt động theo mô hình MVC rồi đấy.

Giờ bạn có thể build project maven và tùy ý sử dụng được rồi.
Có hai cách build một là bạn dùng Eclipse bằng cách click chuột phải vào project rồi chọn Run as -> Maven install



Hoặc sử dụng command line bằng cách gõ lệnh mvn instal



Xem full mã nguồn tại đây: http://files.myopera.com/caffeJava/Code/helloworldmaven.zip

Vừa rồi tôi đã hướng dẫn bạn tìm hiểu cơ bản về Maven, đến đây chỉ mới là cào vào bề mặt của maven, Maven đang chờ bạn khám phá và chia sẻ tiếp đó.

Không có nhận xét nào:

Đăng nhận xét

Học lập trình web căn bản với PHP

Bài 1: Các kiến thức căn bản Part 1:  https://jimmyvan88.blogspot.com/2012/05/can-ban-lap-trinh-web-voi-php-bai-1-cac.html Part 2:  https://...