Cùng một công cụ, khác ngôn ngữ?
Maven là công cụ phân giải phụ thuộc và xây dựng phổ biến nhất cho Java, giống như NPM dành cho JS. Nhưng nó không chỉ là công cụ giống nhau cho một ngôn ngữ khác. Rõ ràng là có sự khác biệt rất lớn giữa các bản dựng Java và JS và những khác biệt này có thể nhìn thấy trực tiếp trong cách Maven hoạt động. Ví dụ: trong khi nhiều công cụ JS dựa vào Git để thực hiện một số công việc nặng nhọc, Maven hoạt động với kho lưu trữ Maven dựa trên hệ thống tệp tùy chỉnh, vì Maven có trước Git và cần xử lý các tạo tác nhị phân, điều mà trước đây Git không xử lý tốt. Trong Maven, có sự tách biệt rõ ràng giữa nguồn và mã nhị phân, trong khi chúng thường giống nhau trong thế giới JS.
Kiến thức cơ bản về Maven
Maven ở dạng thuần túy nhất tuân theo một mô hình khai báo, trong đó pom.xml
(tương tự như package.json
) xác định các thuộc tính khác nhau của bản dựng, nhưng không chứa tập lệnh. Điểm bất lợi là nó có thể là một thách thức để tinh chỉnh một số khía cạnh của bản dựng mà không sử dụng tập lệnh vì bạn phải dựa vào các plugin. Ưu điểm là có thể dễ dàng hiểu các bản dựng khác chỉ bằng cách nhìn vào pom.xml
, vì chúng thường làm theo cùng một cách tiếp cận mà không cần tùy chỉnh quá nhiều. Gradle là một công cụ dựa trên Groovy phổ biến được xây dựng dựa trên các tiêu chuẩn và quy ước của Maven, đồng thời được thiết kế đặc biệt để đơn giản hóa pom.xml
và phá vỡ rào cản "không có tập lệnh" này.
Tham chiếu đến sự phụ thuộc của bạn
Tương tự như vậy package.json
, bạn không pom.xml
trực tiếp làm việc với sự phụ thuộc của mình mà thay vào đó xác định các tọa độ phụ thuộc và để công cụ xây dựng của bạn xử lý phần còn lại. Trong Maven, dạng cơ bản của các tọa độ này là GAV (groupId, tạo tác, phiên bản).
Cây phụ thuộc phẳng?
Dựa trên các nhận xét trong câu trả lời khác, Maven cung cấp "cây phụ thuộc phẳng", không phải "cây phụ thuộc lồng nhau" mà NPM cung cấp theo mặc định. Maven không cho phép nhiều phiên bản của cùng một phụ thuộc. Nếu xảy ra trường hợp yêu cầu các phiên bản khác nhau, Maven sẽ sử dụng độ phân giải phụ thuộc để chọn một phiên bản duy nhất. Điều này có nghĩa là đôi khi các phần phụ thuộc bắc cầu của bạn sẽ nhận được phiên bản khác với phiên bản mà họ yêu cầu, nhưng có nhiều cách để quản lý điều này. Tuy nhiên, hạn chế này đến từ Java, không phải Maven, vì (thông thường) trong Java, trình nạp lớp sẽ chỉ cung cấp quyền truy cập vào một định nghĩa lớp duy nhất ngay cả khi tìm thấy nhiều định nghĩa trên classpath. Vì Java không đặc biệt giỏi trong việc xử lý điều này, Maven cố gắng tránh trường hợp này ngay từ đầu.
Lưu ý: kể từ npm v3, các phụ thuộc được làm phẳng. Sợi quản lý gói thay thế cũng làm như vậy.
Trưởng thành
Hơn nữa, Maven cũ hơn NPM đáng kể, có cơ sở người dùng lớn hơn, số lượng lớn các plugin tùy chỉnh và cho đến nay có thể được coi là đã trưởng thành hơn về tổng thể. Đôi khi Maven được sử dụng cho các dự án không phải Java hoặc thậm chí đa ngôn ngữ, vì có các plugin để xử lý các ngôn ngữ khác hoặc môi trường cụ thể, chẳng hạn như Android. Có những plugin làm cầu nối giữa Maven và các công cụ xây dựng khác, chẳng hạn như frontend-maven-plugin thực sự xử lý nhiều công cụ xây dựng JS.