Wybór odpowiedniego narzędzia kompilacji: Ant vs Maven vs Gradle
Podczas tworzenia oprogramowania programiści muszą w kółko odbudowywać ten sam kod. Często starają się używać skryptów bash lub innych języków scenariuszy do zautomatyzowania zadania. Dostępne są jednak narzędzia kompilacji, które są bardziej odpowiednie do automatyzacji kompilacji. Dominującymi narzędziami kompilacji to:
- Apache mrówka z bluszkiem
- Maven
- Gradle
Zbadajmy narzędzia, aby dowiedzieć się więcej.
Apache mrówka z bluszkiem
Apache Ant to narzędzie wiersza poleceń opartych na Javie, które używa plików XML do definiowania skryptów kompilacji. Jest głównie używany do kompilacji Java, ale może być również używany do rozwoju C/C ++. Wbudowane zadania zapewniają sposoby kompilacji, montażu, testowania i uruchamiania aplikacji. Użytkownicy mogą również stworzyć własne „mrówki”, aby zwiększyć funkcjonalność Ant. Apache Ivy to narzędzie do zarządzania zależnością, które łatwo integruje się z ANT, aby zapewnić bardziej niezawodny ekosystem. Rozwój ANT rozpoczął się w 2000 roku.
Profesjonaliści
- Lepsza kontrola ogólnego procesu kompilacji
- Wystarczająco elastyczny, aby pracować z każdym procesem pracy
Cons
- Pliki kompilacji oparte na XML mogą stać się dużym i nieuzasadnionym
- Konieczne jest dużo czasu i zasobów, aby utrzymać skrypty kompilacji
- Integracja IDE jest trudna do osiągnięcia
Mrówka z przykładem Ivy
Możesz zainstalować najnowsze ANT stąd. 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:
$ Ant -wersja
Apache Ant (TM) Wersja 1.10.1 opracowany 2 lutego 2017 r
Po zainstalowaniu ANT możesz pobrać najnowszy słoik bluszczowy i umieścić go w folderze Lib w katalogu mrówek.
Po zainstalowaniu mrówek stwórz foldery Helloworld i Helloworld/SRC. W folderze SRC umieść Helloworld.plik Java z kodem:
/******************************
Wydrukuje „Witaj świat!"
***************************/
klasa publiczna Helloworld
public static void main (string [] args)
System.na zewnątrz.println („Witaj świat!");
Teraz w folderze Helloworld Utwórz kompilację.plik XML z następującym kodem:
I w tym samym folderze Helloworld utwórz bluszek.plik XML z następującym kodem:
Struktura katalogu powinna wyglądać tak:
Witaj świecie
|- buduj.XML
|- Ivy.XML
„- Src
'-- Witaj świecie.Jawa
Teraz możesz uruchomić kompilację za pomocą polecenia:
$ ANT JAR
Udana kompilacja powinna zapewnić wyjście w ten sposób:
$ ANT JAR
BuildFile:/Users/Zak/_Work/LearnBuildScripts/Learnant/Helloworld/Build.XML
rozstrzygać:
[Ivy: odzyskaj] :: Apache Ivy 2.4.0 - 20141213170938 :: http: // ant.Apache.Org/ Ivy/ ::
[Ivy: odzyskaj] :: Ustawienia ładowania :: url = jar: plik:/Users/Zak/BuildTools/Ant/Apache
-Ant-1.10.1/Lib/Ivy-2.4.0.słoik!/org/apache/ivy/core/settings/ivysettings.XML
[Ivy: odzyskaj] :: Rozwiązywanie zależności :: org.Apache#helloworld; pracujący@zakirs-
Macbook Air.lokalny
[Ivy: odzyskaj] Confs: [domyślnie]
[Ivy: odzyskaj] Znaleziono Junit#Junit; 4.12 publicznie
[Ivy: odzyskaj] Znaleziono org.Hamcrest#Hamcrest-Core; 1.3 publicznie
[Ivy: odzyskaj] :: Raport Resolution :: Resolve 397ms :: Artefacts Dl 15ms
---------------------------------------------------------------------
|. |. moduły || Artefakty |
|. Conf | liczba | Wyszukaj | Dwnlded | eksmitowany || Numer | Dwnlded |
---------------------------------------------------------------------
|. domyślnie | 2 | 0 | 0 | 0 || 4 | 0 |
---------------------------------------------------------------------
[Ivy: odzyskaj] :: odzyskiwanie :: org.Apache#Helloworld
[Ivy: odzyskaj] Confs: [domyślnie]
[Ivy: odzyskaj] 0 kopiowane artefakty, 4 już odzyskane (0KB/39ms)
skompilować:
[Mkdir] Utworzono dir:/Users/Zak/_Work/LearnBuildScripts/Learnant/Helloworld/Build/
zajęcia
[Javac]/Users/Zak/_Work/LearnBuildScripts/Learnant/Helloworld/Build.XML: 22: Ostrzeżenie:
„w tym ANTRUNTIME” nie ustawiono, domyślnie budowanie.sysclasspath = last; ustawione na false
dla powtarzalnych kompilacji
[Javac] Kompilowanie 1 pliku źródłowego do/Users/Zak/_Work/LearnBuildScripts/Learnant/
Helloworld/Build/Classes
słoik:
[Mkdir] Utworzono dir:/Users/Zak/_Work/LearnBuildScripts/Learnant/Helloworld/Build/Bin
[JAR] Building Jar:/Users/Zak/_Work/LearnBuildScripts/Learnant/Helloworld/Build/bin/
Witaj świecie.słoik
Zbudować udane
Całkowity czas: 6 sekund
Możesz wypróbować plik jar w ten sposób:
$ java -cp build/bin/helloworld.Jar Helloworld
Witaj świecie!
Zdefiniowaliśmy plik JAR, który ma zostać umieszczony w folderze kompilacji/bin. Foldery powstają podczas kompilacji. Komenda mrówka słoika wywołuje cel słoika w kompilacji.XML.
Maven
Maven został opracowany w celu rozwiązania problemów związanych z skryptami mrówki. 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 do organizowania kodu. W rezultacie łatwiej jest rozpocząć standardowe projekty.
Wprowadził także pobieranie zależności, które ułatwiły rozwój. Przed wprowadzeniem Ivy in Ant użytkownicy musieli lokalnie zarządzać zależnościami. Maven najpierw przyjął filozofię zarządzania zależnością.
Jednak ścisłe standardy Mavens utrudniają pisanie niestandardowych scenariuszy kompilacji. Narzędzie jest łatwe w obsłudze, o ile projekt przestrzega ścisłych standardów.
Profesjonaliści
- Automatyczne pobieranie zależności
- Wszystkie zależności są automatycznie rejestrowane w sterowaniu źródłem jako część skryptów Maven
- Standaryzuje i upraszcza proces kompilacji
- Łatwo integruje się z systemami IDES i CI/CD
Cons
- Nie elastyczne w tworzeniu niestandardowych przepływów pracy
- Stroma krzywa uczenia się i proces jest trudny do zrozumienia nowicjuszy
- Czasochłonne w celu rozwiązania problemów z budową i nowych integracji bibliotecznych
- Nie jest dobre z wieloma wersjami tej samej zależności
Przykład Maven
Możesz pobrać najnowszy Maven stąd. Możesz sprawdzić taką instalację:
$ mvn --version
Apache Maven 3.5.2 (138EDD61FD100EC658BFA2D307C43B76940A5D7D; 2017-10-18T00: 58: 13-07: 00)
Maven Home:/Users/Zak/BuildTools/Maven/Apache-Maven-3.5.2
Wersja Java: 1.8.0_74, sprzedawca: Oracle Corporation
Java Home:/Library/Java/JavavirtualMachines/JDK1.8.0_74.JDK/SPIS TREŚCI/DOM/JRE
Domyślna lokalizacja: en_us, kodowanie platformy: UTF-8
Nazwa systemu operacyjnego: „Mac OS X”, wersja: „10.11.6 ", Arch:„ x86_64 ”, rodzina:„ Mac ”
Utwórz folder Helloworld i wygeneruj projekt z następującym poleceniem:
$ mvn archeType: generuj -dgroupid = com.Nazwa firmy.Helloworld -dartifactid = Helloworld
-DarchetypeartifactID = maven-archetype-quickstart -dinteractiveMode = false
Powinien utworzyć strukturę folderów i wygenerować dane wyjściowe, które wygląda tak:
[Info] Skanowanie projektów…
[Informacje]
[Informacje] ------------------------------------------------------------------------
[Info] Budowanie projektu Maven Stub (bez POM) 1
[Informacje] ------------------------------------------------------------------------
[Informacje]
[Info] >>> Maven-archetape-plugin: 3.0.0: Generuj (Domyślnie-CLI)> Generuj źródła
@ Standalone-POM >>>
[Informacje]
[Informacje] <<< maven-archetype-plugin:3.0.0:generate (default-cli) < generate-sources
@ Standalone-pom <<<
[Informacje]
[Informacje]
[Info] --- Maven-ArcheType-Plugin: 3.0.0: Generuj (domyślnie-CLI) @ samodzielne pomo ---
[Info] Generowanie projektu w trybie wsadowym
[Informacje] ----------------------------------------------------------------------------
[Informacje] Korzystanie z następujących parametrów do tworzenia projektu ze starego (1.x) Archetyp:
Maven-ArcheType-Quickstart: 1.0
[Informacje] ----------------------------------------------------------------------------
[Info] Parametr: oparty na wartości:/Users/Zak/_Work/LearnBuildScripts/LearnMaven
[Info] Parametr: pakiet, wartość: com.Nazwa firmy.Witaj świecie
[Info] Parametr: GroupID, wartość: com.Nazwa firmy.Witaj świecie
[Info] Parametr: artefaktyd, wartość: helloworld
[Info] Parametr: Packagename, wartość: com.Nazwa firmy.Witaj świecie
[Info] Parametr: wersja, wartość: 1.0-Snapshot
[Info] Projekt utworzony od Old (1.x) Archetyp w Dir:/Users/Zak/_Work/
LearnBuildScripts/LearnMaven/Helloworld
[Informacje] ------------------------------------------------------------------------
[Info] Buduj sukces
[Informacje] ------------------------------------------------------------------------
[Info] Całkowity czas: 8.602 s
[Informacje] zakończone na: 2018-01-27T00: 05: 37-08: 00
[Info] Pamięć końcowa: 15m/152m
[Informacje] ------------------------------------------------------------------------
Struktura folderu powinna wyglądać tak:
Witaj świecie
|- pom.XML
„- Src
|- Main
|. '- Java
|. '- com
|. '-- Nazwa firmy
|. '-- Witaj świecie
|. '- App.Jawa
'- Test
'- Java
'- com
'-- Nazwa firmy
'-- Witaj świecie
„- AppTest.Jawa
Pom.XML zawiera konfiguracje kompilacji. Wewnątrz pom.xml kod wygląda tak:
XSI: Schemalocation = "http: // maven.Apache.org/pom/4.0.0 http: // maven.Apache.org/maven-v4_0
_0.xsd ">
4.0.0
com.Nazwa firmy.Witaj świecie
Witaj świecie
słoik
1.0-Snapshot
Witaj świecie
http: // maven.Apache.org
Junit
Junit
3.8.1
test
Możesz wygenerować plik JAR za pomocą następującego polecenia:
Pakiet $ MVN
[Info] Skanowanie projektów…
[Informacje]
[Informacje] ------------------------------------------------------------------------
[Info] Budowanie Helloworld 1.0-Snapshot
[Informacje] ------------------------------------------------------------------------
[Informacje]
[Informacje] --- Maven-resources-Plugin: 2.6: Zasoby (default-resources) @ helloworld ---
[Ostrzeżenie] Korzystanie z kodowania platformy (właściwie UTF-8) do kopiowania filtrowanych zasobów, i.mi.
kompilacja jest zależna od platformy!
[Info] Pomiń nie istniejący zasób/użytkowników/ZAK/_WORK/LearnBuildScripts/LearnMaven/
Helloworld/src/main/zasoby
[Informacje]
[Info] --- Maven-Compiller-Plugin: 3.1: Compile (domyślny compile) @ helloworld ---
[Informacje] Wykryte zmiany - Rekompilowanie modułu!
[Ostrzeżenie] Kodowanie plików nie zostało ustawione za pomocą kodowania platformy UTF-8, i.mi. kompilacja jest
zależne od platformy!
[Informacje] Kompilowanie 1 pliku źródłowego do/Users/Zak/_Work/LearnBuildScripts/LearnMaven/
Helloworld/Target/Classes
[Informacje]
[Informacje] --- Maven-resources-Plugin: 2.6: TestResources (Default-Testresources) @
Witaj świecie ---
[Ostrzeżenie] Korzystanie z kodowania platformy (właściwie UTF-8) do kopiowania filtrowanych zasobów, i.mi.
kompilacja jest zależna od platformy!
[Info] Pomiń nie istniejący zasób/użytkowników/ZAK/_WORK/LearnBuildScripts/LearnMaven/
Helloworld/src/test/zasoby
[Informacje]
[Info] --- Maven-Compiller-Plugin: 3.1: TestCompile (Default-TestComple) @ helloworld ---
[Informacje] Wykryte zmiany - Rekompilowanie modułu!
[Ostrzeżenie] Kodowanie plików nie zostało ustawione za pomocą kodowania platformy UTF-8, i.mi. kompilacja jest
zależne od platformy!
[Informacje] Kompilowanie 1 plik źródłowego do/Users/Zak/_Work/LearnBuildScripts/LearnMaven
/helloworld/cel/klas testowy
[Informacje]
[Info] --- Maven-Surefire-Plugin: 2.12.4: Test (default-test) @ helloworld ---
[Informacje] Directory raportów pewnych:/Users/Zak/_Work/LearnBuildScripts/LearnMaven
/helloworld/cel/
pewne raporty
-------------------------------------------------------
T e s t s
-------------------------------------------------------
Bieganie com.Nazwa firmy.Witaj świecie.AppTest
Testy Uruchom: 1, awarie: 0, Błędy: 0, pominięty: 0, czas upłynął: 0.014 s
Wyniki :
Testy Uruchom: 1, awarie: 0, Błędy: 0, pominięty: 0
[Informacje]
[Info] --- Maven-Jar-Plugin: 2.4: Jar (Default-Jar) @ helloworld ---
[Info] Budowanie słoika:/Users/Zak/_Work/LearnBuildScripts/LearnMaven/Helloworld/Target/
Helloworld-1.0-Snapshot.słoik
[Informacje] ------------------------------------------------------------------------
[Info] Buduj sukces
[Informacje] ------------------------------------------------------------------------
[Info] Całkowity czas: 5.624 s
[Informacje] zakończone: 2018-01-27T00: 11: 10-08: 00
[Info] Pamięć końcowa: 16m/114m
[Informacje] ------------------------------------------------------------------------
Możesz uruchomić plik jar w ten sposób:
$ Java -CP Target/Helloworld -1.0-Snapshot.JAR COM.Nazwa firmy.Witaj świecie.App
Witaj świecie!
Plik JAR jest umieszczony w folderze docelowym.
Gradle
Gradle łączy moc mrówki i maven. Pierwsza wersja Gradle została wydana w 2012 roku. Widziała szybkie adopcje. Google używa go obecnie do systemu systemu Android.
Zamiast XML Gradle używa języka groovy. W rezultacie Skrypty kompilacji w stopniach są łatwiejsze do napisania i odczytania. Początkowo używał IVY do zarządzania zależnością, ale teraz używa własnego silnika zależności.
Profesjonaliści
- Zapewnia standaryzację, zachowując elastyczność
- Łatwe do odczytania i pisania skryptów kompilacji
- Lepiej w obsłudze wielu wersji zależności
- W stanie obsłużyć wiele języków i technologii programowania
- Aktywna społeczność pomaga opracować narzędzie
- Gradle DSL (język specyficzny dla domeny) sprawia, że jest to prosta struktura konfiguracji
- Gradle zapewnia ulepszenia wydajności przy użyciu stopniowo, kompilacji pamięci podręcznej i demona gradle
Cons
- Integracja IDE nie tak dobra jak Maven
Przykład gradle
Możesz zainstalować gradle stąd. Po skonfigurowaniu stopnia na swojej ścieżce możesz to sprawdzić:
$ gradle --version
------------------------------------------------------------
Gradle 4.5
------------------------------------------------------------
Czas budowania: 2018-01-24 17:04:52 UTC
Wersja: 77D0EC90636F43669DC794CA17EF80DD65457BEC
Groovy: 2.4.12
Ant: Apache Ant (TM) Wersja 1.9.9 Opracowano 2 lutego 2017 r
JVM: 1.8.0_74 (Oracle Corporation 25.74-B02)
OS: Mac OS x 10.11.6 x86_64
Następnie utwórz następującą strukturę katalogu:
Witaj świecie
|- buduj.Gradle
„- Src
|- Main
'- Java
'-- Witaj świecie
'-- Witaj świecie.Jawa
Dla Helloworld.Java umieścił kod z przykładu mrówek. I do budowy.Gradle Umieść następujący kod:
Zastosuj wtyczkę: „Java”
wersja = '1.0 '
Repozytoria
Mavencentral ()
zależności
Grupa testowa: „Junit”, nazwa: „Junit”, wersja: „4.12 '
Możesz użyć polecenia „Gradle Zadania -All”, aby spojrzeć na wszystkie dostępne polecenia. Gradle automatycznie podnosi wtyczki określone w kompilacji.plik gradtu i pokazuje dodatkowe dostępne zadania z powodu wtyczek.
Możesz uzyskać kompilację, biegając:
$ gradle słoik
Zbudować udane w 1s
2 zadania wykonujące: 2 wykonane
Możesz uruchomić swój słoik w ten sposób:
$ java -cp build/libs/helloworld -1 -1.0.Jar Helloworld
Witaj świecie!
Plik jar jest umieszczony w folderze kompilacji/libs.
Wniosek
Wśród narzędzi kompilacji ANT może być przydatny w mniejszych projektach, podczas gdy Maven jest lepszy, aby upewnić się, że wszyscy programiści przestrzegają tych samych zasad. Gradle to najnowsze narzędzie, które zapewnia największą elastyczność.
Bibliografia:
- http: // ant.Apache.org/
- http: // ant.Apache.org/bluszcz/
- https: // maven.Apache.org/
- https: // gradle.org/
- http: // makble.COM/gradle-junit-helloworld-przykład
- https: // przykłady.Javacodegeeks.com/core-java/gradle/gradle-hello-świat
- https: // gradle.org/maven-vs-gradle/
- https: // maven.Apache.org/przewodniki/dostanie się/maven-w-five-minuty.html
- https: // stackoverflow.COM/Pytania/20755437/Java-Build-Tools-Ant-VS-Maven
- https: //.COM/2014/06/18/Build-tools/
- https: // www.Quora.com/co-the-pros-i-cons-of-maven-versus-ant-as-building-tools-for-java