Hai sự lựa chọn

Để quản lý source code và build một dự án #Java thông thường chúng ta sẽ sử dụng một trong 2 công cụ phổ biến nhất hiện nay đó là #Maven và #Gradle, vậy thì nên dùng cái nào hơn? Theo quan điểm của mình thì bạn đã quen cái nào, thì hãy dùng cái đấy, còn nếu mới bắt đầu thì nên dùng Gradle, vì sao vậy?

Maven

Maven đã được #Apache tạo ra từ năm 2004 và ở thời điểm đó nó thực sự nổi trội hơn #ant hay #ivy nên mình đã lựa chọn #Maven. Với cú pháp #xml dễ hiểu, khả năng quản lý phiên bản source code và các dependency cực tốt đã giải phóng bản thân mình khỏi việc download file jar và cấu hình classpath trong #Eclipse, mà khổ cái là các file #jar nó phụ thuộc lẫn nhau nên cứ phải chạy lên để biết cái nào đang thiếu để download nên việc setup project thực sự là công việc phức tạp. Các plugin và các build lifecycle cũng giúp mình có thêm nhiều lựa chọn để làm điều mình muốn với source code của mình, ví dụ mình gen code từ #xml chẳng hạn, mọi việc rất dễ dàng. Một điểm rất mạnh nữa của maven đó chính là Maven Archetype, nó giúp mình định nghĩa được các project mẫu, từ đó giúp được cho hàng nghìn hàng triệu lập trình viên tiết kiệm được rất nhiều thời gian khởi tạo dự án. Bạn có thể tìm hiểu thêm về maven archetype qua bài viết này nhé.

Gradle

Gradle thì sao nhỉ? 3 năm trở lại đây mình có làm quen với Gradle, và mình thực sự ấn tượng với việc mình có thể tự do tạo ra các task mà mình muốn, đó là thứ mà ngôn ngữ xml và Maven chưa làm được. Nó kiểu thế này:

abstract class GreetingTask extends DefaultTask {
    @TaskAction
    def greet() {
        println 'hello from GreetingTask'
    }
}
tasks.register('hello', GreetingTask)

Tuy nhiên việc phải học ngôn ngữ #groovy để cấu hình file build.gradle cũng không dễ chịu lắm, mà không hiểu sao mỉnh rất ghét việc phải nhìn thấy cái file #gradle-wrapper.jar trong project. Ngoài ra 1 điểm trừ nữa là gradle có rất nhiều phiên bản, khi sử dụng phải đọc tài liệu để xem các dự án đang dùng phiên bản nào để setup project trên máy mình, có hôm cũng stress vô cùng về vụ này. Nhưng nói gì thì nói, việc sử dụng 1 ngôn ngữ scripting giúp chúng ta có nhiều lựa chọn để cấu hình, và mình rất thích thú với việc có thể sử dụng vòng lặp hay lệnh rẽ nhánh, thứ mà xml rất khó làm được

Bảng so sánh

# Tiêu chí Maven Gradle
1 Ra đời Sớm hơn Muộn hơn
2 Ngôn ngữ XML Groovy, Kotlin
3 Hỗ trợ (mạnh nhất) Java Java, Kotlin, Android
4 Coding convention Checkstyle Checkstyle, ktlint, kapt
5 Project Template Archetype Chưa thấy có chính thức
6 Custom, tạo mới task Rất khó hoặc không hỗ trợ Dễ dàng thực hiện
7 Suggest code cấu hình Có vì là xml (có dtd hoặc schema) Phụ thuộc vào IDE
8 Download dependency Tải tất cả dependency Mặc định chỉ tải những cái được khai báo
9 Các tiêu chí khác Cơ bản như nhau Cơ bản như nhau

Kết luận

Vậy thì dùng cái gì bây giờ, với mình thì mình dùng cả 2 cho 1 dự án để ai là fan của cái nào thì dùng cái đấy nhưng với những người mới bắt đầu mình nghĩ Gradle là phù hợp, 🙂

Tham khảo

  1. Maven
  2. Khởi tạo project maven
  3. Add Maven archetype
  4. Gradle
  5. Tạo Gradle task