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-wersjaApache 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:
W tym samym folderze helloworld utwórz plik ivy.xml z następującym kodem:
>
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łoikUdana kompilacja powinna zapewnić takie dane wyjściowe:
$ słoik mrówekBuildfile: /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 świecieWitaj ś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 --wersjaApache 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:
XMLSchema-instancja'
xsi:schemaLokalizacja=„http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0
_0.xsd>
>
>
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.AplikacjaWitaj ś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 gradBUDOWAĆ 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 świecieWitaj ś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:
- http://ant.apache.org/
- http://ant.apache.org/ivy/
- https://maven.apache.org/
- https://gradle.org/
- http://makble.com/gradle-junit-helloworld-example
- https://examples.javacodegeeks.com/core-java/gradle/gradle-hello-world-tutorial/
- https://gradle.org/maven-vs-gradle/
- https://maven.apache.org/guides/getting-started/maven-in-five-minutes.html
- https://stackoverflow.com/questions/20755437/java-build-tools-ant-vs-maven
- https://technologyconversations.com/2014/06/18/build-tools/
- https://www.quora.com/What-are-the-plus-and-cons-of-Maven-versus-Ant-as-building-tools-for-Java