Ant vs Maven vs Gradle

Ant Vs Maven Vs Gradle



Trong quá trình phát triển phần mềm, các nhà phát triển phải xây dựng lại cùng một đoạn mã nhiều lần. Họ thường cố gắng sử dụng các tập lệnh bash hoặc các ngôn ngữ kịch bản khác để tự động hóa tác vụ. Tuy nhiên, có sẵn các công cụ xây dựng thích hợp hơn để tự động hóa quá trình xây dựng. Các công cụ xây dựng chủ yếu là:

Chúng ta hãy điều tra các công cụ để tìm hiểu thêm.







Apache Ant với Ivy

Apache Ant là một công cụ dòng lệnh dựa trên Java sử dụng các tệp XML để xác định các tập lệnh xây dựng. Nó chủ yếu được sử dụng cho các bản dựng Java nhưng nó cũng có thể được sử dụng để phát triển C / C ++. Các tác vụ tích hợp cung cấp các cách để biên dịch, lắp ráp, kiểm tra và chạy các ứng dụng phần mềm. Người dùng cũng có thể tạo antlibs của riêng mình để nâng cao chức năng của Ant. Apache Ivy là một công cụ quản lý phụ thuộc tích hợp dễ dàng với Ant để cung cấp một hệ sinh thái mạnh mẽ hơn. Sự phát triển của Ant bắt đầu vào năm 2000.



Ưu điểm



  • Kiểm soát tốt hơn quá trình xây dựng tổng thể
  • Đủ linh hoạt để làm việc với bất kỳ quy trình làm việc nào

Nhược điểm





  • Các tệp xây dựng dựa trên XML có thể phát triển lớn và không thể hiểu được
  • Rất nhiều thời gian và tài nguyên là cần thiết để duy trì các tập lệnh xây dựng
  • Khó đạt được tích hợp IDE

Ví dụ Ant with Ivy

Bạn có thể cài đặt Ant mới nhất từ ở đây . Bạn phải tải xuống zip, mở rộng và đặt thư mục bin vào đường dẫn của bạn. Bạn có thể sử dụng lệnh sau để xem Ant đã được cài đặt đúng cách hay chưa:

$ kiến-phiên bản
Apache Ant(TM)phiên bản 1.10.1 được biên dịch vào tháng 22 2017.

Khi bạn đã cài đặt Ant, bạn có thể tải xuống jar Ivy mới nhất và đặt nó vào thư mục lib bên trong thư mục Ant.



Sau khi bạn đã cài đặt Ant, hãy tạo các thư mục helloworld và helloworld / src. Bên trong thư mục src, đặt tệp helloworld.java với mã:

/ **************************

In ra 'Hello World!'

*************************** /

công cộng lớpChào thế giới{

công cộng tĩnh vô hiệuchủ chốt( Dây []args) {
Hệ thống .ngoài.println('Chào thế giới!');
}

}

Bây giờ trong thư mục helloworld, hãy tạo tệp build.xml với mã sau:

xmlns: cây thường xuân='antlib: org.apache.ivy.ant' Tên='Chào thế giới' vỡ nợ='cái lọ'>

Tên='src.dir' giá trị='src'/>
Tên='build.dir' giá trị='xây dựng'/>
Tên='class.dir' giá trị='$ {build.dir} / lớp'/>
Tên='am.dir' giá trị='$ {build.dir} / bin'/>
Tên='lib.dir' giá trị='lib' />
Tôi='lib.path.id'>
cho bạn='$ {lib.dir}' />
>

Tên='giải quyết'>
/>
>

Tên='dọn dẹp'>
cho bạn='$ {build.dir}'/>
>

Tên='biên dịch' phụ thuộc='giải quyết'>
cho bạn='$ {class.dir}'/>
srcdir='$ {src.dir}' destdir='$ {class.dir}' classpathref='lib.path.id'/>
>

Tên='cái lọ' phụ thuộc='biên dịch'>
cho bạn='$ {bin.dir}'/>
destfile='$ {bin.dir} / $ {ant.project.name} .jar' basedir='$ {class.dir}'/>
>

>

Và trong cùng một thư mục helloworld, hãy tạo tệp ivy.xml với mã sau:

phiên bản='2.0'>
tổ chức='org.apache' mô-đun='Chào thế giới'/>
>
tổ chức='junit' Tên='junit' vòng quay='4,12'/>
>
>

Cấu trúc thư mục sẽ giống như sau:

Chào thế giới
| - build.xml
| - ivy.xml
`- src
`- helloworld.java

Bây giờ bạn có thể chạy bản dựng bằng lệnh:

$con kiếncái lọ

Một bản dựng thành công sẽ cung cấp đầu ra như sau:

$ ant jar
Buildfile: /Users/zak/_work/LearnBuildScripts/LearnANT/helloworld/build.xml

giải quyết:
[ivy: truy xuất] :: Apache Ivy 2.4.0 - 20141213170938 :: http://ant.apache.org/ivy/ ::
[ivy: access] :: loading settings :: url = jar: file: / Users / zak / BuildTools / ANT / apache
-ant-1.10.1 / lib / ivy-2.4.0.jar! /org/apache/ivy/core/settings/ivysettings.xml
[ivy: truy xuất] :: giải quyết các phụ thuộc :: org.apache # helloworld; [email được bảo vệ]
MacBook-Air.local
[ivy: truy xuất] tâm sự: [mặc định]
[ivy: truy xuất] tìm thấy junit # junit; 4.12 ở nơi công cộng
[ivy: loading] đã tìm thấy org.hamcrest # hamcrest-core; 1.3 ở chế độ công khai
[ivy: truy xuất] :: báo cáo độ phân giải :: giải quyết 397ms :: tạo tác dl 15ms
-------------------------------------------------- -------------------
| | mô-đun || hiện vật |
| tâm sự | số | tìm kiếm | dwnlded | đuổi ra khỏi nhà || số | dwnlded |
-------------------------------------------------- -------------------
| mặc định | 2 | 0 | 0 | 0 || 4 | 0 |
-------------------------------------------------- -------------------
[ivy: loading] :: đang lấy :: org.apache # helloworld
[ivy: truy xuất] tâm sự: [mặc định]
[ivy: truy xuất] 0 hiện vật được sao chép, 4 hiện vật đã được truy xuất (0kB / 39ms)

biên dịch:
[mkdir] Đã tạo dir: / Users / zak / _work / LearnBuildScripts / LearnANT / helloworld / build /
các lớp học
[javac] /Users/zak/_work/LearnBuildScripts/LearnANT/helloworld/build.xml:22: cảnh báo:
'inceantruntime' chưa được đặt, mặc định là build.sysclasspath = last; đặt thành sai
cho các bản dựng có thể lặp lại
[javac] Biên dịch 1 tệp nguồn sang / Users / zak / _work / LearnBuildScripts / LearnANT /
helloworld / build / class

cái lọ:
[mkdir] Đã tạo dir: / Users / zak / _work / LearnBuildScripts / LearnANT / helloworld / build / bin
[jar] Building jar: / Users / zak / _work / LearnBuildScripts / LearnANT / helloworld / build / bin /
helloworld.jar

XÂY DỰNG THÀNH CÔNG
Tổng thời gian: 6 giây

Bạn có thể thử tệp jar như sau:

$ java -cp build / bin / helloworld.cái lọChào thế giới
Chào thế giới!

Chúng tôi đã xác định tệp jar sẽ được đặt trong thư mục build / bin. Các thư mục được tạo trong quá trình xây dựng. Lệnh ant jar gọi đích jar trong build.xml.

Maven

Maven được phát triển để giải quyết các vấn đề gặp phải với kịch bản dựa trên Ant. Nó giữ các tệp XML nhưng có một cách tiếp cận khác để tổ chức. Trong Ant, các nhà phát triển phải tạo tất cả các nhiệm vụ. Maven giảm bớt việc tạo tác vụ bằng cách triển khai các tiêu chuẩn mạnh hơn để tổ chức mã. Do đó, việc bắt đầu các dự án tiêu chuẩn trở nên dễ dàng hơn.

Nó cũng giới thiệu các bản tải xuống phụ thuộc giúp việc phát triển dễ dàng hơn. Trước khi Ivy in Ant ra đời, người dùng phải quản lý cục bộ các phụ thuộc. Maven đã áp dụng triết lý quản lý phụ thuộc trước tiên.

Tuy nhiên, các tiêu chuẩn nghiêm ngặt của Mavens gây khó khăn cho việc viết các kịch bản xây dựng tùy chỉnh. Công cụ này rất dễ làm việc miễn là dự án tuân theo các tiêu chuẩn nghiêm ngặt.

Ưu điểm

  • Tải xuống phụ thuộc tự động
  • Tất cả các phần phụ thuộc được tự động ghi lại trong kiểm soát nguồn như một phần của tập lệnh Maven
  • Chuẩn hóa và đơn giản hóa quá trình xây dựng
  • Dễ dàng tích hợp với IDE và hệ thống CI / CD

Nhược điểm

  • Không linh hoạt trong việc tạo quy trình công việc tùy chỉnh
  • Đường cong học tập sâu sắc và quá trình này rất khó hiểu đối với những người mới làm quen
  • Tốn thời gian để giải quyết các vấn đề xây dựng và tích hợp thư viện mới
  • Không tốt với nhiều phiên bản của cùng một phụ thuộc

Ví dụ về Maven

Bạn có thể tải xuống Maven mới nhất từ ở đây . Bạn có thể kiểm tra cài đặt như sau:

$ mvn - phiên bản
Apache Maven 3.5.2(138edd61fd100ec658bfa2d307c43b76940a5d7d; 2017.-10-18T00:58:13-07: 00)
Trang chủ của Maven: /Users/zak/BuildTools/Maven/apache-maven-3.5.2
Phiên bản Java: 1.8.0_74, nhà cung cấp: Oracle Corporation
Trang chủ Java: /Library/Java/JavaVirtualMachines/jdk1.8.0_74.jdk/ Nội dung / Trang chủ / jre
Ngôn ngữ mặc định: en_US, mã hóa nền tảng: UTF-số 8
Tên hệ điều hành:'mac os x', phiên bản:'10 .11.6', vòm:'x86_64', gia đình:'mac'

Tạo một thư mục helloworld và tạo một dự án bằng lệnh sau:

$ mvn archetype: create -DgroupId = com.Tên công ty.Chào thế giới-DartifactId = helloworld
-DarchetypeArtifactId = maven-archetype-quickstart -DinteractiveMode =sai

Nó sẽ tạo cấu trúc thư mục và tạo đầu ra giống như sau:

[INFO] Đang quét các dự án ...
[THÔNG TIN]
[THÔNG TIN] ----------------------------------------------- -------------------------
[INFO] Building Maven Stub Project (No POM) 1
[THÔNG TIN] ----------------------------------------------- -------------------------
[THÔNG TIN]
[INFO] >>> maven-archetype-plugin: 3.0.0: create (default-cli)> create-sources
@ standalone-pom >>>
[THÔNG TIN]
[THÔNG TIN]<<< maven-archetype-plugin:3.0.0:generate (default-cli) < generate-sources
@ standalone-pom<<<
[THÔNG TIN]
[THÔNG TIN]
[INFO] --- maven-archetype-plugin: 3.0.0: create (default-cli) @ standalone-pom ---
[INFO] Tạo dự án ở chế độ hàng loạt
[THÔNG TIN] ----------------------------------------------- -----------------------------
[INFO] Sử dụng các tham số sau để tạo dự án từ Kiểu mẫu cũ (1.x):
maven-archetype-quickstart: 1.0
[THÔNG TIN] ----------------------------------------------- -----------------------------
[INFO] Tham số: basedir, Giá trị: / Users / zak / _work / LearnBuildScripts / LearnMaven
[INFO] Tham số: gói, Giá trị: com.companyname.helloworld
[INFO] Tham số: groupId, Giá trị: com.companyname.helloworld
[INFO] Tham số: ArtieId, Giá trị: helloworld
[INFO] Tham số: packageName, Value: com.companyname.helloworld
[INFO] Thông số: phiên bản, Giá trị: 1.0-SNAPSHOT
[INFO] dự án được tạo từ Kiểu mẫu cũ (1.x) trong dir: / Users / zak / _work /
LearnBuildScripts / LearnMaven / helloworld
[THÔNG TIN] ----------------------------------------------- -------------------------
[INFO] XÂY DỰNG THÀNH CÔNG
[THÔNG TIN] ----------------------------------------------- -------------------------
[INFO] Tổng thời gian: 8.602 giây
[INFO] Kết thúc lúc: 2018-01-27T00: 05: 37-08: 00
[INFO] Bộ nhớ cuối cùng: 15 triệu / 152 triệu
[THÔNG TIN] ----------------------------------------------- -------------------------

Cấu trúc thư mục sẽ giống như sau:

Chào thế giới
|- pom.xml
``- src
|-- chủ chốt
| ``-java
| ``-- với
| ``-- Tên công ty
| ``-- Chào thế giới
| ``- App.java
``-kiểm tra
``-java
``-- với
``-- Tên công ty
``-- Chào thế giới
``- AppTest.java

Pom.xml chứa các cấu hình bản dựng. Bên trong pom.xml, mã trông như thế này:

xmlns='http://maven.apache.org/POM/4.0.0' xmlns: xsi='http://www.w3.org/2001/
XMLSchema-instance '
xsi: schemaLocation='http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0
_0.xsd '>
>4.0.0>
>com.companyname.helloworld>
>Chào thế giới>
>cái lọ>
>1.0-SNAPSHOT>
>Chào thế giới>
>http://maven.apache.org>
>
>
>junit>
>junit>
>3.8.1>
>kiểm tra>
>
>
>

Bạn có thể tạo tệp jar bằng lệnh sau:

gói $ mvn

[INFO] Đang quét các dự án ...
[THÔNG TIN]
[THÔNG TIN] ----------------------------------------------- -------------------------
[INFO] Building helloworld 1.0-SNAPSHOT
[THÔNG TIN] ----------------------------------------------- -------------------------
[THÔNG TIN]
[INFO] --- maven-resources-plugin: 2.6: resources (default-resources) @ helloworld ---
[CẢNH BÁO] Sử dụng mã hóa nền tảng (thực tế là UTF-8) để sao chép các tài nguyên đã lọc, tức là
xây dựng phụ thuộc vào nền tảng!
[INFO] bỏ qua tài nguyên không hiện cóDirectory / Users / zak / _work / LearnBuildScripts / LearnMaven /
helloworld / src / main / resources
[THÔNG TIN]
[INFO] --- maven-compiler-plugin: 3.1: compile (default-compile) @ helloworld ---
[INFO] Đã phát hiện các thay đổi - biên dịch lại mô-đun!
[CẢNH BÁO] Mã hóa tệp chưa được đặt, sử dụng mã hóa nền tảng UTF-8, tức là phiên bản mới là
phụ thuộc vào nền tảng!
[INFO] Biên dịch 1 tệp nguồn sang / Users / zak / _work / LearnBuildScripts / LearnMaven /
helloworld / target / class
[THÔNG TIN]
[INFO] --- maven-resources-plugin: 2.6: testResources (default-testResources) @
Chào thế giới ---
[CẢNH BÁO] Sử dụng mã hóa nền tảng (thực tế là UTF-8) để sao chép các tài nguyên đã lọc, tức là
xây dựng phụ thuộc vào nền tảng!
[INFO] bỏ qua tài nguyên không hiện cóDirectory / Users / zak / _work / LearnBuildScripts / LearnMaven /
helloworld / src / test / resources
[THÔNG TIN]
[INFO] --- maven-compiler-plugin: 3.1: testCompile (default-testCompile) @ helloworld ---
[INFO] Đã phát hiện các thay đổi - biên dịch lại mô-đun!
[CẢNH BÁO] Mã hóa tệp chưa được đặt, sử dụng mã hóa nền tảng UTF-8, tức là phiên bản mới là
phụ thuộc vào nền tảng!
[INFO] Biên dịch 1 tệp nguồn sang / Users / zak / _work / LearnBuildScripts / LearnMaven
/ helloworld / target / test-class
[THÔNG TIN]
[INFO] --- maven-surefire-plugin: 2.12.4: test (default-test) @ helloworld ---
[INFO] Thư mục báo cáo Surefire: / Users / zak / _work / LearnBuildScripts / LearnMaven
/ helloworld / target /
báo cáo chắc chắn

-------------------------------------------------- -----
T E S T S
-------------------------------------------------- -----
Chạy com.companyname.helloworld.AppTest
Kiểm tra chạy: 1, Thất bại: 0, Lỗi: 0, Bỏ qua: 0, Thời gian trôi qua: 0,014 giây

Kết quả :

Kiểm tra chạy: 1, Thất bại: 0, Lỗi: 0, Bỏ qua: 0

[THÔNG TIN]
[INFO] --- maven-jar-plugin: 2.4: jar (default-jar) @ helloworld ---
[INFO] Building jar: / Users / zak / _work / LearnBuildScripts / LearnMaven / helloworld / target /
helloworld-1.0-SNAPSHOT.jar
[THÔNG TIN] ----------------------------------------------- -------------------------
[INFO] XÂY DỰNG THÀNH CÔNG
[THÔNG TIN] ----------------------------------------------- -------------------------
[INFO] Tổng thời gian: 5.624 giây
[INFO] Kết thúc lúc: 2018-01-27T00: 11: 10-08: 00
[INFO] Bộ nhớ cuối cùng: 16M / 114M
[THÔNG TIN] ----------------------------------------------- -------------------------

Bạn có thể chạy tệp jar như sau:

$ java -cp target / helloworld-1,0-SNAPSHOT.cái lọvới.Tên công ty.Chào thế giới.Ứng dụng
Chào thế giới!

Tập tin jar được đưa vào thư mục đích.

Gradle

Gradle kết hợp sức mạnh của Ant và Maven. Phiên bản đầu tiên của Gradle được phát hành vào năm 2012. Nó đã được chấp nhận nhanh chóng. Google hiện đang sử dụng nó cho hệ điều hành Android.

Thay vì XML, Gradle sử dụng ngôn ngữ Groovy. Do đó, các tập lệnh xây dựng trong Gradle dễ viết và dễ đọc hơn. Ban đầu nó sử dụng Ivy để quản lý sự phụ thuộc, nhưng bây giờ nó đang sử dụng công cụ phụ thuộc của riêng mình.

Ưu điểm

  • Cung cấp tiêu chuẩn hóa trong khi vẫn linh hoạt
  • Dễ dàng đọc và viết các kịch bản xây dựng
  • Xử lý tốt hơn nhiều phiên bản phụ thuộc
  • Có thể xử lý nhiều ngôn ngữ lập trình và công nghệ
  • Cộng đồng tích cực giúp phát triển công cụ
  • Gradle DSL (Ngôn ngữ dành riêng cho miền) làm cho cấu trúc cấu hình đơn giản
  • Gradle cung cấp các cải tiến hiệu suất bằng cách sử dụng tăng dần, xây dựng bộ nhớ cache và Gradle Daemon

Nhược điểm

  • Tích hợp IDE không tốt như Maven

Ví dụ Gradle

Bạn có thể cài đặt Gradle từ ở đây . Sau khi thiết lập Gradle trong đường dẫn của mình, bạn có thể kiểm tra nó bằng cách:

$ gradle--phiên bản

-------------------------------------------------- ----------
Gradle4,5
-------------------------------------------------- ----------

Thời gian xây dựng:2018-01-24 17: 04:52UTC
Bản sửa đổi: 77d0ec90636f43669dc794ca17ef80dd65457bec

Groovy: 2.4.12
Ant: Apache Ant(TM)phiên bản 1.9.9 được biên dịch vào tháng 22 2017.
JVM: 1.8.0_74(Tập đoàn Oracle25,74-b02)
Hệ điều hành: Mac OS X 10.11.6 x86_64

Tiếp theo, tạo cấu trúc thư mục sau:

Chào thế giới
| -xây dựng.gradle
``-src
| -chủ chốt
``-java
``-Chào thế giới
``-Chào thế giới.java

Đối với helloworld.java đặt mã từ ví dụ Ant. Và đối với build.gradle, hãy đặt mã sau:

áp dụng plugin: 'java'

phiên bản= '1.0'

kho lưu trữ{
mavenCentral()
}

sự phụ thuộc{
testCompile nhóm: 'junit', Tên: 'junit', phiên bản: '4,12'
}

Bạn có thể sử dụng lệnh gradle task –all để xem tất cả các lệnh có sẵn. Gradle tự động chọn các plugin mà bạn chỉ định trong tệp build.gradle và hiển thị cho bạn các tác vụ bổ sung có sẵn do các plugin.

Bạn có thể tải bản dựng bằng cách chạy:

$ gradle jar

XÂY DỰNG THÀNH CÔNG trong 1s
2nhiệm vụ có thể hành động:2Thực thi

Bạn có thể chạy jar của mình như thế này:

$ java -cp build / libs / helloworld-1,0.cái lọChào thế giới
Chào thế giới!

Tệp jar được đặt trong thư mục build / libs.

Phần kết luận

Trong số các công cụ xây dựng, Ant có thể hữu ích cho các dự án nhỏ hơn trong khi Maven tốt hơn để đảm bảo tất cả các nhà phát triển tuân theo các quy tắc giống nhau. Gradle là công cụ mới nhất cung cấp tính linh hoạt nhất.

Người giới thiệu: