Prawie każdy projekt Java, który widziałem, używa Mavena lub Anta. To dobre narzędzia i myślę, że każdy projekt może ich użyć. Ale to, co zdarzyło się zrobić ? Jest używany w różnych projektach innych niż Java i może z łatwością obsługiwać Javę. Oczywiście, jeśli używasz systemu Windows, musisz pobrać make.exe, ale Ant i Maven również nie są dostarczane z JDK.
Czy jest jakaś fundamentalna luka w make, gdy jest używana z Javą? Czy to tylko dlatego, że Ant i Maven są napisane w Javie?
make
. Posiadanie pliku makefile, który działa tylko w jednym systemie, nie jest zbyt przyjemne dla języka wieloplatformowego.Odpowiedzi:
Podstawowy problem z programami Make i Java polega na tym, że program Make działa w oparciu o założenie, że określono zależność, a następnie regułę rozwiązującą tę zależność.
W przypadku podstawowego C, to zazwyczaj „aby przekonwertować plik main.c do pliku main.o, należy uruchomić„ cc main.c ”.
Możesz to zrobić w Javie, ale szybko się czegoś nauczysz.
Przede wszystkim kompilator javac wolno się uruchamia.
Różnica pomiędzy:
i
jest noc i dzień.
Zaostrz to setkami zajęć, a stanie się to po prostu nie do utrzymania.
Następnie łączysz to z faktem, że java ma tendencję do organizowania się jako grupy plików w katalogach, w porównaniu z C i innymi, które mają bardziej płaską strukturę. Make nie ma bezpośredniego wsparcia w pracy z hierarchiami plików.
Make również nie jest zbyt dobry w określaniu, które pliki są nieaktualne na poziomie kolekcji.
Dzięki Ant przejrzy i podsumuje wszystkie nieaktualne pliki, a następnie skompiluje je za jednym razem. Make po prostu wywoła kompilator java dla każdego pojedynczego pliku. Jeśli Make NIE robi tego wymaga wystarczających narzędzi zewnętrznych, aby naprawdę pokazać, że Make nie jest w stanie sprostać temu zadaniu.
Dlatego pojawiły się alternatywy, takie jak Ant i Maven.
źródło
$?
zmienną automatyczną, która rozwija się do „wszystkich wymagań wstępnych, które są nowsze niż cel”. Istnieje również funkcja reguł wzorcowych z wieloma celami, które uruchamiają recepturę tylko raz, aby zaktualizować wszystkie.class
pliki. Łącząc to z jakiegoś sprytnego wykorzystania pliku / funkcje tekstowe podoba$(wildcard)
,$(shell)
,$(eval)
a można nauczyć makefile odkryć cele budowania rozproszonych w całej swojej strukturze katalogów.Czcigodny
make
program dość dobrze radzi sobie z oddzielnie kompilowanymi językami, takimi jak C i C ++. Kompilujesz moduł, używa on#include
do ściągania tekstu z innych plików dołączanych i zapisuje pojedynczy plik obiektowy jako wynik. Kompilator jest systemem działającym pojedynczo, z oddzielnym krokiem łączenia w celu powiązania plików obiektowych w wykonywalny plik binarny.Jednak w Javie kompilator musi faktycznie skompilować inne klasy, z którymi importujesz
import
. Chociaż byłoby możliwe napisanie czegoś, co generowałoby wszystkie niezbędne zależności z kodu źródłowego Javy, tak abymake
budować klasy w odpowiedniej kolejności pojedynczo, to nadal nie obsługiwałoby przypadków takich jak zależności cykliczne.Kompilator Java może być również bardziej wydajny, buforując skompilowane wyniki innych klas podczas kompilowania kolejnych klas, które zależą od wyników już skompilowanych. Ten rodzaj automatycznej oceny zależności nie jest naprawdę możliwy w przypadku
make
samego.źródło
Pytanie opiera się na błędnym założeniu: numer nietrywialne programistów zrobić korzystania
make
. Zobacz Java Build Tools: Ant vs. Maven . Jak, dlaczego deweloper nie będzie korzystać zmake
: wielu programistów bądź nigdy nie używanymake
, lub używał go i nienawidzili go z ognia, który płonie lepszy niż tysiąc słońc. W związku z tym używają alternatywnych narzędzi.źródło
make
ma wiele "funkcji", które mogły mieć sens, kiedy został napisany, ale teraz są bardziej podobne do błędów, np. W niektórych miejscach musisz użyć znaku TAB, a nie spacji. Takie rzeczy prawdopodobnie nie przeszkadzają ludziom, którzy są naprawdę doświadczenimake
, ale doprowadza resztę do szału.make depend
ktoś?)W rzeczywistości make może obsłużyć rekompilację wszystkich nieaktualnych plików Java za pomocą jednego polecenia. Zmień pierwszą linię, jeśli nie chcesz kompilować wszystkich plików w katalogu lub chcesz mieć określoną kolejność ...
źródło
Wszystkie inne odpowiedzi dotyczące technicznych zalet każdego z nich są prawdziwe.
Ant
iMaven
może lepiej pasować do Javy niż make, lub jak wskazuje Hank Gay, może nie :)Jednak zapytałeś, czy ma znaczenie, że Ant i Maven są napisane w Javie. Chociaż na StackOverflow nie bierzemy pod uwagę takich myśli (zamknięte! Niezwiązane z programowaniem! Itp.), OCZYWIŚCIE JEST TO CZĘŚĆ RZECZY. Na szynach używamy Rake'a, kolesie C używają make, aw Javie używamy Ant i Maven. Chociaż prawdą jest, że programiści Ant lub Maven będą opiekować się programistą Java być może lepiej niż inni, jest też inne pytanie: w czym piszesz zadania Ant? Jawa. Jeśli jesteś programistą Java, to łatwe dopasowanie.
Więc tak, częścią tego jest użycie narzędzi napisanych w języku, którego używasz.
źródło
make
pochodzi z systemu UNIX, więc narzędzia są wykonywane przez pisanie przydatnych kompaktowych narzędzi i łączenie ich razem. Dlatego większość zszywania jest wykonywana za pomocą poleceń powłoki.make
i małe narzędzia Unix. GIT jest również dzieckiem tego procesu. Osobiście nie powiedziałbym, że nie jest lepiej. Ale to ogromna zmiana paradygmatu dla programistów Java. Mrówka jest znacznie bardziej zgodna ze sposobem myślenia Javy.Ant, a później Maven zostały zaprojektowane, aby rozwiązać niektóre bóle głowy spowodowane
Make
(podczas tworzenia nowych w procesie) To tylko ewolucja.Z http://ant.apache.org/faq.html#history
To, czy coś rozwiązują, czy po prostu tworzą dodatkowy format do nauki, jest tematem subiektywnym. Prawda jest taka, że jest to prawie historia każdego nowego wynalazku: twórca twierdzi, że rozwiązuje wiele problemów, a pierwotni użytkownicy twierdzą, że są to zalety.
Jego główną zaletą jest możliwość integracji z java.
Myślę, że podobna historia byłaby
rake
na przykład.źródło
Jednym z głównych problemów rozwiązywanych przez Mavena (i konfiguracje Ant z obsługą Ivy) w związku z make jest automatyczne rozwiązywanie zależności i pobieranie plików JAR z zależnościami.
źródło
Myślę, że najbardziej prawdopodobnym wyjaśnieniem jest to, że kilka czynników zniechęcało do używania marki w społeczności Java w krytycznym okresie (późne lata 90-te):
Krótko mówiąc, chociaż make z całą pewnością może być używany w projektach Java, był moment, aby uczynić go de facto narzędziem do budowania Javy. Ta chwila minęła.
źródło
Tworzenie skryptów jest z natury zależne od platformy. Java ma być niezależna od platformy. Dlatego posiadanie systemu kompilacji, który działa tylko na jednej platformie dla wieloplatformowej bazy źródłowej, jest pewnym problemem.
źródło
Krótka odpowiedź: ponieważ
make
nie jest dobre. Nawet na froncie C widać wiele alternatyw.Długa odpowiedź:
make
ma kilka wad, które sprawiają, że ledwie nadaje się do kompilacji C, aw ogóle nie nadaje się do kompilowania Javy. Jeśli chcesz, możesz zmusić go do skompilowania Javy, ale spodziewaj się problemów, z których niektóre nie mają odpowiedniego rozwiązania lub obejścia. Tu jest kilka:Rozwiązanie zależności
make
z natury oczekuje, że pliki będą miały od siebie zależność podobną do drzewa, w której jeden plik jest wynikiem budowania kilku innych. To już działa odwrotnie w C, gdy mamy do czynienia z plikami nagłówkowymi.make
wymagamake
wygenerowania specyficznego pliku dołączanego, który będzie reprezentował zależność pliku C od jego plików nagłówkowych, więc zmiana tego ostatniego spowodowałaby odbudowanie poprzedniego. Jednak ponieważ sam plik C nie jest odtwarzany (tylko przebudowywany), make często wymaga określenia celu jako.PHONY
. Na szczęście GCC obsługuje automatyczne generowanie tych plików.W Javie zależność może być cykliczna i nie ma narzędzia do automatycznego generowania zależności klas w
make
formacie.ant
„sDepend
zadanie może, zamiast czytać plik klasy bezpośrednio określić, które klasy importuje i usunąć plik klasy, czy któryś z nich są nieaktualne. Bez tego każda nietrywialna zależność może spowodować, że będziesz zmuszony do korzystania z powtarzających się czystych kompilacji, usuwając wszelkie korzyści z używania narzędzia do kompilacji.Spacje w nazwach plików
Chociaż ani Java, ani C nie zachęcają do używania spacji w nazwach plików kodu źródłowego,
make
może to stanowić problem, nawet jeśli spacje znajdują się w ścieżce pliku. Rozważmy na przykład, czy Twój kod źródłowy istnieje wC:\My Documents\My Code\program\src
. To wystarczy, żeby się złamaćmake
. Dzieje się tak, ponieważmake
traktuje nazwy plików jako ciągi.ant
traktuje ścieżki jako obiekty specjalne.Skanowanie plików pod kątem kompilacji
make
wymaga jawnego ustawienia, które pliki mają być zbudowane dla każdego celu.ant
umożliwia określenie folderu, który ma być automatycznie skanowany w poszukiwaniu plików źródłowych. Może się to wydawać niewielkim ułatwieniem, ale weź pod uwagę, że w Javie każda nowa klasa wymaga nowego pliku. Dodawanie plików do projektu może szybko stać się dużym kłopotem.I największy problem z
make
:make jest zależne od POSIX
Mottem Javy jest „kompiluj raz, gdy uruchomisz się wszędzie”. Ale ograniczenie tej kompilacji do systemów opartych na POSIX, w których obsługa języka Java jest w rzeczywistości najgorsza, nie jest intencją.
Reguły budowania w
make
to zasadniczo małebash
skrypty. Mimo że istnieje portmake
systemu Windows, aby działał poprawnie, musi być dołączony do portubash
, który zawiera warstwę emulacji POSIX dla systemu plików.Występuje w dwóch odmianach:
MSYS
który próbuje ograniczyć translację POSIX do ścieżek plików i dlatego może mieć nieprzyjemne problemy podczas uruchamiania zewnętrznych narzędzi, które nie są specjalnie do tego przeznaczone.cygwin
co zapewnia pełną emulację POSIX. Powstałe programy nadal jednak polegają na tej warstwie emulacji.Z tego powodu w systemie Windows standardowe narzędzie do kompilacji wcale nie jest wcale
make
, ale raczejMSBuild
, które jest również narzędziem opartym na języku XML, w zasadzie bliższymant
.W przeciwieństwie do tego,
ant
jest zbudowany w Javie, może działać wszędzie i zawiera wewnętrzne narzędzia, zwane „zadaniami”, do manipulowania plikami i wykonywania poleceń w sposób niezależny od platformy. Jest na tyle wszechstronny, że w rzeczywistości łatwiej jest zbudować program w języku C w systemie Windows przy użyciuant
niż przy użyciumake
.I ostatnia drobna:
Nawet programy w C nie używają make natywnie
Możesz tego początkowo nie zauważyć, ale programy C zazwyczaj nie są dostarczane z rozszerzeniem
Makefile
. Są dostarczane ze skryptem konfiguracyjnymCMakeLists.txt
lubbash
skryptem konfiguracyjnym, który generuje rzeczywisty plikMakefile
. Z kolei źródło programu Java zbudowanego przy użyciuant
jest dostarczane z gotowymant
skryptem. AMakefile
jest produktem innych narzędzi - tylemake
nie nadaje się do samodzielnego budowania.ant
jest samodzielny i obsługuje wszystko, czego potrzebujesz do procesu tworzenia Java, bez żadnych dodatkowych wymagań ani zależności.Po uruchomieniu
ant
na dowolnej platformie to po prostu działa (tm). Nie możesz tego dostaćmake
. Jest niesamowicie zależny od platformy i konfiguracji.źródło
O ile nie jestem nikim, założenie, że nikt (niewłaściwie) używa make for java jest błędne.
„Zarządzanie projektami za pomocą GNU Make” (dostępne pod GFDL) zawiera kompletny rozdział poświęcony używaniu
make
z projektami java.Ponieważ zawiera długą (i miejmy nadzieję, uczciwą) listę zalet i wad używania make zamiast innych narzędzi, warto tam zajrzeć. (patrz: http://oreilly.com/catalog/make3/book/ )
źródło
Ant to ulepszenie zorientowane na konfigurację XML w stosunku do Makefiles, a Maven to ulepszenie narzędzia do budowania zależności w porównaniu z Ant. Niektóre projekty wykorzystują wszystkie trzy. Myślę, że projekty JDK używały mieszanki makefile i ant.
źródło
Jednym z głównych powodów jest to, że zarówno Ant, jak i Maven (oraz większość narzędzi SCM, CI i IDE ukierunkowanych na java) są napisane w języku Java przez / dla programistów Java. Ułatwia to integrację ze środowiskiem programistycznym i umożliwia innym narzędziom, takim jak serwery IDE i CI, integrację części bibliotek ant / maven w ramach infrastruktury budowania / wdrażania.
źródło
Kiedyś pracowałem nad projektem Java, który korzystał z gmake. Moje wspomnienia są mgliste, ale IIRC mieliśmy trudności z radzeniem sobie ze strukturą katalogów pakietów, której oczekuje javac. Pamiętam też, że tworzenie plików JAR było kłopotliwe, chyba że było coś trywialnego.
źródło
ApacheAnt w niczym nie przypomina Make. Make polega na opisywaniu zależności między plikami i tworzeniu plików. Ant dotyczy zależności między „zadaniami” i jest raczej sposobem łączenia ze sobą skryptów budowania.
może ci pomóc AntVsMake
źródło
Ant i Maven podchodzą do grafu zależności kompilacji i zarządzania nim z bardziej „nowoczesnego” punktu widzenia ... Ale jak mówi Oscar, stworzyli własne problemy, próbując rozwiązać stare problemy za pomocą make.
źródło
Nigdy nie używałem GNU Make w projektach Java, ale używałem jmk . Niestety nie był aktualizowany od 2002 roku.
Miał pewne funkcje specyficzne dla Javy, ale był na tyle mały, że można go było dołączyć do puli źródłowej bez znaczącego zwiększania jego rozmiaru.
Obecnie zakładam, że każdy programista Java, któremu udostępniam kod, ma zainstalowaną aplikację Ant.
źródło