Những mẹo nhỏ hữu ích về Maven - tin tuc the thao trong nuoc

Maven, có nghĩa là "chuyên gia" hoặc "người am hiểu", là một dự án nguồn mở được phát triển hoàn toàn bằng Java dưới sự bảo trợ của Apache. Dựa trên khái tin tuc the thao trong nuoc niệm Mô hình Dự án (tên viết tắt: POM), Maven sử dụng một mảnh thông tin trung tâm để quản lý các quy trình xây dựng, báo cáo và tài liệu của dự án.

Maven là một công cụ quản lý dự án có khả năng xây dựng và quản lý các phụ thuộc của các dự án Java. Ngoài ra, Maven cũng có thể áp dụng cho việc xây dựng và quản lý nhiều loại dự án khác nhau, chẳng hạn như các dự án viết bằng C#, Ruby, Scala và các ngôn ngữ lập trình khác. Ban đầu, Maven là một phần con của dự án Jakarta, nhưng hiện nay đã trở thành một dự án độc lập do Quỹ Phần mềm Apache điều hành.

Trong thực tế làm việc hàng ngày, Maven đóng vai trò quan trọng như một công cụ quản lý gói. Trước đây, chúng ta thường phải tải xuống các gói thư viện và đặt chúng vào thư mục lib. Tuy nhiên, với các công cụ IDE hiện đại như IntelliJ IDEA, Maven đã được tích hợp sẵn cùng với các plugin hỗ trợ.

Các thao tác cơ bản của Maven

  • mvn -v: Hiển thị thông tin phiên bản của Maven.
  • mvn compile: Biên dịch mã nguồn Java thành các tệp class.
  • mvn test: Thực thi các trường hợp kiểm thử trong thư mục test.
  • mvn package: Đóng gói dự án thành một tệp jar.
  • mvn clean: Xóa các tệp jar được tạo trong thư mục target và chính thư mục target.
  • mvn install: Sao chép tệp jar đã đóng gói vào kho lưu trữ địa phương của Maven.
  • mvn deploy: Tải lên tệp jar đã đóng gói vào kho lưu trữ từ xa.

So sánh với Composer

Vì tôi cũng là một lập trình viên PHP, nên dễ dàng nhận thấy rằng Composer trong PHP và Maven trong Java có chức năng tương tự nhau. Một điểm chung khá thú vị giữa hai công cụ này là cả hai đều gặp vấn đề về tốc độ kết nối khi kéo dữ liệu từ kho gốc. Vì vậy, giống như Composer có các nguồn trong nước ở Trung Quốc, gần đây Alibaba cũng cung cấp một kho lưu trữ phản chiếu dành riêng cho Maven. Điều này có thể được cấu hình trong tập tin setting.xml như sau:

1<mirrors>
2  <mirror>
3    <id>aliyun</id>
4    <name>aliyun maven</name>
5    <url>https://maven.aliyun.com/repository/central</url>
6    <mirrorOf>central</mirrorOf>
7  </mirror>
8</mirrors>

Một điểm khác biệt lớn giữa Composer và Maven là cách thức xử lý gói. Vì PHP là ngôn ngữ kịch bản giải thích, các gói Composer chỉ đơn giản là các gói mã PHP và sử dụng SPL Autoload để tải các gói đó. Ngược lại, các gói Maven đã qua quá trình biên dịch và chứa các lớp class. Ngoài ra, Composer có thể trực tiếp sử dụng địa chỉ GitHub làm nguồn để kéo mã nguồn, trong khi Maven sử dụng tệp pom để quản lý các phụ thuộc.

Một số mẹo cá nhân về Maven

  • Khi Maven kéo các phụ thuộc, nó sẽ cập nhật cả các phiên bản snapshot. Để ép buộc Maven kiểm tra và cập nhật các phiên bản mới nhất, bạn có thể thêm tham số -U vào lệnh mvn compile. Nếu vẫn không hiệu quả, bạn cần xóa các phiên bản snapshot tại kho lưu trữ địa phương. Lệnh help giải thích rằng -U,–update-snapshots sẽ buộc Maven kiểm tra các phiên bản thiếu và cập nhật các snapshot từ các kho từ xa. Đây là một tính năng rất hữu ích trong quá trình làm việc hàng ngày.

  • Khi xảy ra xung đột phụ thuộc, bước đầu tiên là phân tích phụ thuộc bằng lệnh mvn dependency:tree. Nếu muốn tìm chi tiết hơn về mối liên hệ phụ thuộc của một gói cụ thể, bạn có thể sử dụng lệnh mvn dependency:tree -Dverbose -Dincludes=org.springframework:spring-webmvc. Nếu phát hiện ra xung đột, Maven ưu tiên theo thứ tự đường dẫn ngắn hơn hoặc thứ tự định nghĩa trong tệp pom. Để loại bỏ gói bị xung đột, bạn có thể sử dụng phần <exclusions> trong tệp pom:

1<exclusions>
2  <exclusion>
3    <groupId>ch.qos.logback</groupId>
4    <artifactId>logback-classic</artifactId>
5  </exclusion>
6</exclusions>
  • Quản lý phiên bản JDK mà Maven sử dụng. Lệnh mvn -v hiển thị thông tin cài đặt của Maven, bao gồm phiên bản JDK đang được sử dụng. Ví tin tức the thao bóng đá dụ:
1Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
2Maven home: /usr/local/Cellar/maven/3.6.3_1/libexec
3Java version: 1.8.0_201, vendor: Oracle Corporation, runtime: /Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/jre
4Default locale: zh_CN, platform encoding: UTF-8
5OS name: "mac os x", version: "10.14.6", arch: "x86_64", family: "mac"

Nếu bạn gặp vấn đề về phiên bản JDK, chẳng hạn như sau khi nâng cấp Gradle thông qua Homebrew, và Gradle yêu cầu JDK 13, khiến Maven sử dụng sai phiên bản JDK, dẫn đến lỗi java.lang.ExceptionInInitializerError: com.sun.tools.javac.code.TypeTags, bạn có thể giải quyết bằng cách tạo file .mavenrc và thêm các biến môi trường MAVEN_HOME và JAVA_HOME. Sau đó, thực thi lệnh source .mavenrc.

Các phương pháp khác như sửa đổi tệp pom hoặc setting.xml đôi khi không mang lại hiệu quả rõ rệt.

Hy vọng những mẹo này sẽ giúp ích cho bạn trong quá trình làm việc với Maven!