Sự khác biệt giữa Ant và Maven [đóng]


180

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.


4
Vì câu trả lời bị chi phối bởi những người ủng hộ Maven, tôi muốn cân bằng nó một chút. Xem câu trả lời này để biết ví dụ stackoverflow.com/questions/1306579/ Kẻ
Petr Gladkikh

4
Mặc dù điều này không trả lời trực tiếp câu hỏi so sánh Ant với Maven, nhưng đầu vào của tôi sẽ là xem xét sử dụng Gradle, điều này có thể cho phép bạn truy cập đồng thời cả Ant và Maven. gradle.org

Câu trả lời:


218

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 javactheo 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...

  • không có các quy ước chính thức như cấu trúc thư mục dự án chung, bạn phải cho Ant biết chính xác nơi tìm nguồn và nơi đặt đầu ra. Các quy ước không chính thức đã xuất hiện theo thời gian, nhưng chúng chưa được mã hóa thành sản phẩm.
  • là thủ tục, bạn phải nói với Ant chính xác phải làm gì và khi nào nên làm. Bạn phải bảo nó biên dịch, sau đó sao chép, sau đó nén lại.
  • không có vòng đời, bạn phải xác định mục tiêu và phụ thuộc mục tiêu. Bạn phải đính kèm một chuỗi các nhiệm vụ cho từng mục tiêu theo cách thủ công.

Maven ở đâu ...

  • có quy ước, nó đã biết mã nguồn của bạn ở đâu vì bạn đã tuân theo quy ước. Nó đặt mã byte vào đích / lớp và nó tạo ra tệp JAR trong đích.
  • là khai báo. Tất cả những gì bạn phải làm là tạo một tệp pom.xml và đặt nguồn của bạn vào thư mục mặc định. Maven chăm sóc phần còn lại.
  • có vòng đời, mà bạn đã gọi khi bạn thực thi 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

  1. Có phải bạn sử dụng Trình quản lý kho lưu trữ để theo dõi các tạo phẩm phần mềm. Tôi khuyên bạn nên tải xuống Nexus . Bạn có thể sử dụng Nexus để lưu trữ từ xa proxy và để cung cấp một nơi để nhóm của bạn triển khai các tạo phẩm nội bộ.
  2. Bạn có mô đun hóa thích hợp của các thành phần phần mềm. Một thành phần nguyên khối lớn hiếm khi quy mô theo thời gian. Khi dự án của bạn phát triển, bạn sẽ muốn có khái niệm về mô-đun và mô-đun phụ. Maven cho vay theo cách tiếp cận này rất tốt.
  3. Bạn áp dụng một số quy ước cho bản dựng của bạn. Ngay cả khi bạn sử dụng Ant, bạn nên cố gắng áp dụng một số hình thức quy ước phù hợp với các dự án khác. Khi một dự án sử dụng Maven, điều đó có nghĩa là bất kỳ ai quen thuộc với Maven đều có thể chọn bản dựng và bắt đầu chạy với nó mà không cần phải cấu hình chỉ để tìm ra cách biên dịch.

1
Liên kết bị phá vỡ một lần nữa.
Thunderforge

1
Tôi sử dụng Nebeans và Ant hoạt động theo mặc định mà không có bất kỳ điều chỉnh nào (quy ước Netbeans?). Hiện đang dùng thử Maven và thấy nó dài hơn trong các bản dựng đầu tiên và liên tục sử dụng kết nối internet. Xây dựng ngoại tuyến là có thể không thể. Điều này thật khó chịu.
Zon

113

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:

  • Đọc tài liệu: Có nhiều tài liệu hơn về Maven, bởi vì có rất nhiều thứ bạn cần phải học.
  • Giáo dục các thành viên trong nhóm: Họ thấy dễ dàng hơn khi hỏi một người biết hơn là cố gắng tự tìm câu trả lời.
  • Khắc phục sự cố bản dựng: Maven kém tin cậy hơn Ant, đặc biệt là các plugin không lõi. Ngoài ra, các bản dựng Maven không thể lặp lại. Nếu bạn phụ thuộc vào phiên bản SNAPSHOT của plugin, rất có thể, bản dựng của bạn có thể bị hỏng mà bạn không thay đổi gì.
  • Viết các plugin Maven: Các plugin thường được viết với một nhiệm vụ cụ thể, ví dụ: tạo một gói webstart, điều này gây khó khăn hơn cho việc sử dụng lại chúng cho các nhiệm vụ khác hoặc kết hợp chúng để đạt được mục tiêu. Vì vậy, bạn có thể phải viết một trong những khoảng trống của riêng bạn để giải quyết các khoảng trống trong bộ plugin hiện có.

Ngược lại:

  • Ant tài liệu ngắn gọn, toàn diện và tất cả ở một nơi.
  • Kiến rất đơn giản. Một nhà phát triển mới cố gắng học Ant chỉ cần hiểu một vài khái niệm đơn giản (mục tiêu, nhiệm vụ, phụ thuộc, thuộc tính) để có thể tìm ra phần còn lại của những gì họ cần biết.
  • Kiến là đáng tin cậy. Đã không có nhiều bản phát hành của Ant trong vài năm qua vì nó đã hoạt động.
  • Các bản dựng Ant có thể lặp lại vì chúng thường được tạo mà không có bất kỳ phụ thuộc bên ngoài nào, chẳng hạn như kho lưu trữ trực tuyến, plugin của bên thứ ba thử nghiệm, v.v.
  • Kiến là toàn diện. Vì là hộp công cụ, bạn có thể kết hợp các công cụ để thực hiện hầu hết mọi tác vụ bạn muốn. Nếu bạn cần viết tác vụ tùy chỉnh của riêng mình, việc này rất đơn giản.

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.


7
Tôi thực sự thích cách bạn "Đánh cắp" các ý tưởng từ Maven và áp dụng chúng cho các bản dựng Ant của bạn để tuân theo các quy ước chung và giúp việc chuyển đổi dễ dàng hơn cho người khác.
Igor ordaš

Để tránh phình to trong pom.xmls, tôi tạo hầu hết chúng thông qua XSLT.
Demi

21

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.


Điều này. So sánh giữa Ant + Ivy và Maven2 tại đây: ant.apache.org/ivy/m2comparison.html
Esko

Tại sao bạn muốn tránh Maven? Theo kinh nghiệm của tôi, Maven là một trong số ít các phần phát triển java dễ chịu.
Benson

4
@Benson: Đó là một vấn đề gây tranh cãi. Nếu đó là viên đạn bạc thì mọi người sẽ sử dụng nó.
cherouvim

18

Chỉ để liệt kê một số khác biệt:

  • Ant không có quy ước chính thức. Bạn phải nói với Ant chính xác nơi tìm nguồn, nơi đặt đầu ra, v.v.
  • Ant là thủ tục. Bạn phải nói với Ant chính xác phải làm gì; bảo nó biên dịch, sao chép, sau đó nén, v.v.
  • Kiến không có vòng đời.
  • Maven sử dụng các quy ước. Nó biết nơi mã nguồn của bạn được tự động, miễn là bạn tuân theo các quy ước này. Bạn không cần nói với Maven nó ở đâu.
  • Maven là tuyên bố; Tất cả những gì bạn phải làm là tạo một tệp pom.xml và đặt nguồn của bạn vào thư mục mặc định. Maven sẽ chăm sóc phần còn lại.
  • Maven có vòng đời. Bạn chỉ cần gọi mvn install và một loạt các bước tuần tự được thực thi.
  • Maven có trí thông minh về các nhiệm vụ dự án chung. Để chạy thử nghiệm, đơn giản thực hiện kiểm tra mvn , miễn là các tệp nằm ở vị trí mặc định. Trong Ant, trước tiên bạn phải có tệp JARit JAR, sau đó tạo một đường dẫn lớp bao gồm JUnit JAR, sau đó cho Ant biết nơi cần tìm mã nguồn kiểm tra, viết mục tiêu biên dịch nguồn kiểm tra và cuối cùng thực hiện kiểm tra đơn vị với JUnit.

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ó.


Đó có phải là một bản chơi chữ không?
vakio 18/03/2016

1
@vakio - Tôi đoán bạn có nghĩa là vì tôi đã sử dụng "trang web" thay vì "trích dẫn"? Đó là hoàn toàn một cách viết xấu về phía tôi và tôi cố định nó
Ascalonian

17

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 sẽ giúp bạn tiết kiệm thời gian khi bắt đầu dự án nhưng theo thời gian, nếu bạn có bất cứ điều gì khác ngoài một dự án rất đơn giản, các tập lệnh Maven sẽ trở nên phức tạp hơn nhiều so với tương đương Ant. Ví dụ, hãy xem plugin Maven hội.
Kevin Stembridge

Tôi sẽ lập luận rằng việc hoàn thành những gì mà plugin hội thực hiện dễ dàng hơn nhiều ở định dạng Maven (nơi bạn bố trí mô hình lắp ráp ở định dạng xml) so với thực hiện tất cả các bước thủ công trong Ant, nhưng YMMV
matt b

Xin chào Matt, đường cong học tập cho plugin lắp ráp dốc hơn nhiều so với nhiệm vụ Ant tar hoặc zip. Định dạng mô tả dài khoảng 150 dòng và chứa một loạt các tùy chọn cấu hình không trực quan. Trên hết, nó không hoạt động! Tại thời điểm tôi đã từ bỏ plugin hội, việc lọc giải nén không hoạt động và cũng không có tùy chọn chế độ tệp và nó không thể sửa lỗi. Không chắc chắn ý của bạn là "tất cả các bước thủ công trong Ant". Tôi đã dành khoảng 5 phút để Ant thực hiện những gì tôi không thể có được plugin lắp ráp để làm trong vài giờ.
Kevin Stembridge

3
liên kết đầu tiên hiện đã chết: /
Matt Clark

15

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.

https://wicket.apache.org/start/quickstart.html


11

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 đó 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.


6

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 ...


Tôi không đồng ý. Tôi đồng ý rằng sử dụng maven cho các dự án đơn giản là tốt, nhưng tôi sẽ lập luận rằng với sự phức tạp gia tăng, lợi ích của bạn từ việc sử dụng maven tăng theo đơn đặt hàng lớn.
Benson

Tôi cũng không đồng ý, Maven thực sự bắt đầu hoạt động tốt khi bạn có một hệ thống phức tạp hơn với nhiều mô-đun liên quan đến nhau. Nếu bạn cần viết các bài kiểm tra chức năng, chạy báo cáo và triển khai các tạo phẩm cho trình quản lý kho lưu trữ, tại sao bạn lại tự làm tất cả những điều đó với Ant?
Tim O'Brien

Maven vẫn ổn cho một dự án đơn giản, nhưng tôi đã gặp ác mộng về một thời gian cố gắng làm những việc đơn giản trong một dự án phức tạp hơn. Ví dụ: tạo gói phân phối, mã ẩn, tạo gói webstart, định cấu hình cấu hình. @Benson, khi dự án của bạn trở nên phức tạp hơn, Maven trở thành một quả bóng và chuỗi. Sức mạnh và tính linh hoạt của Ant sẽ mang lại cho bạn lợi ích năng suất cao hơn Maven. @tobrien, Ant chỉ hoạt động tốt đối với các dự án đa mô-đun, viết các bài kiểm tra chức năng, v.v. Định cấu hình các plugin báo cáo không mặc định trong Maven thường dài hơn so với Ant tương đương.
Kevin Stembridge

Tôi mới bắt đầu thêm maven vào một dự án hiện có và tôi thấy rằng mọi thứ không hoạt động như mong đợi. Trang web này được xây dựng bằng php và nó được triển khai bằng một tập lệnh. Những thứ này không hoạt động trơn tru trong Maven, bạn phải tạo ra những thứ rất kỳ quặc để khiến nó hoạt động.
Raul Luna

4

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.


2
+1, khi thấy những gì cần thiết để duy trì Kho lưu trữ Maven trung tâm hoạt động, tôi sẽ phải kêu gọi và đề nghị mọi người sử dụng bất cứ thứ gì như Maven và Ivy nên xem xét việc cài đặt trình quản lý kho lưu trữ. Không quan trọng cái nào, nhưng tôi là một phần của Nexus nexus.sonatype.org .
Tim O'Brien
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.