Mrówka kontra Maven kontra Gradle

Ant Vs Maven Vs Gradle



Podczas tworzenia oprogramowania programiści muszą ciągle odbudowywać ten sam kod. Często próbują użyć skryptów bash lub innych języków skryptowych, aby zautomatyzować zadanie. Dostępne są jednak narzędzia do kompilacji, które są bardziej odpowiednie do automatyzacji kompilacji. Dominującymi narzędziami do budowania są:

Przyjrzyjmy się narzędziom, aby dowiedzieć się więcej.







Mrówka Apache z bluszczem

Apache Ant to oparte na Javie narzędzie wiersza poleceń, które używa plików XML do definiowania skryptów budowania. Jest używany głównie do kompilacji Java, ale może być również używany do programowania w C/C++. Wbudowane zadania zapewniają sposoby kompilowania, składania, testowania i uruchamiania aplikacji. Użytkownicy mogą również tworzyć własne biblioteki antylibów w celu zwiększenia funkcjonalności Ant. Apache Ivy to narzędzie do zarządzania zależnościami, które łatwo integruje się z Ant, aby zapewnić bardziej niezawodny ekosystem. Rozwój Ant rozpoczął się w 2000 roku.



Plusy



  • Lepsza kontrola nad całym procesem kompilacji
  • Wystarczająco elastyczny, aby współpracować z dowolnym procesem pracy

Cons





  • Pliki kompilacji oparte na XML mogą stać się duże i niemożliwe do utrzymania
  • Utrzymanie skryptów kompilacji wymaga dużo czasu i zasobów
  • Integracja z IDE jest trudna do osiągnięcia

Przykład mrówki z bluszczem

Możesz zainstalować najnowszą wersję Ant z tutaj . Musisz pobrać zip, rozwinąć i umieścić folder bin na swojej ścieżce. Możesz użyć następującego polecenia, aby sprawdzić, czy Ant jest poprawnie zainstalowany:

$ mrówka-wersja
Apache Ant(TM)wersja 1.10.1 skompilowana w lutym2 2017

Po zainstalowaniu Ant możesz pobrać najnowszy słoik Ivy i umieścić go w folderze lib w katalogu Ant.



Po zainstalowaniu Ant utwórz foldery helloworld i helloworld/src. W folderze src umieść plik helloworld.java z kodem:

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

Drukuje „Witaj świecie!”

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

publiczny klasaWitaj świecie{

publiczny statyczny próżniaGłówny( Strunowy []argumenty) {
System .na zewnątrz.drukuj('Witaj świecie!');
}

}

Teraz w folderze helloworld utwórz plik build.xml z następującym kodem:

xmlns:bluszcz=„antlib:org.apache.ivy.ant” Nazwa='Witaj świecie' domyślny='słoik'>

Nazwa='src.katalog' wartość=„źródło”/>
Nazwa='buduj.katalog' wartość='budować'/>
Nazwa='klasy.katalog' wartość='${katalog.kompilacji}/klasy'/>
Nazwa='am.reż' wartość='$ {katalog.kompilacji} / bin'/>
Nazwa=„lib.katalog” wartość=„lib” />
NS='lib.ścieżka.id'>
Tobie=„$ {katalog.lib.}” />
>

Nazwa='rozwiązać'>
/>
>

Nazwa='czysty'>
Tobie=„$ {katalog.kompilacji}”/>
>

Nazwa='skompilować' zależy='rozwiązać'>
Tobie='$ {klasy.katalog}'/>
srcdir='$ {src.dir}' destdir='$ {klasy.katalog}' ścieżka klasy='lib.ścieżka.id'/>
>

Nazwa='słoik' zależy='skompilować'>
Tobie=„$ {bin.katalog}”/>
destfile='${bin.dir}/${ant.nazwa.projektu}.jar' bazowany='$ {klasy.katalog}'/>
>

>

W tym samym folderze helloworld utwórz plik ivy.xml z następującym kodem:

wersja=„2.0”>
organizacja=„org.apache” moduł='Witaj świecie'/>
>
organizacja=„junicja” Nazwa=„junicja” obrót silnika=„4.12”/>
>
>

Struktura katalogów powinna wyglądać tak:

Witaj świecie
|-- build.xml
| - bluszcz.xml
`-- src
`- helloworld.java

Teraz możesz uruchomić kompilację za pomocą polecenia:

$Mrówkasłoik

Udana kompilacja powinna zapewnić takie dane wyjściowe:

$ słoik mrówek
Buildfile: /Users/zak/_work/LearnBuildScripts/LearnANT/helloworld/build.xml

rozwiązać:
[ivy:odzyskaj] :: Apache Ivy 2.4.0 - 20141213170938 :: http://ant.apache.org/ivy/ ::
[ivy:retrive] :: ładowanie ustawień :: 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:retrive] :: rozwiązywanie zależności :: org.apache#helloworld; [e-mail chroniony]
MacBook-Air.local
[ivy:odzyskaj] konfs: [domyślnie]
[ivy:retrieve] znaleziono junit#junit;4.12 publicznie
[ivy:retrieve] znaleziono org.hamcrest#hamcrest-core;1.3 publicznie
[ivy:retrieve] :: raport o rozwiązaniu :: rozstrzygnięcie 397 ms :: artefakty dl 15 ms
-------------------------------------------------- -------------------
| | moduły || artefakty |
| konf. | numer| search|dwnlded|eksmitowany|| numer|dwnlded|
-------------------------------------------------- -------------------
| domyślny | 2 | 0 | 0 | 0 || 4 | 0 |
-------------------------------------------------- -------------------
[ivy:odzyskiwanie] :: odzyskiwanie :: org.apache#helloworld
[ivy:odzyskaj] konfs: [domyślnie]
[ivy:retrieve] 0 skopiowanych artefaktów, 4 już pobranych (0kB/39ms)

skompilować:
[mkdir] Utworzono katalog: /Users/zak/_work/LearnBuildScripts/LearnANT/helloworld/build/
zajęcia
[javac] /Users/zak/_work/LearnBuildScripts/LearnANT/helloworld/build.xml:22: ostrzeżenie:
„includeantruntime” nie został ustawiony, domyślnie build.sysclasspath=last; ustaw na fałsz
dla powtarzalnych kompilacji
[javac] Kompilacja 1 pliku źródłowego do /Users/zak/_work/LearnBuildScripts/LearnANT/
helloworld/build/classes

słoik:
[mkdir] Utworzono katalog: /Users/zak/_work/LearnBuildScripts/LearnANT/helloworld/build/bin
[jar] Jar budowania: /Users/zak/_work/LearnBuildScripts/LearnANT/helloworld/build/bin/
helloworld.jar

BUDUJ SUKCESEM
Całkowity czas: 6 sekund

Możesz wypróbować plik jar w ten sposób:

$ java -cp build/bin/helloworld.słoikWitaj świecie
Witaj świecie!

Zdefiniowaliśmy plik jar do umieszczenia w folderze build/bin. Foldery są tworzone podczas kompilacji. Komenda jar mrówek wywołuje cel jar w build.xml.

Maven

Maven został opracowany w celu rozwiązania problemów związanych ze skryptami opartymi na Ant. Zachował pliki XML, ale przyjął inne podejście do organizacji. W Ant programiści muszą tworzyć wszystkie zadania. Maven zmniejsza tworzenie zadań, wdrażając silniejsze standardy organizacji kodu. W rezultacie łatwiej jest rozpocząć pracę nad standardowymi projektami.

Wprowadzono również pobieranie zależności, co ułatwiło rozwój. Przed wprowadzeniem Ivy w Ant, użytkownicy musieli zarządzać zależnościami lokalnie. Maven jako pierwszy przyjął filozofię zarządzania zależnościami.

Jednak surowe standardy Mavena utrudniają pisanie niestandardowych skryptów kompilacji. Narzędzie jest łatwe w obsłudze, o ile projekt jest zgodny z surowymi standardami.

Plusy

  • Automatyczne pobieranie zależności
  • Wszystkie zależności są automatycznie rejestrowane w kontroli źródła w ramach skryptów Maven
  • Standaryzuje i upraszcza proces budowania
  • Łatwa integracja z IDE i systemami CI/CD

Cons

  • Brak elastyczności w tworzeniu niestandardowych przepływów pracy
  • Stroma krzywa uczenia się, a proces jest trudny do zrozumienia dla nowicjuszy
  • Czasochłonne rozwiązywanie problemów z kompilacją i integracjami nowych bibliotek
  • Niedobrze z wieloma wersjami tej samej zależności

Przykład Maven

Możesz pobrać najnowszą wersję Maven z tutaj . Możesz sprawdzić instalację w ten sposób:

$ mvn --wersja
Apache Maven 3.5.2(138edd61fd100ec658bfa2d307c43b76940a5d7d; 2017-10-18T00:58:13-07: 00)
Strona główna Mavena: /Users/zak/BuildTools/Maven/apache-maven-3.5.2
Wersja Java: 1.8.0_74, dostawca: Oracle Corporation
Strona główna Java: /Biblioteka/Java/JavaVirtualMachines/jdk1.8.0_74.jdk/Spis treści/Strona główna/jre
Domyślna lokalizacja: en_US, kodowanie platformy: UTF-8
Nazwa systemu operacyjnego:'Mac OS X', wersja:„10,11,6”, łuk:'x86_64', rodzina:'prochowiec'

Utwórz folder helloworld i wygeneruj projekt za pomocą następującego polecenia:

$ mvn archetype:generate -DgroupId=com.Nazwa firmy.Witaj świecie-DartifactId=helloworld
-DarchetypeArtifactId = maven-archetype-quickstart -DinteractiveMode =fałszywe

Powinien utworzyć strukturę folderów i wygenerować wynik, który wygląda tak:

[INFO] Skanowanie w poszukiwaniu projektów...
[INFORMACJE]
[INFO] ---------------------------------------------------------- -------------------------
[INFO] Budynek Maven Stub Project (bez POM) 1
[INFO] ---------------------------------------------------------- -------------------------
[INFORMACJE]
[INFO] >>> maven-archetype-plugin:3.0.0:generate (domyślne-cli) > generuj-źródła
@ samodzielny-pom >>>
[INFORMACJE]
[INFORMACJE]<<< maven-archetype-plugin:3.0.0:generate (default-cli) < generate-sources
@ samodzielny-pom<<<
[INFORMACJE]
[INFORMACJE]
[INFO] --- maven-archetype-plugin:3.0.0:generate (domyślne-cli) @ standalone-pom ---
[INFO] Generowanie projektu w trybie wsadowym
[INFO] ---------------------------------------------------------- ------------------------------
[INFO] Użycie następujących parametrów do tworzenia projektu ze Starego (1.x) Archetyp:
maven-archetyp-szybki start: 1,0
[INFO] ---------------------------------------------------------- ------------------------------
[INFO] Parametr: basedir, Wartość: /Users/zak/_work/LearnBuildScripts/LearnMaven
[INFO] Parametr: pakiet, Wartość: com.nazwafirmy.helloworld
[INFO] Parametr: groupId, Wartość: com.nazwafirmy.helloworld
[INFO] Parametr: artifactId, wartość: helloworld
[INFO] Parametr: nazwapakietu, wartość: com.nazwafirmy.helloworld
[INFO] Parametr: wersja, Wartość: 1.0-SNAPSHOT
[INFO] projekt stworzony ze starego (1.x) Archetype w katalogu: /Users/zak/_work/
LearnBuildScripts/LearnMaven/helloworld
[INFO] ---------------------------------------------------------- -------------------------
[INFO] BUDUJ SUKCES
[INFO] ---------------------------------------------------------- -------------------------
[INFO] Całkowity czas: 8,602 s
[INFO] Zakończono: 2018-01-27T00:05:37-08:00
[INFO] Pamięć końcowa: 15M/152M
[INFO] ---------------------------------------------------------- -------------------------

Struktura folderów powinna wyglądać tak:

Witaj świecie
|- pom.xml
``-- src
|-- Główny
| ``-Jawa
| ``-- z
| ``-- Nazwa firmy
| ``-- Witaj świecie
| ``- App.java
``-test
``-Jawa
``-- z
``-- Nazwa firmy
``-- Witaj świecie
``- AppTest.java

Plik pom.xml zawiera konfiguracje kompilacji. Wewnątrz pliku pom.xml kod wygląda tak:

xmlns=„http://maven.apache.org/POM/4.0.0” xmlns:xsi=„http://www.w3.org/2001/
XMLSchema-instancja'
xsi:schemaLokalizacja=„http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0
_0.xsd>
>4.0.0>
>com.nazwafirmy.helloworld>
>Witaj świecie>
>słoik>
>1.0-ZDJĘCIE>
>Witaj świecie>
>http://maven.apache.org>
>
>
>junit>
>junit>
>3.8.1>
>test>
>
>
>

Plik jar można wygenerować za pomocą następującego polecenia:

Pakiet $mvn

[INFO] Skanowanie w poszukiwaniu projektów...
[INFORMACJE]
[INFO] ---------------------------------------------------------- -------------------------
[INFO] Budowa helloworld 1.0-SNAPSHOT
[INFO] ---------------------------------------------------------- -------------------------
[INFORMACJE]
[INFO] --- maven-resources-plugin:2.6:resources (domyślne-zasoby) @ helloworld ---
[OSTRZEŻENIE] Używanie kodowania platformy (właściwie UTF-8) do kopiowania filtrowanych zasobów, tj.
kompilacja zależy od platformy!
[INFO] pomiń nieistniejący katalog zasobów /Users/zak/_work/LearnBuildScripts/LearnMaven/
helloworld/źródło/główne/zasoby
[INFORMACJE]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ helloworld ---
[INFO] Wykryto zmiany - rekompilacja modułu!
[OSTRZEŻENIE] Kodowanie pliku nie zostało ustawione, używając kodowania platformy UTF-8, tj. build is
zależna od platformy!
[INFO] Kompilacja 1 pliku źródłowego do /Users/zak/_work/LearnBuildScripts/LearnMaven/
helloworld/cel/klasy
[INFORMACJE]
[INFO] --- maven-resources-plugin:2.6:testResources (domyślne-testResources) @
Witaj świecie ---
[OSTRZEŻENIE] Używanie kodowania platformy (właściwie UTF-8) do kopiowania filtrowanych zasobów, tj.
kompilacja zależy od platformy!
[INFO] pomiń nieistniejący katalog zasobów /Users/zak/_work/LearnBuildScripts/LearnMaven/
helloworld/źródło/test/zasoby
[INFORMACJE]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ helloworld ---
[INFO] Wykryto zmiany - rekompilacja modułu!
[OSTRZEŻENIE] Kodowanie pliku nie zostało ustawione, używając kodowania platformy UTF-8, tj. build is
zależna od platformy!
[INFO] Kompilacja 1 pliku źródłowego do /Users/zak/_work/LearnBuildScripts/LearnMaven
/helloworld/target/test-classes
[INFORMACJE]
[INFO] --- maven-surefire-plugin:2.12.4:test (test domyślny) @ helloworld ---
[INFO] Katalog raportów Surefire: /Users/zak/_work/LearnBuildScripts/LearnMaven
/witaj świecie/cel/
Pewne raporty

-------------------------------------------------- -----
T E S T S
-------------------------------------------------- -----
Uruchamiam test com.nazwafirmy.helloworld.AppTest
Przebieg testów: 1, Awarie: 0, Błędy: 0, Pominięte: 0, Czas, który upłynął: 0,014 s

Wyniki :

Przebieg testów: 1, Awarie: 0, Błędy: 0, Pominięte: 0

[INFORMACJE]
[INFO] --- maven-jar-plugin:2.4:jar (domyślny-jar) @ helloworld ---
[INFO] Jar budowania: /Users/zak/_work/LearnBuildScripts/LearnMaven/helloworld/target/
helloworld-1.0-SNAPSHOT.jar
[INFO] ---------------------------------------------------------- -------------------------
[INFO] BUDUJ SUKCES
[INFO] ---------------------------------------------------------- -------------------------
[INFO] Całkowity czas: 5,624 s
[INFO] Zakończono: 2018-01-27T00:11:10-08:00
[INFO] Pamięć końcowa: 16M/114M
[INFO] ---------------------------------------------------------- -------------------------

Możesz uruchomić plik jar w ten sposób:

$ java -cp target/helloworld-1,0-MIGAWKA.słoikz.Nazwa firmy.Witaj świecie.Aplikacja
Witaj świecie!

Plik jar jest umieszczany w folderze docelowym.

Gradle

Gradle łączy w sobie moc Ant i Maven. Pierwsza wersja Gradle została wydana w 2012 roku. Szybko się przyjęła. Google używa go obecnie w systemie operacyjnym Android.

Zamiast XML Gradle używa języka Groovy. W rezultacie skrypty budowania w Gradle są łatwiejsze do pisania i czytania. Początkowo używał Ivy do zarządzania zależnościami, ale teraz używa własnego silnika zależności.

Plusy

  • Zapewnia standaryzację przy zachowaniu elastyczności
  • Łatwe do czytania i pisania skrypty kompilacji
  • Lepiej radzi sobie z wieloma wersjami zależności
  • Potrafi obsługiwać wiele języków programowania i technologii
  • Aktywna społeczność pomagająca rozwijać narzędzie
  • Gradle DSL (język specyficzny dla domeny) sprawia, że ​​jest to prosta struktura konfiguracji
  • Gradle zapewnia poprawę wydajności za pomocą przyrostowej pamięci podręcznej kompilacji i demona Gradle

Cons

  • Integracja z IDE nie tak dobra jak Maven

Przykład Gradle

Możesz zainstalować Gradle z tutaj . Po skonfigurowaniu Gradle na swojej ścieżce możesz to sprawdzić:

$ Gradle--wersja

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

Czas budowy:2018-01-24 17: 04:52UTC
Wersja: 77d0ec90636f43669dc794ca17ef80dd65457bec

Groovy: 2.4.12
Mrówka: Mrówka Apacza(TM)wersja 1.9.9 skompilowana w lutym2 2017
JVM: 1.8.0_74(Korporacja Oracle25,74-b02)
System operacyjny: Mac OS X 10.11.6 x86_64

Następnie utwórz następującą strukturę katalogów:

Witaj świecie
|-budować.Gradle
``-src
|-Główny
``-Jawa
``-Witaj świecie
``-Witaj świecie.Jawa

Dla helloworld.java umieść kod z przykładu Ant. A dla build.gradle wstaw następujący kod:

zastosuj wtyczkę: 'Jawa'

wersja= „1.0”

repozytoria{
mavenCentral()
}

zależności{
grupa testCompile: „junicja”, Nazwa: „junicja”, wersja: „4.12”
}

Możesz użyć polecenia Gradle task –all, aby wyświetlić wszystkie dostępne polecenia. Gradle automatycznie wybiera wtyczki określone w pliku build.gradle i pokazuje dodatkowe zadania dostępne dzięki wtyczkom.

Możesz uzyskać kompilację, uruchamiając:

$ słoik na grad

BUDOWAĆ UDANY w 1s
2wykonalne zadania:2wykonany

Możesz uruchomić swój słoik w ten sposób:

$ java -cp build/libs/helloworld-1,0.słoikWitaj świecie
Witaj świecie!

Plik jar jest umieszczany w folderze build/libs.

Wniosek

Wśród narzędzi do budowania, Ant może być przydatny w mniejszych projektach, podczas gdy Maven jest lepszy do upewnienia się, że wszyscy programiści przestrzegają tych samych zasad. Gradle to najnowsze narzędzie, które zapewnia największą elastyczność.

Bibliografia: