Xây dựng và quản lý dự án hiệu quả với Apache Maven

Maven là gì?

Maven là một công cụ quản lý dự án mạnh mẽ, với rất nhiều các tính năng như biên dịch project, Xây dựng và chia sẽ dependency, documentation etc. Trong thực tế maven có thể dùng để quản lý các dự án với ngôn ngữ khác không chỉ là java, thế nhưng maven được dùng nhiều hơn với các dự án java.

 Các tính năng của maven

Maven có thể thực hiện rất nhiều tác vụ giúp cho việc xây dựng và quản lý dự án hiệu quả hơn:

  • Build dự án với maven
  • Thêm các dependency, jar từ các dự án khác với maven. 
  • Cập nhật các dependency, jar từ các dự án khác khi chúng được cập nhật
  • Sử dụng maven để build các loại đầu ra như file JAR, WAR, etc.
  • Dễ dàng tích hợp các project lại với nhau.

Maven hoạt động như thế nào?

maven overview

POM File

POM viết tắt của Project Object Model, là một file dạng XML chứa các thông tin cấu hình của dự án như dependency, plugin, nơi chứa mã nguồn, goals etc được Maven sử dụng để biên dịch project. Khi bạn thực thi một lệnh trong maven, nó sẽ tiến hành đọc file POM để lấy thông tin cấu hình rồi tiến hành thực thi.

Dependency and Repository

maven-repositories

Dependency là các thư viện java bên ngoài được sử dụng cho project, còn repository là nơi lưu trữ chúng dưới dạng các tệp JAR. 

Local repository chỉ là một nơi lưu trữ các dependency trong máy tính cá nhân của chúng ta, nếu các dependency được sử dụng trong dự án không tìm thấy trong local repository thì Maven sẽ tiến hành download chúng từ kho lưu trữ trung tâm của Maven(Central Repositoty) hoặc Remote Repository vào local repository. Ở những lần sau các dependency sẽ được tìm thấy và maven sẽ không phải download chúng lại giúp cải tiến quá trình biên dịch project.

Remote Repository là kho lưu trữ trên máy chủ và Maven cũng có thể download các dependency từ đây. Remote repository thường được sử sử dụng cho các dự án nội bộ

Build LifeCycles, Phases and Goals

Một vòng đời (Build life cycle) sẽ gồm một chuỗi các giai đoạn(phase), mỗi giao đoạn sẽ bao gồm một chuỗi các mục tiêu(goal)

Build LifeCycle trong maven

Quá trình build project của maven luôn tuân theo một vòng đời cụ thể để triển khai và phân phối dự án. Chúng ta có 3 vòng đời được tích hợp sẵn trong maven:

  • default: Chịu trách nhiệm triển khai dự án
  • clean: Dọn dẹp project và xoá tất cả các file được generate ở bản build trước.
  • site: Xây dựng các tài liệu cho trang web

Mỗi vòng đời chứa một chuỗi các giai đoạn. Ví dụ default build lifecycle chứa 23 giai đoạn vì đây là vòng đời chính trong quá trình build project.

Maven phase

Một giai đoạn(phase) thể hiện 1 giai đoạn trong 1 build lifecycle của maven. Mỗi phase sẽ chịu trách nhiệm cho một công việc cụ thể. Dưới đây là một số phare quan trọng trong default build lifecycle:

  • validate: Kiểm tra tất cả các thông tin cần thiết cho qúa trình build project.
  • compile: Biên dịch mã code
  • test-compile: Biên dịch mã nguồn file test.
  • test: Chạy unit test của dự án
  • package: Biên dịch và đóng gói mã nguồn thành các file định dạng JAR, WAR etc.
  • integration-test: Chạy integration test.
  • install: Tải các package xuống local repository.
  • deploy: Sao chép package sang remote repository.

Các phase được thực hiện theo 1 thứ tự cụ thể, chúng ta có thể thực thi các phase cụ thể với lệnh comand-line:

Note: Khi một phase được thực thi, các phare phía trước nó cũng sẽ được thực thi. Ví dụ khi chúng ta thực thi phase install với comand-line: install mvn thì các phase trước nó cũng sẽ được thực hiện như validate, compile, test-compile etc.

Maven goal

Mỗi phase là một chuỗi các mục tiêu(goal), mỗi goal chịu trách nhiệm cho 1 công việc cụ thể. Khi một phase được thực thi, tất cả các goal ràng buộc với phase này sẽ được thực thi. Ví dụ như các goal sau

  • compile: complile goal từ compiler plugin được ràng buộc với complie phase.
  • install: install ràng buộc với install phase.
  • jar, war: được ràng buộc với package phase.

Build profiles

Build profile là một tập hợp các cách cấu hình khác nhau cho phép bạn build project trong các môi trường khác nhau như local environment, Production, tesing etc. 

Profile được chỉ định trong file POM thông qua các thuộc tính activeProfiles/profiles. Với mỗi môi trường khác nhau chúng ta sẽ có các giá trị cấu hình khác nhau, như với profile là local thì đường dẫn database là PC22322/EXPRESS01 chẳng hạn, còn Profile Production là https://mydatabase etc.

Build Plugin

Maven plugin là một nhóm các goal, các goal này không nhất thiết phải cùng liên kết đến một phase.

Ví dụ, sử dụng Maven FailSafe plugin để chạy integration test, cấu hình trong file pom.xml. FailSafe plugin gồm 2 goal là integration-testverify.

Download maven về máy

Maven đối với mỗi hệ điều hành có các cách khác để download, dưới đây mình chỉ liệt kê các bước chung để install Maven.

  1. Cấu hình JAVA_HOME environment variable.
  2. Tải và giải nén unzip Maven.
  3. Cấu hình M2_HOME environment variable trỏ đến thư mục lưu trữ Maven được unzip.
  4. Cấu hình M2_HOME/bin(%M2_HOME%\bin cho Windows, $M2_HOME/bin cho unix).
  5. Thêm M2 vào PATH environment variable (%M2% cho Windows, $M2 cho unix)
  6. Mở Comand line kiểm tra với lệnh mvn -version.

Nếu cài đặt thành công, sau khi chạy lệnh mvn -version comand line sẽ trông như thế này.

File POM trong Maven

POM viết tắt của Project Object Model là một chìa khoá để vận Maven vận hành.File pom.xml chứa các thông về liên quan đến project như các dependency được sử dụng, nơi lưu trữ mã nguồn, plguin, goal etc. Maven sẽ đọc các thông tin cấu hình từ pom.xml sau đó tiến hành thực thi theo các thông số trong file pom.xml.

Ví dụ một file pom.xml cơ bản

Các thành phần cơ bản trong file pom.xml mà chúng ta phải nắm sau:

  • modelVersion: Phiên bản của file POM, mỗi version của POM phù hợp với các Maven version cụ thể. POM version 4.0.0 phù hợp với Maven version 2 và 3.
  • groupId: groupId nghĩa là ID cho dự án để phân biệt với tất cả các dự án khác, groupId là duy nhất và được sử dụng như là root package. groupId còn rất hữu dụng, khi dự án của bạn là dự án mã nguồn mở, có nhiều người tham gia vào phát triển, sử dụng groupId để phân biệt với các dự án mã nguồn mở khác. Các bạn thấy groupId của mình com.project.loggerapi, nhưng hãy lưu ý rằng groupId không nhất thiết phải được ngăn cách bởi dấu . giữa các từ. Thế nhưng nếu bạn đặt được ngăn cách bởi dấu . thì Maven sẽ lưu trữ project của bạn theo cấp thư mục tương ứng với từng từ được ngăn cách, ví dụ groupdId là com.project.loggerapi thì project của bạn sẽ được đặt ở MAVEN_REPO/com/project.loggerapi.
  • artifactId: Được sử dụng để đặt tên cho dự án mà bạn đang xây dựng.
  • version: phiên bản của dự án hiện tại.
  • dependencies: Khai báo các dependency được sử dụng trong dự án.
  • dependency: Khai báo từng dependency được sử dụng trong dự án, mỗi dependency được mô tả bởi 3 thành phần: groupId, artifactId và version.

Snapshot trong maven

Snapshot là các dependency (jar file) đang trong quá trình phát triển. Thay vì chúng ta cập nhật version liên tục thì chúng ta có thể sử dụng Snapshot, đến khi có một bản hoàn chỉnh thì hẳn dùng version. Để dùng Snapshot trong Maven chúng ta chỉ cùng thêm vào sau version -SNAPSHOT. Các snapshot version cũng sẽ được cập nhật khi chúng thay đổi, Maven sẽ tìm kiếm trong Maven repository theo snapshot được chỉ định trong file pom.xml. nếu không tìm thấy thì Maven sẽ tiến hành download chúng từ kho lưu trữ Maven hoặc remote repo.

Sử dụng snapshot trong dependency như sau:

Exclude Dependency

Đôi lúc các dependency của dự án xảy ra xung đột mà chúng cần phải lựa chọn duy nhất một dependency cho dự án. Sử dụng exclude dependency để loại bỏ các dependency không muốn sử dụng.

Tóm lược

Trên đây là bài giới thiệu chung về Maven để chúng ta nắm sơ khái niệm. Maven được dùng rất nhiều trong các dự án java nhờ tính linh hoạt, tự động, cơ chế quản lý tốt.

Nguồn tham khảo

http://tutorials.jenkov.com/maven/maven-tutorial.html#what-is-a-build-tool

https://www.geeksforgeeks.org/introduction-apache-maven-build-automation-tool-java-projects/

https://www.baeldung.com/maven-goals-phases

Leave a Comment

Your email address will not be published. Required fields are marked *