Bộ sưu tập

Giới thiệu về Apache Maven


https://codersontrang.com/2014/08/30/gioi-thieu-ve-apache-maven/

Tư duy khi phân tích và thiết kế một ứng dụng phần mềm đó là có thể tách một hệ thống lớn thành các thành phần nhỏ. Với tư duy như vậy ta có thể nôm na định nghĩa ràng một ứng dụng phần mềm sẽ là sự tổng hợp của các thành phần (component) lại với nhau. Các thành phần ở đây thường được thể hiện ra là các thư viện cung cấp cho người lập trình viên các công cụ lập để việc lập trình trở nên dễ dàng hơn. Nói như vậy một ứng dụng có thể phụ thuộc (depend) vào nhiều thành phần mà bản thân mỗi thành phần đó lại phụ thuộc vào các thành phần khác. Việc quản lý sự phụ thuộc giữa các thành phần này thực sự là không dễ dàng và nó sẽ trở nên phức tạp hơn khi mà ứng dụng càng ngày càng lớn ra. Để có thể giải quyết vấn đề này, Apache Maven được ra đời.

Apache Maven là không chỉ dừng lại ở mức độ là một build tool bình thường mà quan trọng hơn nó là một dependency manager cung cấp cho người lập trình viên có thể khai báo và quản lý sự phụ thuộc giữa các thành phần trong bản thân các ứng dụng phần mềm. Bài viết này sẽ giới thiệu về Apache Maven và các đặc điểm cơ bản đặc trưng của nó.

I. Cài đặt Apache Maven

1. Vào trang chủ của Maven và vào mục download, sau đó chọn bản Maven tương ứng với hệ điều hành (Window, Linux). Bài viết này sẽ hướng dẫn cách cài đặt Maven trên Window, bạn hãy down file .zip về sau đó giải nén ra như thư mục dưới đây

codersontrang_intro_maven_1

2. Đặt biến môi trường M2_HOME trỏ đến thư mục và ta vừa extract ở trên, sau đó thêm vào biến Path đoạn %M2_HOME%\bin

codersontrang_intro_maven_2

3. Để biết được đã cài đặt thành công hay chưa, ta vào command line của window và gõ mvn -version. Nếu đã cài đặt thành công thì sẽ như dưới đây

codersontrang_intro_maven_3

II. Cấu trúc project được hỗ trợ bởi Maven

Maven là một buil tool và để đóng gói một ứng dụng thì Maven yêu cầu ứng dụng phải có cấu trúc mà Maven có thể hiểu được. Bản thân Maven cung cấp nhiều các kiểu cấu cấu trúc ứng dụng mà ta có thể chọn lựa cho phù hợp với dụ án của mình. Để tạo ra một ứng dụng có cấu trúc của Maven thì ta có thể làm như sau

1. Dùng command line gõ mvn archetype:generate một loạt các cấu trúc dự án mẫu sẽ được hiển thị ra với số tương ứng như sau

codersontrang_intro_maven_4

2. Sau đó Maven sẽ hỏi về kiểu cấu trúc dự án mà bạn muốn tạo ra, bạn chỉ cần chọn ở danh sách bên trên và nhập số tương ứng. Trong trường hợp không nhập gì và thì Maven sẽ tự động tạo ra dự án có cấu trúc theo kiểu maven-archetype-quickstart

codersontrang_intro_maven_5

3. Mỗi một kiểu cấu trúc dự án có thể có nhiều version, ở đây ta sẽ chọn tiếp version 1.1. Mỗi một dự án trong Maven sẽ được nhận diện gồm 3 thành phần groupId, artifactIdversion, ngoài ra còn có thêm thông tin về package. Điền đủ các thông tin trên và sau đó xác nhận để tạo project

codersontrang_intro_maven_6

4. Sau khi tạo thành công ta sẽ thấy project được tạo ra trong thư mục như hình dưới đây:

codersontrang_intro_maven_7

codersontrang_intro_maven_8

III. Tìm hiểu file pom.xml

Như ta đã thấy trong hình trên, trong project được sinh ra có một file pom.xml. POM là viết tắt của “Project Object Model”, đây là nơi chứa các khai báo mô tả về project mà quan trọng hơn cả là khai báo các thành phần mà project phụ thuộc vào. Các khai báo được thể hiện dưới dạng các thẻ XML bên trong thẻ <project>. Sau đâu là một số các thẻ cơ bản mà ta có thể thấy trong bất cứ file pom.xml nào

  • <groupId>, <artifactId>, <version>: bộ ba thông tin để nhận diện ra một thành phần.
  • <packaging>: Định dạng khi đóng gói của thành phần, có thể là jar, war, ear …
  • <properties>: là nơi khai báo các thuộc tính có thể sử dụng ở các nơi trong file pom.xml. Ví dụ ta khai báo thuộc tính <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>, thì ở một nào đó trong pom.xml, ta có thể sử dụng giá trị UTF-8 bằng cách gọi ${project.build.sourceEncoding}
  • <dependency>: Bên trong sẽ khai báo thành phần mà project sẽ phụ thuộc vào. Ví dụ project có sử dụng JUnit để thực hiện unit test, thì việc project phụ thuộc vào junit sẽ được khai báo như sau
 <dependency>  
    <groupId>junit</groupId>  
    <artifactId>junit</artifactId>  
    <version>3.8.1</version>  
    <scope>test</scope>  
  </dependency>  

IV. Cấu trúc của repository trong Maven

Maven quản lý các thành phần và lưu chúng ở trong repository. Khi build một project, các thành phần mà project phụ thuộc vào sẽ được lấy ra từ local repository trên máy đang thực hiện quá trình build. Nếu như thành phần (thư viện) không được tìm thấy trên local repository thì Maven sẽ tự động download thành phần này từ remote repository về local repository. Vị trí của local repository mặc định sẽ là ${user.home}/.m2/repository, ta hoàn toàn có thể thay đổi vị trí này bằng cách cấu hình trong file /conf/settings.xml như sau:

<localRepository>E:/DEVELOPMENT/Env/apache-maven-repo</localRepository>

Trong quá trình phát triển các ứng dụng, local repository sẽ được làm đầy dần, dưới đây là hình ảnh của một local repository với cách bố trí các thành phần bên trong nó.

codersontrang_intro_maven_9

Như đã nói ở trên, mỗi thành phần sẽ được nhận diện bởi bộ ba <groupId>, <artifactId>, <version>, và cấu trúc phân tầng của repository cũng dựa trên thứ tự này. Ví dụ đối với bộ thư viện guava.jar của Google có thông tin như sau:

<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>13.0.1</version>

Với thông tin trên thì bộ thư viện này được bố trí trong repository như sau

codersontrang_intro_maven_10

Nhìn trên hình trên ta thấy

  • GroupId sẽ được chuyển thành các thư mục ví dụ groupIdcom.google.guava vậy tính từ thư mục repository, thư mục con sẽ là com/google/guava
  • ArtifactId sẽ tiếp tục được chuyển thành một thư mục con bên trong, với artifactIdguava vậy đường dẫn sẽ trở thành com/google/guava/guava
  • Version sẽ cũng được chuyển thành một thư mục con bên trong nữa, với version13.0.1, đường dẫn đến file thư viện sẽ là com/google/guava/guava/13.0.1

Bên trong thư mục con nhất này sẽ là file thư viện guava-13.0.1.jar, tên của file thư viện sẽ là sự ghép lại của artifactIdversion.

Ngoài file thư viện ra ta còn có file guava-13.0.1.pom là file POM mô tả cho thư viện tương ứng bao gồm các thông tin về thư viện này và các thành phần khác mà thư viện này phụ thuộc vào.

V. Plugin trong Maven

Như ở trên ta đã có nói đến câu lệnh mvn archetype:generate, đây là cách sử dụng một Maven plugin có tên là archetype. Maven có rất nhiều plugin và mỗi plunin sẽ được sử dụng vào trong các mục đích khác nhau. Plugin sẽ là một tập hợp của các Goal, mỗi goal sẽ quy định một công việc cụ thể sẽ được thực hiện bởi plugin. Trong ví dụ của chúng ta, ta gọi plugin archetype với goal là generate để sinh ra project với cấu trúc định nghĩa sẵn bởi Maven. Một số plugin phổ biến có thể kể tên ra ở đây như là clean, install, surefire, jar, war, pmd, ant, assembly, dependency

Maven không chỉ là một build tool mà quan trọng hơn còn là một dependency manager. Dependency manager làm đơn giản hóa quá trình quản lý sự phụ thuộc giữa các thành phần trong một ứng dụng, và điều này có ý nghĩa quan trọng trong việc phát triển phần mềm. Bài viết nêu ra tổng quan về một số khía cạnh nên tập trung quan tâm khi tìm hiểu về Maven với hy vọng bạn đọc có thể có được hướng tiếp cận nhanh hơn khi làm quen với Maven. Sẽ còn có nhiều bài viết nữa nói về Maven hoặc có liên quan đến việc sử dụng Maven trong thời gian tới.

Good luck!

Advertisements

5 comments on “Giới thiệu về Apache Maven

  1. Pingback: Tinh gọn Java code với Lombok | Coder Sơn Trang

  2. Pingback: Một cách nhìn khác về ứng dụng web với Spring MVC, Spring Boot, Tomcat dạng nhúng và Thymeleaf | Coder Sơn Trang

  3. Pingback: Đóng gói ứng dụng Java với Maven plugin | Coder Sơn Trang

  4. Pingback: Giới thiệu về NodeJS | Coder Sơn Trang

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất /  Thay đổi )

Google photo

Bạn đang bình luận bằng tài khoản Google Đăng xuất /  Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất /  Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất /  Thay đổi )

Connecting to %s