0

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

1. Maven là gì?

Maven là công cụ dùng để quản lý các dependency rất phổ biến, trong java vẫn còn dùng maven rất nhiều. Ngoài việc quản lý các dependency rất tốt thì nó còn cung cấp các plugin để chúng ta thực hiện build, run chương trình, đóng gói hay deploy nó lên nexus để cho người khác dùng, rồi chạy test, .... Vậy maven là cái quái gì mà lợi hại thế, và nếu không có nó thì ta có tự làm được không?

Để biên dịch và chạy một file Main.java, ta sẽ thực hiện biên dịch file java bằng lệnh:

javac Main.java

Lệnh trên sẽ thực hiện biên dịch file mã nguồn Main.java thành file Main.class. Đây là file bytecode mà jvm có thể hiểu được
Sau đó, để chạy chương trình chúng ta sẽ dùng lệnh:

java Main

Tuy nhiên, trong thực tế chúng ta có thể có rất nhiều file, và các file này lại nằm trong các package khác nhau chứ không chỉ là một file. Ví dụ:

com
 +- chungvv
         +- MyApplication.java
         +- controller
         |   +- CustomerController.java
         |   +- OrderController.java
         +- service
         |   +- CustomerService.java
         |   +- OrderService.java
         +- repository
         |   +- OrderRepository.java
         |   +- CustomerRepository.java

Trong trường hợp này, chúng ta cần phải biên dịch rât nhiều file source code khác nhau trong rất nhiều thư mục khác nhau và cần phải giữ được cấu trúc của file source code. Để làm việc này, ta có thể dùng lệnh sau:


mkdir target # sử dụng trên ubuntu để tạo thư mục tên target
javac -d ./target ./src/main/java/com/chungvv/*.java src/main/java/com/chungvv/*/*.java

Trong đó -d target chỉ định output của các class được biên dịch sẽ nằm trong thư mục target vừa được tạo ở phía trên, 2 đoạn ./src/main/java/com/chungvv/*.java src/main/java/com/chungvv/*/*.java chỉ định tới các file java cần phải biên dịch.

Tuy nhiên, bài toán thực tế sẽ rất khó đoán, và đôi khi chúng ta lại tạo các package con trong các package service, repository (ví dụ tạo các interface trong package service, sau đó trong package con service.impl thì tạo các class implement các interface,... Lúc này ta cần chỉ định tất cả các package trong tất cả các thư mục con vào cuối để javac biết mà biên dịch -> quá là dài đúng không, ví dụ có tầm 3 cái package lồng nhau cũng đủ chết rồi :😃))

Thêm một vấn đề nữa đó là dự án thực tế sử dụng rất nhiều các dependency (các file jar khác), thế nên khi biên dịch chúng ta sẽ cần chỉ định đường dẫn tới các file này để javac biết đường mà tìm chúng nó để biên dịch, đúng không? :😃))
Ví dụ

javac -d ./target -cp ~/.m2/repository/org/springframework/boot/spring-boot/2.7.10/spring-boot-2.7.10.jar ./src/main/java/com/chungvv/*.java src/main/java/com/chungvv/*/*.java

Trong đó, -cp ~/.m2/repository/org/springframework/boot/spring-boot/2.7.10/spring-boot-2.7.10.jar chỉ ra đường dẫn tới file jar mà chúng ta sử dụng thư viện spring boot trong chương trình. Thử tưởng tượng chúng ta sử dụng tới 100 thư viện, và các thư viện này lại có phụ thuộc là các thư viện khác, như vậy chúng ta sẽ phải viết một chương trình dài tới thế nào chỉ để biên dịch :😃))

Rồi còn biết bao vấn đề khác như khi chúng ta code xong thì làm sao đóng gói lại thành file jar để cho người khác dùng, rồi làm sao để chạy file test tự động,.... Rất rất là nhiều vấn đề đau đầu đúng không, mà mỗi dự án lại cứ phải làm đi làm lại thế này thì đúng là toang. Thế nên maven ra đời. Và rõ ràng nếu không có maven thì chúng ta vẫn tự làm bằng tay được hết, nhưng làm theo cách rất thủ công và ngô nghê, dễ bị sai đúng không

2. Các khái niệm trong maven:

  • settings.xml: Có 2 file settings.xml, 1 nằm trong thư mục người dùng, được gọi là user settings, 1 nằm trong thư mục config của maven, được gọi là global settings. Có thể override trong command bằng lệnh mvn clean install -s <path/to/user/settings> với user settings và mvn clean install -gs </path/to/global/settings> đối với global settings
  • pom.xml: Mỗi thư mục được quản lý bởi maven sẽ luôn có 1 file pom nhằm mô tả về project, đối với java thì cấu trúc thư mục được tạo sẵn src/main/<langugage> và src/test/<language>

Các thông tin trong settings.xml:

  • localRepository: đường dẫn tới thư mục repository m2 của user: mặc định là ${user.home}/.m2/repository
  • interactiveMode: cũng không biết là gì, cứ để mặc định
  • offline: nếu true thì sẽ không kéo artifact từ remote về, mặc định là false
  • pluginGroups: ít dùng
  • proxies: cấu hình proxy cho maven
  • servers: cấu hình các thông tin authenticate khi cần pull/push artifact từ các repository hoặc từ scm (source code management)
  • mirrors: Chứa thông tin alternative url của các repo. Ví dụ maven central nằm ở Mỹ nhưng user ở châu Âu thì sẽ dùng mirror cho maven central cung cấp url ở châu Âu, do đó truy cập sẽ nhanh hơn
  • profiles: Có thể dùng profile để ghi đè lại các thông tin trên. Mỗi một profile có thể dùng cho một môi trường khác nhau, ví dụ cho môi trường product, staging, development,... Khi được active thì các thông tin trong profile sẽ ghi đè các thông tin trên

Các thông tin trong file pom.xml:

  • File pom có thể được kế thừa từ parent pom
  • dependencies: List các dependency. 6 scope là: runtime (implementation), compile, provided (có sẵn của jdk), test, system (file jar), import (file pom)
  • dependencyManagement: quản lý các version chứa ko load dependency
  • scm: thông tin về server scm để tạo tag và release version tự động
  • repositories: thông tin về các repository để pull artifact
  • distributionmanagement: thông tin về repository server để publish dependency lên Đó là

All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí