Може хтось скаже мені відмінності між Мурахом і Мейвен? Я жодного разу не використовував. Я розумію, що вони використовуються для автоматизації побудови проектів Java, але я не знаю, з чого почати.
Може хтось скаже мені відмінності між Мурахом і Мейвен? Я жодного разу не використовував. Я розумію, що вони використовуються для автоматизації побудови проектів Java, але я не знаю, з чого почати.
Відповіді:
У програмі Maven: The Definitive Guide я писав про відмінності між Мейвен та Мурашним у вступі назви розділу "Різниці між Мурахом та Мейвен" . Ось відповідь, що є поєднанням інформації у цьому вступі з деякими додатковими примітками.
Просте порівняння
Я показую вам це лише для того, щоб проілюструвати думку про те, що, на самому базовому рівні, Мейвен має вбудовані конвенції. Ось простий файл збірки мурашок:
<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>
У цьому простому мурашному прикладі ви можете побачити, як ви мусите точно сказати Мураві, що робити. Існує мета компіляції, яка включає завдання javac, яке компілює джерело в каталозі src / main / java до каталогу target / класів. Ви мусите точно сказати Ant, де знаходиться ваше джерело, де ви хочете, щоб отриманий байт-код зберігався, і як упакувати це все у файл JAR. Хоча існують деякі останні події, які допомагають зробити Ant менш процедурним, досвід розробника з Ant полягає в кодуванні процедурної мови, написаної в XML.
Порівняйте попередній приклад мурашки з прикладом Мейвена. У Maven, щоб створити файл JAR з якогось джерела Java, все, що вам потрібно зробити, це створити простий pom.xml, помістити свій вихідний код у $ {basedir} / src / main / java, а потім запустити mvn install з командного рядка . Приклад Maven pom.xml, який досягає однакових результатів.
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>org.sonatype.mavenbook</groupId>
<artifactId>my-project</artifactId>
<version>1.0</version>
</project>
Це все, що вам потрібно у вашому pom.xml. Запуск mvn install з командного рядка буде обробляти ресурси, компілювати джерело, виконувати тести одиниць, створювати JAR та встановлювати JAR у локальному сховищі для повторного використання в інших проектах. Без змін ви можете запустити mvn-сайт, а потім знайти файл index.html у target / site, який містить посилання на JavaDoc та кілька звітів про ваш вихідний код.
Справді, це найпростіший можливий приклад проекту. Проект, який містить лише вихідний код і який виробляє JAR. Проект, який дотримується конвенцій Мейвена і не вимагає ніяких залежностей або налаштування. Якщо ми хотіли почати налаштовувати поведінку, наш pom.xml збирається збільшуватись, і в найбільших проектах ви можете побачити колекції дуже складних Maven POM, які містять велику кількість налаштувань плагінів та декларацій залежності. Але навіть коли файли POM вашого проекту стають більш істотними, вони містять зовсім інший вид інформації з файлу збірки проекту аналогічного розміру за допомогою Ant. Maven POM містять декларації: "Це проект JAR" та "Вихідний код знаходиться у src / main / java". Файли збірки мурашок містять чіткі вказівки: "Це проект", "src/main/java
"," Запустити javac
проти цього каталогу "," Покласти результати в target/classses
"," Створити JAR з .... "і т. Д. Там, де мурашник мав бути явним щодо цього процесу, в Maven було щось" вбудоване ". що просто знав, де знаходиться вихідний код і як його слід обробляти.
Порівняння на високому рівні
Відмінності між Мурахом та Мейвен у цьому прикладі? Мураха ...
Де Мейвен ...
mvn install
. Ця команда наказала Мейвіну виконати ряд послідовних кроків, поки не досяг життєвого циклу. Як побічний ефект цієї поїздки по життєвому циклу, Мейвен виконав ряд цілей плагінів за замовчуванням, які робили такі речі, як компіляція та створення JAR.Що про Плющ?
Правильно, тож хтось на кшталт Стіва Лофрана збирається прочитати це порівняння і зателефонувати. Він розповість про те, як відповідь повністю ігнорує щось, що називається Айві, і про те, що Мураха може повторно використовувати логіку побудови в останніх випусках Ant. Це правда. Якщо у вас є маса розумних людей, які використовують Ant + antlibs + Ivy, ви закінчите добре розроблену конструкцію, яка працює. Хоча я дуже впевнений, що Мейвен має сенс, я б із задоволенням використовував Ant + Ivy з командою проекту, яка мала дуже гострого інженера з побудови. Зважаючи на це, я думаю, що ви в кінцевому підсумку пропустите цілий ряд цінних плагінів, таких як плагін Jetty, і що ви в кінцевому підсумку зробите цілу купу роботи, яку вам не потрібно було робити з часом.
Більш важливий, ніж Мейвен проти Ант
Maven - це Рамка, Мураха - це інструментарій
Maven - це попередньо побудований дорожній автомобіль, тоді як Ant - це набір автомобільних деталей. З Ant ви повинні побудувати свій власний автомобіль, але принаймні, якщо вам потрібно зробити позашляховик, ви зможете побудувати правильний тип автомобіля.
Інакше кажучи, Maven - це рамка, а Ant - це інструментарій. Якщо ви задоволені роботою в рамках, то Мейвен буде добре. Проблема для мене полягала в тому, що я постійно натикався на межі рамки, і це не дозволило мені вийти.
XML Verbosity
tobrien - це хлопець, який багато що знає про Мейвена, і я думаю, що він забезпечив дуже гарне, чесне порівняння двох продуктів. Він порівнював простий Maven pom.xml з простим файлом збірки мурашок і згадував, як проекти Maven можуть стати складнішими. Я думаю, що варто поглянути на порівняння пари файлів, які ви, швидше за все, побачите в простому реальному проекті. Файли, представлені нижче, представляють один модуль у складі багатомодуля.
По-перше, файл 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>
І еквівалентний файл Ant:
<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>
Тобріен використав свій приклад, щоб показати, що Maven має вбудовані конвенції, але це не обов'язково означає, що ви закінчуєте писати менше XML. Я вважав, що навпаки є правдою. Pom.xml в 3 рази довший, ніж build.xml, і це не відхиляється від умов. Насправді, мій приклад Maven показаний без зайвих 54 рядків, необхідних для налаштування плагінів. Цей pom.xml призначений для простого проекту. XML дійсно починає значно зростати, коли ви починаєте додавати додаткові вимоги, що не є звичайним для багатьох проектів.
Але ти мусиш сказати Мураві, що робити
Мій приклад Мураха вище не звичайно. Нам залишається визначити цілі, які використовуються для очищення, компіляції, тестування тощо. Вони визначаються у загальному файлі збірки, який імпортується всіма модулями в мультимодульному проекті. Що призводить мене до того, що всі ці речі повинні бути чітко написані в Ant, тоді як це декларативне в Maven.
Це правда, це заощадило б мені час, якби мені не довелося чітко писати ці мурашині цілі. Але скільки часу? Поширений файл збірки, який я зараз використовую, - це той, який я написав 5 років тому, з тих пір лише з невеликими уточненнями. Після 2-річного експерименту з Мейвен я витягнув з шафи старий файл збирання мурашок, запилив його та повернув на роботу. Для мене вартість того, щоб явно сказати Мураві, що робити, склала менше ніж тиждень протягом 5 років.
Складність
Наступна основна відмінність, яку я хотів би зазначити, полягає у складності та реальному ефекті. Maven був побудований з метою зменшити завантаженість розробників, на які покладено завдання створення та управління процесами збирання. Для цього це має бути складним. На жаль, складність, як правило, заперечує поставлену мету.
Якщо порівнювати з Ant, хлопець з будівництва на проект Maven витратить більше часу:
У контрасті:
Ознайомлення
Ще одна відмінність полягає у знайомстві. Новим розробникам завжди потрібен час, щоб досягти швидкості. Ознайомлення з існуючими продуктами допомагає в цьому плані, і прихильники Maven справедливо стверджують, що це користь Maven. Звичайно, гнучкість Мурахи означає, що ви можете створювати будь-які звичаї. Таким чином, умова, яку я використовую, полягає в тому, щоб помістити свої вихідні файли в ім'я каталогу src / main / java. Мої складені класи переходять до каталогу з назвою target / класів. Звучить знайомо, чи не так.
Мені подобається структура каталогів, яку використовує Maven. Я думаю, що це має сенс. Також їх життєвий цикл будувати. Тому я використовую ті самі умовності у своїх побудовах Ant. Не тільки тому, що це має сенс, а тому, що він буде знайомий кожному, хто раніше використовував Maven.
pom.xml
s, я генерую більшість з них за допомогою XSLT.
Мураха - це головним чином інструмент побудови.
Maven - це інструмент управління проектами та залежностями (який, звичайно, також будує ваш проект).
Ant + Ivy - це досить гарна комбінація, якщо ви хочете уникнути Мейвена.
Просто перерахуйте ще кілька відмінностей:
Оновлення:
Це прийшло з Maven: The Definitive Guide . Вибачте, я зовсім забув це процитувати.
Мейвен чи Мураха? - це дуже схоже на це питання, яке має допомогти вам відповісти на ваші запитання.
Що таке Мейвен? на офіційному сайті.
редагувати: Для нового проекту / greenfield я рекомендую використовувати Maven: "конвенція щодо конфігурації" заощадить вам пристойний шматок часу в написанні та налаштуванні сценаріїв збірки та розгортання. Коли ви використовуєте мураш, сценарій збірки, як правило, зростає з часом у довжину та складність. Для існуючих проектів важко підключити їх конфігурацію / компонування в систему Maven.
Maven виступає як інструментом управління залежністю - його можна використовувати для отримання банки з центрального сховища або зі сховища, яке ви створили, - і як декларативний інструмент збірки. Різниця між "декларативним" інструментом збирання та більш традиційним, як мураха або make, це те, що ви налаштуєте, що потрібно зробити, а не як це зробити. Наприклад, ви можете сказати в сценарії Maven, що проект повинен бути упакований у файл WAR, і maven знає, як з цим впоратися.
Мейвен спирається на конвенції про те, як складаються каталоги проектів, щоб досягти його "декларативності". Наприклад, у ньому встановлено домовленість про те, куди слід помістити основний код, куди помістити свій web.xml, тести вашого блоку тощо, але також дає можливість змінити їх, якщо потрібно.
Також слід пам’ятати про те, що для роботи команд мураха зсередини maven є плагін:
http://maven.apache.org/plugins/maven-ant-plugin/
Крім того, архетипи Мейвена дуже швидко роблять роботу з проектом. Наприклад, існує архетип Wicket, який забезпечує команду Maven, яку ви запускаєте, щоб отримати цілий готовий проект привіт світового типу.
Я можу взяти людину, яка ніколи не бачила Мураху - її build.xml
добре написано - і вони можуть зрозуміти, що відбувається. Я можу взяти ту саму людину і показати їм Maven POM, і вони не матимуть уявлення про те, що відбувається.
У величезній інженерній організації люди пишуть про те, що файли Ant стають великими та некерованими. Я написав ці типи і очистив сценарії мурашок. Це дійсно заздалегідь розуміння того, що вам потрібно зробити вперед та розробка набору шаблонів, здатних реагувати на зміни та масштаби протягом 3+ років.
Якщо у вас не є простий проект, вивчити конвенції Мейвена та спосіб Maven щодо виконання справ - це зовсім небагато роботи.
Зрештою, ви не можете вважати запуск проекту разом з Ant або Maven фактором: це дійсно загальна вартість володіння. Що потрібно організації для підтримки та розширення системи побудови протягом декількох років, є одним з головних факторів, які необхідно враховувати.
Найважливіші аспекти системи побудови - це управління залежністю та гнучкість у викладі рецепту збірки. Це повинно бути дещо інтуїтивно зрозумілим, коли все зроблено добре.
Я б сказав, що це залежить від розміру вашого проекту ... Особисто я би використовував Maven для простих проектів, які потребують прямого складання, упаковки та розгортання. Як тільки вам потрібно зробити кілька складніших речей (багато залежностей, створення файлів відображення ...), я перейшов би на Ant ...
Maven також розміщує велике сховище часто використовуваних проектів з відкритим кодом. Під час складання Maven може завантажити ці залежності для вас (як і ваші залежності :)), щоб зробити цю частину побудови проекту трохи більш керованою.