12/08/2018, 14:22

Cơ Bản Về Apache Maven

Apache maven khởi đầu như một cố gắng để đơn giản hóa quy trình build cho dự án Apache Jakarta Alexandria bây giờ đã không còn tồn tại và sau đó Maven trở thành một tiêu chí trong các dự án Apache Turbine, khi đó nó dùng để thay thế các hệ thống yếu được xây dựng bởi Apache ANT. Do tiềm năng to ...

Apache maven khởi đầu như một cố gắng để đơn giản hóa quy trình build cho dự án Apache Jakarta Alexandria bây giờ đã không còn tồn tại và sau đó Maven trở thành một tiêu chí trong các dự án Apache Turbine, khi đó nó dùng để thay thế các hệ thống yếu được xây dựng bởi Apache ANT.

Do tiềm năng to lớn và hiệu quả của Maven trong việc giải quyết những thách thức chính ngày nay chúng ta phải đối mặt. nó chở nên rất phổ biến và được sử dụng rộng rãi không chỉ bởi những developer mà còn những người khác bao gồm Scum master, Product owners và Project manager.

Trong những năm gần đây, Maven nổi lên như một phần nhân lực quan trọng cho việc phát trieenr phần mềm.

Trong website chính thức http://maven.apache.org/ . Các tiêu chí của Apache maven được liệt kê như sau:

  • Tạo ra một quy trình build dễ dàng.

  • Cung cấp một hệ thống build chuẩn.

  • Cung cấp thông tin project chất lượng.

  • Cung cấp hướng dẫn tốt nhất cho việc thực hiện phát triển.

  • Cho phép chuyển đổi tới những tính năng mới.

Trong bài giới thiệu lần này mình sẽ cơ bản đi qua các mục như sau:

  • Cài đặt maven.

  • Xác nhận việc cài đặt Maven.

  • Tạo mới một dự án Maven.

  • Compiling và Testing một project.

  • Hiểu về Project Object Model.

  • Hiểu về vòng đời Build.

  • Hiểu về build profile.

1. Cài đặt maven.

Ở đây mình sẽ hướng dẫn cài đặt Maven trên Mac.

Một yêu cầu cần thiết khi làm việc với Maven là đảm bảo JDK (Java Develop Kit) đã có sẵn trên hệ thống để kiểm tra Java đã được cài đặt chưa bạn sử dụng lệnh.

java -version
java version "1.8.0_65"
Java(TM) SE Runtime Environment (build 1.8.0_65-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.65-b01, mixed mode)

Nếu như chưa cài đặt JDK bạn có thể down load tại http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html. Sau khi đảm bảo JDK được cài đặt, bạn down load maven tại http://maven.apache.org/download.cgi sau đó bạn có thể giải nén ví dụ ở đây mình sẽ giải nén vào thư mục /usr/local/maven.

Bước tiếp theo bạn thêm các lệnh để export các biến môi trường PATH and M2_HOME trong file .bash_profile để edit file này bạn sử dụng vim hoặc bất kỳ trình editor khác ví dụ ở đây mình sử dụng vim: vim ~/.bash_profile sau đó bạn thêm hai dòng này ở cuối file và lưu lại những gì thay đổi

export M2_HOME=/usr/local/maven
export PATH=${PATH}:${M2_HOME}/bin

Ngoài ra nếu như bạn không muốn thêm các biến môi trường này vào trong file bash_profile bạn có thể đơn giản sự dụng lệnh ln để tạo liên kết

ln -s /usr/local/maven/bin/mvn /usr/local/bin/mvn

2. Xác nhận cài đặt maven.

Bạn đã cài đặt Maven trên hệ thống hoặc bạn nghĩ nghĩ rằng nó đã được cài đặt trước khi bạn sử dụng Maven việc cài đặt cũng như đảm bảo Maven trên hệ thống thì việc verify là cần thiết để thực hiện công việc đó chúng ta sử dụng lệnh sau:

mvn -version

Nếu như Maven được cài đặt chính xác bạn sẽ thấy một vài thông tin tương tự như sau:

Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-10T23:41:47+07:00)
Maven home: /usr/local/share/apache-maven-3.3.9
Java version: 1.8.0_65, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "mac os x", version: "10.12.1", arch: "x86_64", family: "mac"

Nếu hệ thống của bạn không tìm thấy lệnh mvn phải đảm bảo chắc chắn rằng các biến môi trường PATH và M2_HOME được thiết lập đúng.

3. Tạo mới một dự án maven.

Sau khi thực hiện các công việc cài đặt và xác nhận Maven bây giờ bạn có sử dụng Maven để tạo một dự án.

Để tạo một dự án Apache Maven có nhiều chỉ định hơn chúng ta sẽ sử dụng Batchfile rchetype:generate goal để tạo một dự án Maven Java.

Sử dụng lệnh sau trong terminal:

$ mvn archetype:generate

Nếu như đây là lần đâu tiên bạn chạy lệnh này thì bạn sẽ thấy việc download dependency diễn ra.

Sau đó bạn sẽ thấy một danh sách lớn các archetype mỗi archetype sẽ có một số, tên và một mô tả ngắn để giải thích về chúng.

 ….
904: remote -> org.apache.maven.archetypes:maven-archetype-portlet (An archetype which contains a sample JSR-268 Portlet.)
905: remote -> org.apache.maven.archetypes:maven-archetype-profiles (-)
906: remote -> org.apache.maven.archetypes:maven-archetype-quickstart (An archetype which contains a sample Maven project.)
907: remote -> org.apache.maven.archetypes:maven-archetype-site (An archetype which contains
…..
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 906:

Bạn sẽ được yêu cầu lựa chọn số của archetype ví dụ ở đây là 906, tiếp tục bạn sẽ lựa chọn phiên bản của archetype thông thường phiên bản mới nhất sẽ là phiên bản ổn định nhất.

Choose org.apache.maven.archetypes:maven-archetype-quickstart version:
1: 1.0-alpha-1
2: 1.0-alpha-2
3: 1.0-alpha-3
4: 1.0-alpha-4
5: 1.0
6: 1.1

Tiếp tục bạn được nhập các thông tin cần thiết cho dự án như groupId, artifactId, version và package

  • groupId được sử dụng để chỉ định thứ bậc location của dự án ví dụ như net.example.maven. GroupId thông thường là pakage root của hệ thống và có thể chia sẻ thông qua các dự án trong cùng một organization khi bạn sử dụng module hóa trong maven.
  • artifactId là một định danh cho dự án của bạn và version ở đây sẽ được hiểu như là phiên bản của dự án, artifactId sẽ được sử dụng khi các artifact được deploy trong các repositories và được sử dụng như những dependencies cho những dự án khác

Sau khi thực hiện xong sẽ hiện ra thông tin build thành công như sau:

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

Đây là những thứ Maven đã tạo cho chúng ta:

├── pom.xml
└── src
    ├── main
    │   └── java
    │       └── net
    │           └── example
    │               └── maven
    │                   └── App.java
    └── test
        └── java
            └── net
                └── example
                    └── maven
                        └── AppTest.java

11 directories, 3 files

Maven tạo ra một folder cho dự án trong đó chứa file chính pom.xml và một folder source chứa các thư mục con cho application và các thư mục cho test. Maven sẽ tạo ra cấu trúc thư mục tương tự cấu trúc package mà chúng ta đã khai báo cũng như cũng có một file application ví dụ cũng như file test với một unit test case.

4. Compilling và Testing một dự án.

Bạn di chuyển tới thư mục dự án có chứa file pom.xml và sau đó chạy lệnh:

mvn compile

Apache Maven sẽ bắt đầu tải những thư viện, nếu như nó không có sẵn trong repository trên máy bạn nằm ở thư mục ~/.m2.

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

Nếu terminal hiển thị BUILD SUCCESS nó có nghĩa rằng Maven đã hoàn thành quá biên dịch cũng như build của project.

Test Driven Development (TDD) là hình thức phổ biển và được ủng hộ bởi những người người phát triển tốt trong lĩnh vực công nghiệp phần mềm. Maven cũng ghi nhận điều này Testing là một phần mặc định trong build lifecicle của Maven điều này giúp tạo TDD dễ dàng hơn khi muốn áp dụng vào trong quá trình phát triển của dự án.

Mặc định quy ước trong một Maven Project nó sẽ chưa một thư mục là src/test chứa toàn bộ các code để test. Chạy lệnh bên dưới để thực hiện công việc test.

mvn test

Đây là một câu lệnh sẽ để chạy toàn bộ các test case trong các file nằm ở thư mục src/test khi hoàn thành sẽ hiện ra một báo cáo tương tự như này trong terminal.

-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running net.example.maven.AppTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.004 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 5.562 s
[INFO] Finished at: 2016-12-10T21:25:12+07:00
[INFO] Final Memory: 13M/110M
[INFO] ------------------------------------------------------------------------

Khi chúng ta sử dụng lệnh mvn compile sẽ sử dụng Java compiler liên quan tới dự án, mặc định nó được thiết lập là JDK 1.5, nhưng bạn có thể chỉnh sửa chúng trong file pom.xml, ví dụ ở đây chúng ta sẽ chỉnh sửa lên JDK 1.8

<build>
   <finalName>spring-social-exam</finalName>
   <plugins>
       <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-compiler-plugin</artifactId>
           <version>3.5.1</version>
           <configuration>
               <source>1.8</source>
               <target>1.8</target>
           </configuration>
       </plugin>
   </plugins>
</build>

Code đã được biên dịch nằm trong thư mục target. Thư mục target cũng sẽ chứa artifact đã được biên dịch ( ví dụ ở đây là một file jar tương ứng với một Java project) cùng với đó sẽ là các thư mục dành cho các class cũng như test đã được biên dịch thành file có đuôi class, ngoài ra thư mục target cũng sẽ chứa file pom.properties cùng với các file report test cũng như các file tạm.

.
├── TestCreateApp-1.0-SNAPSHOT.jar
├── classes
│   └── net
│       └── example
│           └── maven
│               └── App.class
├── maven-archiver
│   └── pom.properties
├── maven-status
│   └── maven-compiler-plugin
│       ├── compile
│       │   └── default-compile
│       │       ├── createdFiles.lst
│       │       └── inputFiles.lst
│       └── testCompile
│           └── default-testCompile
│               ├── createdFiles.lst
│               └── inputFiles.lst
├── surefire-reports
│   ├── TEST-net.example.maven.AppTest.xml
│   └── net.example.maven.AppTest.txt
└── test-classes
    └── net
        └── example
            └── maven
                └── AppTest.class

5. Hiểu về Project Object Model

Mọi dự án Maven đều chứa một file pom.xml đây là file thể hiện của project và nó chứa toàn bộ thông tin của project.

File pom.xml bao gồm cấu hình dự án, chi tiết về hệ thống tracking lỗi, tổ chức, licenses, dependencies và nhiều thứ khác.

Cấu trúc thông thường của file pom.xml được mô tả như sau:

<project ... >
     <modelVersion>4.0.0</modelVersion>
      
     <groupId>...</groupId>
     <artifactId>...</artifactId>
     <version>...</version>
     <packaging>...</packaging>
     <dependencies>...</dependencies>
     <parent>...</parent>
     <dependencyManagement>...</dependencyManagement>
     <modules>...</modules>
     <properties>...</properties>

      
     <build>...</build>
     <reporting>...</reporting>

      
     <name>...</name>
     <description>...</description>
     <url>...</url>
     <inceptionYear>...</inceptionYear>
     <licenses>...</licenses>
     <organization>...</organization>
     <developers>...</developers>
     <contributors>...</contributors>

      
     <issueManagement>...</issueManagement>
     <ciManagement>...</ciManagement>
     <mailingLists>...</mailingLists>
     <scm>...</scm>
     <prerequisites>...</prerequisites>
     <repositories>...</repositories>
     <pluginRepositories>...</pluginRepositories>
     <distributionManagement>...</distributionManagement>
     <profiles>...</profiles>
</project>

Trong một file pom tối thiểu cần phải chứa các thẻ groupId, artifactId, và version

Như phần hiển thị bên trên POM sẽ có ba phần chính

  • The Basic: đây là phần chứa những cài đặt cơ bản nhất như quản lý dependency, chi tiết về việc kế thừa, ngoài ra nó cũng chứa định nghĩa các module hay các property sử dụng trong file POM.

  • Build settings : đây là phần chứa chi tiết các build của bạn.

  • Eviroment: đây là phần chứa các thông tin liên quan tới môi trường bao gồm chi tiết các phiên bản đang được quản lý, isse manegement, continuous integration, mailing lists, vv...

6. Hiểu về vòng đời Build.

Vòng đời build định nghĩa rõ ràng các quy trình của việc building, testing, tổ chức một artifact và nó cũng là trái tim của mọi dự án Maven.

Có ba lifcycle được xây dựng: default, clean, và site.

Default lifecycle

Đây là vòng đời sử lý việc biên dịch, kiểm thử, và deployment nó chứa tất cả 20 giai đoạn build, dưới đây là các giai đoạn chính

  • Validate: xác nhận tất cả các thông tin của dự án là hợp lệ và chính xác.

  • Compile: biên dịch source code.

  • Test: chạy các unit test với một framework phù hợp.

  • Package: đóng gói các code đã được biên dịch và tổ chức các code đó đúng định dạng ví dụ như file jar hoặc file war đã cấu hình bên trong file pom.

  • Integration-test: thực hiện kiểm thử trong môi trường integration-test.

  • Verify: thực hiện kiểm tra việc đóng gói đã chính xác hay chưa.

  • Install: cài đặt các gói trong local repository.

  • Deploy: cài đặt package ở đây có thể là các file jar hoặc war lên một remote repository

Bất kì khi nào bạn thực hiện một giai đoạn build, tất cả các giai đoạn buil trước đó sẽ được thực hiện theo trình tự. Do vậy, khi thực hiện mvn integration-test sẽ thực hiện các giai đoạn trước đó như validate, compile, test và pakage trước khi thực hiện giai đoạn integration-test.

Clean lifecycle

Clean lifecycle sẽ thực hiện làm sạch project và chứa các giai đoạn build sau:

  • Pre-clean: thực hiện yêu cầu trước khi làm sạch dự án.

  • Clean: xóa tất cả các file liên quan tới các lần build trước đó.

  • Post-clean: thực hiện yêu cầu khi hoàn thành việc làm sạch dự án.

Site lifecycle Site lifecycle sẽ thực hiện việc tạo và triển khai theo document site của project.

  • Pre-site: thực hiện các process được yêu cầu trước khi việc tạo site.

  • Site: tạo documen site của dự án.

  • Post-site: thực hiện các prosess yêu cầu trược khi kết thúc việc tạo và chuẩn bị site cho việc triển khai.

  • Site-deploy: triểm khai document site lên một web server chỉ định.

7. Hiểu về build profiles.

Các dự án Maven thường khá di động, Tất cả đều được cấu hình trong POM, tránh tất cả những ảnh hưởng từ các file hệ thống cũng như độc lập mở rộng trên local repository để lưu trữ những metadata được yêu cầu.

Tuy nhiên, đây là điều không thể một vài các trường hợp cấu hình cần tham chiếu tới các file hệ thống là điều không thể tránh được. Đối với các trường hợp này Maven gới thiệu đến khái niệm build profiles.

Build profiles các chỉ định trong POM và có thể trigger được và khi được yêu cầu. một số cách trigger profile:

  • Explicit command-line trigger.

  • Maven settings trigger.

  • Enviroment specific trigger.

Explicit command-line trigger.

Các profile có thể trigger thông qua command line sử dụng tùy chon -P . danh sách các profile được cách nhau bởi dấu phẩy, chúng nên nằm sau tùy chọn -P:

mvn install -P profile-1,profile-2

Trong trường hợp này chỉ những profile được chỉ định trong command line sẽ được kích hoạt và tất các profile khác sẽ không hoạt động trong lúc build.

Chúng ta cũng có thể nghịch đảo các profile. Bạn có thể chỉ định những profile nào không được kích hoạt thông qua comman line sau:

mvn install -P !profile-1,!profile-2

Maven settings trigger

Profile cũng có thể được trigger dựa trên môi trường build hiện tại. Môi trường để kích hoạt profile được định nghĩa trực tiếp trong POM profile declarations.

<profiles>
     <profile>
       <activation>
         <property>
           <name>environment</name>
           <value>dev</value>
         </property>
       </activation>
     </profile>
</profiles>

với ví dụ trên profile chỉ được kích hoạt trong môi trường dev. Một lệnh maven điển hình để chỉ định môi trường như sau:

mvn groupId:artifactId:goal -Denvironment=dev

Vừa rồi mình đã giới thiệu cơ bản về Apache maven trong phần tiếp theo mình sẽ giới thiệu những kỹ thuật cơ bản sử dụng trong một dự án Maven.

0