Ai đó có thể cho tôi biết sự khác biệt giữa Ant và Maven không? Tôi cũng chưa bao giờ sử dụng. Tôi hiểu rằng chúng được sử dụng để tự động hóa việc xây dựng các dự án Java, nhưng tôi không biết bắt đầu từ đâu.
Ai đó có thể cho tôi biết sự khác biệt giữa Ant và Maven không? Tôi cũng chưa bao giờ sử dụng. Tôi hiểu rằng chúng được sử dụng để tự động hóa việc xây dựng các dự án Java, nhưng tôi không biết bắt đầu từ đâu.
Câu trả lời:
Trong Maven: The Definitive Guide , tôi đã viết về sự khác biệt giữa Maven và Ant trong phần giới thiệu, tiêu đề của phần là "Sự khác biệt giữa Ant và Maven" . Đây là một câu trả lời là sự kết hợp của thông tin trong phần giới thiệu đó với một số ghi chú bổ sung.
Một so sánh đơn giản
Tôi chỉ cho bạn thấy điều này để minh họa ý tưởng rằng, ở cấp độ cơ bản nhất, Maven có các quy ước tích hợp. Đây là một tệp xây dựng Ant đơn giản:
<project name="my-project" default="dist" basedir=".">
<description>
simple example build file
</description>
<!-- set global properties for this build -->
<property name="src" location="src/main/java"/>
<property name="build" location="target/classes"/>
<property name="dist" location="target"/>
<target name="init">
<!-- Create the time stamp -->
<tstamp/>
<!-- Create the build directory structure used by compile -->
<mkdir dir="${build}"/>
</target>
<target name="compile" depends="init"
description="compile the source " >
<!-- Compile the java code from ${src} into ${build} -->
<javac srcdir="${src}" destdir="${build}"/>
</target>
<target name="dist" depends="compile"
description="generate the distribution" >
<!-- Create the distribution directory -->
<mkdir dir="${dist}/lib"/>
<!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file
-->
<jar jarfile="${dist}/lib/MyProject-${DSTAMP}.jar" basedir="${build}"/>
</target>
<target name="clean"
description="clean up" >
<!-- Delete the ${build} and ${dist} directory trees -->
<delete dir="${build}"/>
<delete dir="${dist}"/>
</target>
</project>
Trong ví dụ Ant đơn giản này, bạn có thể thấy bạn phải nói với Ant chính xác những gì cần làm. Có một mục tiêu biên dịch bao gồm tác vụ javac biên dịch nguồn trong thư mục src / main / java vào thư mục đích / lớp. Bạn phải cho Ant biết chính xác nguồn của bạn ở đâu, nơi bạn muốn mã byte kết quả được lưu trữ và cách đóng gói tất cả vào một tệp JAR. Mặc dù có một số phát triển gần đây giúp Ant ít thủ tục hơn, nhưng trải nghiệm của nhà phát triển với Ant là mã hóa một ngôn ngữ thủ tục được viết bằng XML.
Đối chiếu ví dụ Ant trước với ví dụ Maven. Trong Maven, để tạo tệp JAR từ một số nguồn Java, tất cả những gì bạn cần làm là tạo một tệp pom.xml đơn giản, đặt mã nguồn của bạn vào $ {Dựair} / src / main / java và sau đó chạy cài đặt mvn từ dòng lệnh . Ví dụ Maven pom.xml đạt được kết quả tương tự.
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>org.sonatype.mavenbook</groupId>
<artifactId>my-project</artifactId>
<version>1.0</version>
</project>
Đó là tất cả những gì bạn cần trong tệp pom.xml của bạn. Chạy mvn install từ dòng lệnh sẽ xử lý tài nguyên, biên dịch nguồn, thực hiện kiểm tra đơn vị, tạo JAR và cài đặt JAR trong kho lưu trữ cục bộ để sử dụng lại trong các dự án khác. Nếu không sửa đổi, bạn có thể chạy trang mvn và sau đó tìm tệp index.html trong mục tiêu / trang có chứa liên kết đến JavaDoc và một vài báo cáo về mã nguồn của bạn.
Phải thừa nhận rằng đây là dự án ví dụ đơn giản nhất có thể. Một dự án chỉ chứa mã nguồn và tạo ra JAR. Một dự án tuân theo các quy ước của Maven và không yêu cầu bất kỳ sự phụ thuộc hoặc tùy chỉnh nào. Nếu chúng tôi muốn bắt đầu tùy chỉnh hành vi, pom.xml của chúng tôi sẽ tăng kích thước và trong các dự án lớn nhất, bạn có thể thấy các bộ sưu tập Maven POM rất phức tạp chứa rất nhiều khai báo tùy chỉnh và phụ thuộc plugin. Nhưng, ngay cả khi các tệp POM của dự án của bạn trở nên quan trọng hơn, chúng vẫn giữ một loại thông tin hoàn toàn khác với tệp xây dựng của một dự án có kích thước tương tự bằng Ant. Các Maven POM chứa các khai báo: "Đây là một dự án JAR" và "Mã nguồn nằm trong src / main / java". Các tệp xây dựng Ant chứa các hướng dẫn rõ ràng: "Đây là dự án", "src/main/java
"," Chạy javac
theo thư mục này "," Đặt kết quả vào target/classses
"," Tạo JAR từ .... ", v.v ... Trong trường hợp Ant phải nói rõ về quy trình, có một cái gì đó" tích hợp "với Maven chỉ cần biết mã nguồn ở đâu và nên xử lý nó như thế nào.
So sánh cấp cao
Sự khác biệt giữa Ant và Maven trong ví dụ này? Con kiến...
Maven ở đâu ...
mvn install
. Lệnh này đã bảo Maven thực hiện một loạt các bước tuần tự cho đến khi nó đạt đến vòng đời. Là một tác dụng phụ của hành trình này trong suốt vòng đời, Maven đã thực hiện một số mục tiêu plugin mặc định đã thực hiện những việc như biên dịch và tạo JAR.Còn Ivy thì sao?
Phải, vì vậy một người như Steve Loughran sẽ đọc sự so sánh đó và gọi là hôi. Anh ta sẽ nói về cách câu trả lời hoàn toàn bỏ qua một thứ gọi là Ivy và thực tế là Ant có thể tái sử dụng logic xây dựng trong các bản phát hành gần đây của Ant. Đây là sự thật. Nếu bạn có một nhóm người thông minh sử dụng Ant + antlibs + Ivy, bạn sẽ kết thúc với một bản dựng được thiết kế tốt hoạt động. Mặc dù, tôi rất tin rằng Maven có ý nghĩa, tôi vui vẻ sử dụng Ant + Ivy với một nhóm dự án có một kỹ sư xây dựng rất sắc sảo. Điều đó đã được nói, tôi thực sự nghĩ rằng bạn sẽ bỏ lỡ một số plugin có giá trị như plugin Jetty và cuối cùng bạn sẽ thực hiện một loạt công việc mà bạn không cần phải làm theo thời gian.
Quan trọng hơn Maven so với Ant
Maven là một Framework, Ant là một Toolbox
Maven là một chiếc xe đường được chế tạo sẵn, trong khi Ant là một bộ phụ tùng xe hơi. Với Ant bạn phải tự chế tạo chiếc xe của mình, nhưng ít nhất nếu bạn cần thực hiện bất kỳ việc lái xe địa hình nào, bạn có thể chế tạo đúng loại xe.
Nói cách khác, Maven là một khung trong khi Ant là một hộp công cụ. Nếu bạn hài lòng với việc làm việc trong giới hạn của khung thì Maven sẽ làm tốt. Vấn đề đối với tôi là tôi đã va vào giới hạn của khung và nó sẽ không cho phép tôi ra ngoài.
Độ dài của XML
tobrien là một chàng trai biết rất nhiều về Maven và tôi nghĩ anh ta đã cung cấp một so sánh rất trung thực, tốt đẹp về hai sản phẩm. Anh ta đã so sánh một tệp paven Maven đơn giản với tệp xây dựng Ant đơn giản và anh ta đã đề cập đến cách các dự án Maven có thể trở nên phức tạp hơn. Tôi nghĩ rằng đáng để xem qua so sánh một vài tệp mà bạn có thể thấy trong một dự án thực tế đơn giản. Các tệp bên dưới đại diện cho một mô-đun duy nhất trong bản dựng đa mô-đun.
Đầu tiên, tệp Maven:
<project
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-4_0_0.xsd">
<parent>
<groupId>com.mycompany</groupId>
<artifactId>app-parent</artifactId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>persist</artifactId>
<name>Persistence Layer</name>
<dependencies>
<dependency>
<groupId>com.mycompany</groupId>
<artifactId>common</artifactId>
<scope>compile</scope>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.mycompany</groupId>
<artifactId>domain</artifactId>
<scope>provided</scope>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate</artifactId>
<version>${hibernate.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>${commons-lang.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
<version>${spring.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.dbunit</groupId>
<artifactId>dbunit</artifactId>
<version>2.2.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>${testng.version}</version>
<scope>test</scope>
<classifier>jdk15</classifier>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>${commons-dbcp.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc</artifactId>
<version>${oracle-jdbc.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.easymock</groupId>
<artifactId>easymock</artifactId>
<version>${easymock.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Và tệp Ant tương đương:
<project name="persist" >
<import file="../build/common-build.xml" />
<path id="compile.classpath.main">
<pathelement location="${common.jar}" />
<pathelement location="${domain.jar}" />
<pathelement location="${hibernate.jar}" />
<pathelement location="${commons-lang.jar}" />
<pathelement location="${spring.jar}" />
</path>
<path id="compile.classpath.test">
<pathelement location="${classes.dir.main}" />
<pathelement location="${testng.jar}" />
<pathelement location="${dbunit.jar}" />
<pathelement location="${easymock.jar}" />
<pathelement location="${commons-dbcp.jar}" />
<pathelement location="${oracle-jdbc.jar}" />
<path refid="compile.classpath.main" />
</path>
<path id="runtime.classpath.test">
<pathelement location="${classes.dir.test}" />
<path refid="compile.classpath.test" />
</path>
</project>
tobrien đã sử dụng ví dụ của mình để chỉ ra rằng Maven có các quy ước tích hợp nhưng điều đó không nhất thiết có nghĩa là bạn kết thúc việc viết ít XML hơn. Tôi đã tìm thấy điều ngược lại là đúng. Pom.xml dài hơn 3 lần so với build.xml và điều đó không đi lạc khỏi các quy ước. Trong thực tế, ví dụ Maven của tôi được hiển thị mà không cần thêm 54 dòng được yêu cầu để định cấu hình bổ trợ. Pom.xml đó là một dự án đơn giản. XML thực sự bắt đầu tăng trưởng đáng kể khi bạn bắt đầu thêm các yêu cầu bổ sung, điều này không nằm ngoài dự đoán của nhiều dự án.
Nhưng bạn phải nói với Ant phải làm gì
Tất nhiên ví dụ Ant của tôi ở trên không hoàn thành. Chúng ta vẫn phải xác định các mục tiêu được sử dụng để dọn dẹp, biên dịch, kiểm tra, v.v. Những mục tiêu này được xác định trong một tệp xây dựng chung được nhập bởi tất cả các mô-đun trong dự án đa mô-đun. Điều này dẫn tôi đến điểm về cách tất cả những thứ này phải được viết rõ ràng bằng Ant trong khi nó được khai báo trong Maven.
Đó là sự thật, nó sẽ giúp tôi tiết kiệm thời gian nếu tôi không phải viết rõ ràng các mục tiêu Ant này. Nhưng bao nhiêu thời gian? Tệp xây dựng phổ biến tôi sử dụng bây giờ là tệp mà tôi đã viết 5 năm trước chỉ với các tinh chỉnh nhỏ kể từ đó. Sau 2 năm thử nghiệm với Maven, tôi đã rút tập tin Ant cũ ra khỏi tủ, lau sạch nó và đưa nó trở lại hoạt động. Đối với tôi, chi phí phải nói rõ ràng với Ant những việc cần làm đã tăng thêm chưa đầy một tuần trong khoảng thời gian 5 năm.
Phức tạp
Sự khác biệt lớn tiếp theo tôi muốn đề cập đến là sự phức tạp và hiệu ứng trong thế giới thực. Maven được xây dựng với mục đích giảm khối lượng công việc của các nhà phát triển được giao nhiệm vụ tạo và quản lý các quy trình xây dựng. Để làm điều này nó phải phức tạp. Thật không may rằng sự phức tạp có xu hướng phủ nhận mục tiêu dự định của họ.
Khi được so sánh với Ant, anh chàng xây dựng trong dự án Maven sẽ dành nhiều thời gian hơn:
Ngược lại:
Quen thuộc
Một sự khác biệt nữa là sự quen thuộc. Các nhà phát triển mới luôn đòi hỏi thời gian để đạt được tốc độ. Sự quen thuộc với các sản phẩm hiện có giúp ích trong vấn đề đó và những người ủng hộ Maven tuyên bố đúng rằng đây là lợi ích của Maven. Tất nhiên, tính linh hoạt của Ant có nghĩa là bạn có thể tạo bất kỳ quy ước nào bạn muốn. Vì vậy, quy ước tôi sử dụng là đặt các tệp nguồn của mình vào một tên thư mục src / main / java. Các lớp biên dịch của tôi đi vào một thư mục có tên đích / lớp. Nghe có vẻ không quen.
Tôi thích cấu trúc thư mục được sử dụng bởi Maven. Tôi nghĩ rằng nó có ý nghĩa. Ngoài ra vòng đời xây dựng của họ. Vì vậy, tôi sử dụng các quy ước tương tự trong các bản dựng Ant của tôi. Không chỉ vì nó có ý nghĩa mà bởi vì nó sẽ quen thuộc với bất kỳ ai đã sử dụng Maven trước đây.
pom.xml
s, tôi tạo hầu hết chúng thông qua XSLT.
Ant chủ yếu là một công cụ xây dựng.
Maven là một công cụ quản lý dự án và phụ thuộc (tất nhiên cũng xây dựng dự án của bạn).
Ant + Ivy là một sự kết hợp khá tốt nếu bạn muốn tránh Maven.
Chỉ để liệt kê một số khác biệt:
Cập nhật:
Điều này đến từ Maven: The Definitive Guide . Xin lỗi, tôi hoàn toàn quên trích dẫn nó.
Maven hay kiến? là một câu hỏi rất giống với câu hỏi này, nó sẽ giúp bạn trả lời câu hỏi của bạn.
Maven là gì? trên trang web chính thức.
chỉnh sửa: Đối với dự án mới / greenfield, tôi khuyên bạn nên sử dụng Maven: "quy ước về cấu hình" sẽ giúp bạn tiết kiệm rất nhiều thời gian để viết và thiết lập các tập lệnh xây dựng và triển khai. Khi bạn sử dụng ant, tập lệnh xây dựng có xu hướng phát triển theo thời gian và độ phức tạp. Đối với các dự án hiện tại, có thể khó đưa cấu hình / bố cục của chúng vào hệ thống Maven.
Maven hoạt động như cả một công cụ quản lý phụ thuộc - nó có thể được sử dụng để truy xuất các tệp từ kho lưu trữ trung tâm hoặc từ kho lưu trữ mà bạn thiết lập - và như một công cụ xây dựng khai báo. Sự khác biệt giữa công cụ xây dựng "khai báo" và công cụ truyền thống hơn như ant hoặc make là bạn định cấu hình những gì cần hoàn thành, chứ không phải cách nó được thực hiện. Ví dụ, bạn có thể nói trong tập lệnh maven rằng dự án nên được đóng gói dưới dạng tệp WAR và maven biết cách xử lý điều đó.
Maven dựa trên các quy ước về cách các thư mục dự án được đặt ra để đạt được "tính khử". Ví dụ, nó có một quy ước về nơi đặt mã chính của bạn, nơi đặt tệp web.xml, kiểm tra đơn vị của bạn, v.v., nhưng cũng cung cấp khả năng thay đổi chúng nếu bạn cần.
Bạn cũng nên nhớ rằng có một plugin để chạy các lệnh ant từ bên trong maven:
http://maven.apache.org/plugins/maven-ant-plugin/
Ngoài ra, các nguyên mẫu của maven giúp bắt đầu với một dự án thực sự nhanh chóng. Ví dụ, có một kiểu mẫu Wicket, cung cấp lệnh maven mà bạn chạy để có được một dự án kiểu thế giới xin chào toàn bộ, sẵn sàng để chạy.
Tôi có thể đưa một người chưa bao giờ nhìn thấy Ant - build.xml
đó là những bài được viết khá hợp lý - và họ có thể hiểu chuyện gì đang xảy ra. Tôi có thể lấy cùng một người đó và cho họ xem Maven POM và họ sẽ không biết chuyện gì đang xảy ra.
Trong một tổ chức kỹ thuật rất lớn, mọi người viết về các tệp Ant trở nên lớn và không thể quản lý được. Tôi đã viết những loại đó và làm sạch các tập lệnh Ant. Đó thực sự là sự hiểu biết trước những gì bạn cần làm trong tương lai và thiết kế một bộ các mẫu có thể đáp ứng với sự thay đổi và mở rộng trong khoảng thời gian hơn 3 năm.
Trừ khi bạn có một dự án đơn giản, học các quy ước Maven và cách Maven về việc hoàn thành công việc là một công việc khá nhiều.
Vào cuối ngày, bạn không thể coi khởi động dự án với Ant hoặc Maven là một yếu tố: đó thực sự là tổng chi phí sở hữu. Những gì nó cần cho tổ chức để duy trì và mở rộng hệ thống xây dựng của mình trong một vài năm là một trong những yếu tố chính phải được xem xét.
Các khía cạnh quan trọng nhất của một hệ thống xây dựng là quản lý phụ thuộc và linh hoạt trong việc thể hiện công thức xây dựng. Nó phải có phần trực quan khi được thực hiện tốt.
Tôi muốn nói rằng nó phụ thuộc vào quy mô dự án của bạn ... Cá nhân tôi sẽ sử dụng Maven cho các dự án đơn giản cần biên dịch, đóng gói và triển khai đơn giản. Ngay khi bạn cần thực hiện một số điều phức tạp hơn (nhiều phụ thuộc, tạo tệp ánh xạ ...), tôi sẽ chuyển sang Ant ...
Maven cũng chứa một kho lưu trữ lớn các dự án nguồn mở thường được sử dụng. Trong quá trình xây dựng, Maven có thể tải xuống các phụ thuộc này cho bạn (cũng như các phụ thuộc phụ thuộc của bạn :)) để làm cho phần này của việc xây dựng một dự án dễ quản lý hơn một chút.