Ant vs Maven vs Gradle

Bài viết này là một phần của loạt bài: • Giới thiệu về Gradle

• Ant vs Maven vs Gradle (bài viết hiện tại) • Viết plugin tùy chỉnh Gradle

• Tạo Fat Jar trong Gradle

1. Giới thiệu

Trong bài viết này, chúng ta sẽ khám phá ba công cụ tự động hóa xây dựng Java đã thống trị hệ sinh thái JVM - Ant, Maven và Gradle .

Chúng tôi sẽ giới thiệu từng người trong số họ và khám phá cách các công cụ tự động hóa xây dựng Java phát triển.

2. Kiến Apache

Ban đầu, Make là công cụ tự động hóa xây dựng duy nhất có sẵn ngoài các giải pháp cây nhà lá vườn . Make xuất hiện từ năm 1976 và do đó, nó được sử dụng để xây dựng các ứng dụng Java trong những năm đầu của Java.

Tuy nhiên, rất nhiều quy ước từ các chương trình C không phù hợp với hệ sinh thái Java, vì vậy trong thời gian Ant đã tiếp quản như một giải pháp thay thế tốt hơn.

Apache Ant (“Công cụ gọn gàng khác”) là một thư viện Java được sử dụng để tự động hóa các quy trình xây dựng cho các ứng dụng Java . Ngoài ra, Ant có thể được sử dụng để xây dựng các ứng dụng không phải Java. Ban đầu nó là một phần của cơ sở mã Apache Tomcat và được phát hành dưới dạng một dự án độc lập vào năm 2000.

Về nhiều mặt, Ant rất giống với Make, và nó đủ đơn giản để mọi người có thể bắt đầu sử dụng nó mà không cần bất kỳ điều kiện tiên quyết cụ thể nào. Các tệp xây dựng kiến ​​được viết bằng XML và theo quy ước, chúng được gọi là build.xml .

Các giai đoạn khác nhau của quá trình xây dựng được gọi là "mục tiêu".

Đây là một ví dụ về tệp build.xml cho một dự án Java đơn giản với lớp chính HelloWorld :

Tệp xây dựng này xác định bốn mục tiêu: sạch , biên dịch , jarchạy . Ví dụ: chúng ta có thể biên dịch mã bằng cách chạy:

ant compile

Điều này sẽ kích hoạt mục tiêu sạch đầu tiên sẽ xóa thư mục "lớp". Sau đó, trình biên dịch đích sẽ tạo lại thư mục và biên dịch thư mục src vào đó.

Lợi ích chính của Ant là tính linh hoạt của nó. Ant không áp đặt bất kỳ quy ước mã hóa hoặc cấu trúc dự án nào. Do đó, điều này có nghĩa là Ant yêu cầu các nhà phát triển phải tự viết tất cả các lệnh, điều này đôi khi dẫn đến các tệp xây dựng XML khổng lồ khó bảo trì.

Vì không có quy ước nào, chỉ cần biết Ant không có nghĩa là chúng ta sẽ nhanh chóng hiểu bất kỳ tệp xây dựng Ant nào. Có thể sẽ mất một thời gian để làm quen với một tệp Ant không quen thuộc, đây là một nhược điểm so với các công cụ mới hơn khác.

Lúc đầu, Ant không có hỗ trợ tích hợp để quản lý phụ thuộc. Tuy nhiên, khi quản lý phụ thuộc trở thành điều bắt buộc trong những năm sau đó, Apache Ivy đã được phát triển như một dự án con của dự án Apache Ant. Nó được tích hợp với Apache Ant và tuân theo các nguyên tắc thiết kế tương tự.

Tuy nhiên, những hạn chế ban đầu của Ant do không có hỗ trợ tích hợp để quản lý phụ thuộc và sự thất vọng khi làm việc với các tệp xây dựng XML không thể quản lý đã dẫn đến việc tạo ra Maven.

3. Apache Maven

Apache Maven là một công cụ quản lý phụ thuộc và tự động hóa xây dựng, chủ yếu được sử dụng cho các ứng dụng Java. Maven tiếp tục sử dụng các tệp XML giống như Ant nhưng theo cách dễ quản lý hơn nhiều. Tên của trò chơi ở đây là quy ước về cấu hình.

Trong khi Ant mang lại sự linh hoạt và yêu cầu mọi thứ phải được viết từ đầu, Maven dựa trên các quy ước và cung cấp các lệnh (mục tiêu) được xác định trước.

Nói một cách đơn giản, Maven cho phép chúng tôi tập trung vào những gì bản dựng của chúng tôi nên làm và cung cấp cho chúng tôi khuôn khổ để thực hiện điều đó. Một khía cạnh tích cực khác của Maven là nó cung cấp hỗ trợ tích hợp để quản lý sự phụ thuộc.

Tệp cấu hình của Maven, chứa các hướng dẫn quản lý phụ thuộc và xây dựng, theo quy ước được gọi là pom.xml . Ngoài ra, Maven cũng quy định một cấu trúc dự án chặt chẽ, trong khi Ant cũng cung cấp tính linh hoạt ở đó.

Dưới đây là ví dụ về tệp pom.xml cho cùng một dự án Java đơn giản với lớp chính HelloWorld từ trước:

 4.0.0 baeldung mavenExample 0.0.1-SNAPSHOT Maven example   junit junit 4.12 test   

Tuy nhiên, hiện nay cấu trúc dự án cũng đã được tiêu chuẩn hóa và tuân theo các quy ước của Maven:

+---src | +---main | | +---java | | | \---com | | | \---baeldung | | | \---maven | | | HelloWorld.java | | | | | \---resources | \---test | +---java | \---resources

Trái ngược với Ant, không cần phải xác định từng giai đoạn trong quá trình xây dựng theo cách thủ công. Thay vào đó, chúng ta có thể đơn giản gọi các lệnh có sẵn của Maven.

Ví dụ: chúng ta có thể biên dịch mã bằng cách chạy:

mvn compile

Về cốt lõi, như đã lưu ý trên các trang chính thức, Maven có thể được coi là một khung thực thi plugin, vì tất cả công việc được thực hiện bởi các plugin. Maven hỗ trợ một loạt các plugin có sẵn và mỗi plugin có thể được cấu hình bổ sung.

Một trong những plugin có sẵn là Apache Maven phụ thuộc Plugin trong đó có một bản sao-phụ thuộc mục tiêu đó sẽ sao chép phụ thuộc của chúng ta vào một thư mục chỉ định.

Để hiển thị plugin này hoạt động, hãy bao gồm plugin này trong tệp pom.xml của chúng tôi và định cấu hình thư mục đầu ra cho các phụ thuộc của chúng tôi:

   org.apache.maven.plugins maven-dependency-plugin   copy-dependencies package  copy-dependencies   target/dependencies       

Plugin này sẽ được thực thi trong một giai đoạn gói , vì vậy nếu chúng tôi chạy:

mvn package

Chúng tôi sẽ thực thi plugin này và sao chép các phụ thuộc vào thư mục đích / phụ thuộc.

Cũng có một bài viết hiện có về cách tạo JAR thực thi bằng các plugin Maven khác nhau. Ngoài ra, để có cái nhìn tổng quan chi tiết về Maven, hãy xem hướng dẫn cốt lõi này về Maven, nơi khám phá một số tính năng chính của Maven.

Maven trở nên rất phổ biến vì các tệp xây dựng hiện đã được chuẩn hóa và mất ít thời gian hơn đáng kể để duy trì tệp xây dựng, so với Ant. Tuy nhiên, mặc dù được tiêu chuẩn hóa hơn các tệp Ant, các tệp cấu hình Maven vẫn có xu hướng trở nên lớn và cồng kềnh.

Những quy ước nghiêm ngặt của Maven đi kèm với cái giá là kém linh hoạt hơn Ant rất nhiều. Việc tùy chỉnh mục tiêu là rất khó, vì vậy việc viết các kịch bản xây dựng tùy chỉnh khó hơn rất nhiều so với Ant.

Mặc dù Maven đã thực hiện một số cải tiến nghiêm trọng liên quan đến việc làm cho các quy trình xây dựng của ứng dụng trở nên dễ dàng hơn và chuẩn hóa hơn, nó vẫn đi kèm với một mức giá do kém linh hoạt hơn Ant rất nhiều. Điều này dẫn đến việc tạo ra Gradle kết hợp tốt nhất của cả hai thế giới - tính linh hoạt của Ant và các tính năng của Maven.

4. Gradle

Gradle là một công cụ quản lý phụ thuộc và tự động hóa xây dựng được xây dựng dựa trên các khái niệm của Ant và Maven.

Một trong những điều đầu tiên chúng ta có thể lưu ý về Gradle là nó không sử dụng các tệp XML, không giống như Ant hoặc Maven.

Theo thời gian, các nhà phát triển ngày càng quan tâm hơn đến việc có và làm việc với một ngôn ngữ dành riêng cho miền - mà nói một cách đơn giản, sẽ cho phép họ giải quyết các vấn đề trong một miền cụ thể bằng cách sử dụng ngôn ngữ được thiết kế riêng cho miền cụ thể đó.

Điều này đã được chấp nhận bởi Gradle, công ty đang sử dụng DSL dựa trên Groovy hoặc Kotlin. Điều này dẫn đến các tệp cấu hình nhỏ hơn với ít lộn xộn hơn vì ngôn ngữ được thiết kế đặc biệt để giải quyết các vấn đề miền cụ thể. Theo quy ước, tệp cấu hình của Gradle được gọi là build.gradle trong Groovy, hoặc build.gradle.kts trong Kotlin.

Lưu ý rằng Kotlin cung cấp hỗ trợ IDE tốt hơn Groovy để tự động hoàn thành và phát hiện lỗi.

Dưới đây là một ví dụ về tệp build.gradle cho cùng một dự án Java đơn giản với lớp chính HelloWorld từ trước:

apply plugin: 'java' repositories { mavenCentral() } jar { baseName = 'gradleExample' version = '0.0.1-SNAPSHOT' } dependencies { testImplementation 'junit:junit:4.12' }

Chúng tôi có thể biên dịch mã bằng cách chạy:

gradle classes

At its core, Gradle intentionally provides very little functionality. Plugins add all useful features. In our example, we were using java plugin which allows us to compile Java code and other valuable features.

Gradle gave its build steps name “tasks”, as opposed to Ant's “targets” or Maven's “phases”. With Maven, we used Apache Maven Dependency Plugin, and it's a specific goal to copy dependencies to a specified directory. With Gradle, we can do the same by using tasks:

task copyDependencies(type: Copy) { from configurations.compile into 'dependencies' }

We can run this task by executing:

gradle copyDependencies

5. Conclusion

In this article, we presented Ant, Maven, and Gradle – three Java build automation tools.

Not surprisingly, Maven holds the majority of the build tool market today.

Tuy nhiên, Gradle đã được chấp nhận tốt trong các cơ sở mã phức tạp hơn, vì những lý do sau:

  • Rất nhiều dự án mã nguồn mở như Spring hiện đang sử dụng nó
  • Nó nhanh hơn Maven trong hầu hết các tình huống, nhờ các bản dựng tăng dần của nó
  • Nó cung cấp các dịch vụ phân tích và gỡ lỗi nâng cao

Tuy nhiên, Gradle dường như có đường cong học tập dốc hơn, đặc biệt nếu bạn không quen thuộc với Groovy hoặc Kotlin.

Tiếp theo » Viết các plugin Gradle tùy chỉnh « Giới thiệu trước về Gradle