Dlaczego nikt nie używa make for Java?

Prawie każdy projekt Java, który widziałem, używa Mavena lub Ant. Są to doskonałe narzędzia i myślę, że każdy projekt może z nich korzystać. Ale co się stało z make ? Jest używany do różnych projektów innych niż Java i może łatwo obsługiwać Javę. Pewnie, że musisz pobrać make.exe jeśli używasz Windows, ale Ant i Maven również nie pochodzą z JDK.

Czy jest jakaś zasadnicza wada w make gdy jest używana z Javą? Czy tylko dlatego, że Ant i Maven są napisane w Java?

Author: User1, 2010-02-05

17 answers

Podstawowy problem w Make i Javie polega na tym, że Make działa w oparciu o założenie, że określisz zależność, a następnie regułę do rozwiązania tej zależności.

Z basic C, które zazwyczaj " do konwersji main.C file to a main.o Plik, Uruchom " CC main.c".

Możesz to zrobić w Javie, ale szybko się czegoś nauczysz.

Głównie, że kompilator javac ' A wolno się uruchamia.

Różnica Między:

javac Main.java
javac This.java
javac That.java
javac Other.java

I

javac Main.java This.java That.java Other.java

Jest noc i dzień.

/ Align = "center" bgcolor = "# e0ffe0 " / cesarz chin / / align = center /

Następnie łączymy to z faktem, że java ma tendencję do organizowania się jako grupy plików w katalogach, zamiast C i innych, które mają tendencję do bardziej płaskiej struktury. Make nie ma zbyt dużego bezpośredniego wsparcia dla pracy z hierarchiami plików.

Make również nie jest zbyt dobry w określaniu, które pliki są nieaktualne, na poziomie kolekcji.

Z mrówką przejdzie i podsumuje wszystkie pliki, które są nieaktualne, a następnie skompilować je za jednym razem. Make po prostu wywoła kompilator Javy na każdym pojedynczym pliku. Posiadanie make NOT do tego wymaga wystarczającej ilości zewnętrznych narzędzi, aby naprawdę pokazać, że Make nie jest całkiem do tego zadania. Dlatego powstały alternatywy takie jak Ant i Maven.
 168
Author: Will Hartung,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-24 16:19:15

Czcigodny make program radzi sobie z odrębnie skompilowanymi językami, takimi jak C i C++. Kompilujesz moduł, który używa #include do ściągania tekstu innych plików nagłówkowych i zapisuje pojedynczy plik obiektowy jako wyjście. Kompilator jest w dużej mierze systemem pojedynczym, z oddzielnym krokiem łączenia, aby powiązać pliki obiektowe do pliku wykonywalnego binarnego.

Jednak w Javie kompilator musi faktycznie skompilować inne klasy, które importujesz z import. Chociaż byłoby możliwe jest napisanie czegoś, co generowałoby wszystkie niezbędne zależności z kodu źródłowego Javy, tak aby make budowało klasy w odpowiedniej kolejności po kolei, to nadal nie zajmowałoby się przypadkami takimi jak kołowe zależności.

Kompilator Javy może być również bardziej wydajny poprzez buforowanie skompilowanych wyników innych klas podczas kompilowania kolejnych klas, które zależą od wyników już skompilowanych. Tego rodzaju automatyczna ocena zależności nie jest tak naprawdę możliwa przy make sam.

 31
Author: Greg Hewgill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-05 19:37:20

Pytanie opiera się na błędnym założeniu: nietrywialna liczba programistów do używać make. Zobacz Java Build Tools: Ant vs. Maven . Jeśli chodzi o to, dlaczego deweloper nie użyłby make: wielu deweloperów albo nigdy nie używało make, albo używało go i nienawidziło go ogniem, który pali gorętsze niż tysiąc słońc. Jako takie używają alternatywnych narzędzi.

 28
Author: Hank Gay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-05 19:41:47

W rzeczywistości make może obsłużyć rekompilację za pomocą jednego polecenia wszystkich przestarzałych plików Javy. Zmień pierwszą linię, jeśli nie chcesz kompilować wszystkich plików w katalogu lub chcesz mieć określoną kolejność...

JAVA_FILES:=$(wildcard *.java)
#
# the rest is independent of the directory
#
JAVA_CLASSES:=$(patsubst %.java,%.class,$(JAVA_FILES))

.PHONY: classes
LIST:=

classes: $(JAVA_CLASSES)
        if [ ! -z "$(LIST)" ] ; then \
                javac $(LIST) ; \
        fi

$(JAVA_CLASSES) : %.class : %.java
        $(eval LIST+=$$<)
 19
Author: user1251840,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-06 15:56:10

Wszystkie inne odpowiedzi na temat technicznych zalet każdego z nich są prawdziwe. Ant i Maven mogą być lepiej dopasowane do Javy niż make, lub jak podkreśla Hank Gay, mogą nie :)

Zapytałeś jednak, czy ma znaczenie, że Ant i Maven są napisane w Javie. Chociaż na StackOverflow nie bierzemy pod uwagę takich myśli (zamknięte! nie-związane z programowaniem! itd.), OCZYWIŚCIE, ŻE TO CZĘŚĆ SPRAWY. Na rails używamy Rake 'A, C-make' A, a w Javie Ant i Maven ' a. Choć prawdą jest, że mrówka lub Programiści Maven zaopiekują się programistą Javy może lepiej niż inni, jest jeszcze jedno pytanie: w czym piszesz zadania Ant? Java. Jeśli jesteś programistą Javy, jest to łatwe dopasowanie.

Więc tak, częścią tego jest używanie narzędzi napisanych w języku, który używasz.
 17
Author: Dan Rosenstark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-05 19:47:09

Ant i Później Maven zostały zaprojektowane, aby rozwiązać niektóre bóle głowy spowodowane przez Make (podczas tworzenia nowych w procesie ) To jest po prostu ewolucja.

...Wkrótce potem kilka projektów Javy open source uświadomiło sobie, że Ant może rozwiązać problemy z Makefiles....

Z http://ant.apache.org/faq.html#history

To, czy rozwiązują cokolwiek, czy po prostu tworzą dodatkowy format do nauki, jest subiektywnym tematem. Prawda jest taka, że prawie historia każdego nowego wynalazku: twórca mówi, że rozwiązuje wiele problemów, a pierwotni użytkownicy mówią, że są to cnoty.

Główną jego zaletą jest możliwość integracji z Javą.

Myślę, że podobna historia byłaby na przykład z rake.

 12
Author: OscarRyz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-05 19:43:13

Jednym z głównych problemów rozwiązywanych przez Mavena (i Ivy-enabled Ant setups) nad make jest automatyczne rozwiązywanie zależności i pobieranie plików jarów zależności.

 9
Author: Ophidian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-05 20:38:41

Myślę, że najbardziej prawdopodobnym wyjaśnieniem jest to, że kilka czynników zniechęcało do używania make w społeczności Javy w krytycznym okresie czasu (koniec lat 90.):

  1. ponieważ Java obejmuje wiele platform, Programiści Javy w ogóle nie byli tak biegli w narzędziach uniksowych, jak programiści ograniczeni do środowiska uniksowego (np. Programiści C i Perl). Należy pamiętać, że jest to ogólnie rzecz biorąc. Bez wątpienia są i byli utalentowani programiści Java z głębokim zrozumienie Uniksa.
  2. w konsekwencji byli mniej biegli w make i nie wiedzieli, jak skutecznie używać make.
  3. chociaż możliwe jest napisanie krótkiego i prostego pliku Makefile, który wydajnie kompiluje Javę, wymagana jest szczególna ostrożność, aby to zrobić w sposób niezależny od platformy.
  4. w konsekwencji pojawił się apetyt na samoistnie niezależne od platformy narzędzie do budowania.
  5. To właśnie w tym środowisku powstały Ant i Później Maven.

W skrócie, podczas gdy make z pewnością może być stosowany w projektach Java, był moment okazji, aby uczynić go de facto Java build tool. Ten moment minął.

 6
Author: David A. Ventimiglia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-12 16:17:13

Sprawiają, że skrypty są 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 rodzajem problemu.

 5
Author: Brian Fox,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-06 21:44:50

O ile nie jestem nikim założenie, że nikt nie jest (mis)używając make for java jest błędne.

"Managing Projects with GNU Make" (dostępny na licencji GFDL) zawiera kompletny rozdział poświęcony używaniu make z projektami Javy.

Ponieważ zawiera długą (i miejmy nadzieję uczciwą) listę zalet i wad używania make zamiast innych narzędzi, warto tam zajrzeć. (zobacz: http://oreilly.com/catalog/make3/book/)

 4
Author: mikyra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-03 05:43:09

Ant jest ulepszeniem zorientowanym na konfigurację XML w stosunku do plików Makefile, a Maven jest ulepszeniem narzędzia budowania zależności w stosunku do Ant. Niektóre projekty wykorzystują wszystkie trzy. Myślę, że projekty JDK wykorzystywały mieszankę makefiles i ant.

 3
Author: Berlin Brown,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-17 14:30:39

Krótka odpowiedź: ponieważ make nie jest dobrze. Nawet na froncie C pojawia się wiele alternatyw.

Długa odpowiedź: make ma kilka wad, które sprawiają, że ledwo nadaje się do kompilacji C i w ogóle nie nadaje się do kompilacji Javy. Możesz zmusić go do kompilacji Javy, jeśli chcesz, ale spodziewaj się napotkania problemów, z których niektóre nie mają odpowiedniego rozwiązania lub obejścia problemu. Oto kilka:

Rozwiązanie zależności

make inherently oczekuje, że pliki będą miały drzewo zależności od siebie, w których jeden plik jest wynikiem zbudowania kilku innych. To już działa wstecz w C, gdy mamy do czynienia z plikami nagłówkowymi. make wymaga wygenerowania specyficznego dla make pliku include reprezentującego zależność pliku C od jego plików nagłówkowych, więc zmiana na ten ostatni spowodowałaby przebudowę Prev. Ponieważ jednak sam plik C nie jest odtworzony (tylko przebudowany), make często wymaga podania celu jako .PHONY. Na szczęście GCC obsługuje generowanie tych plików automatycznie.

W Javie zależność może być okrągła i nie ma narzędzia do automatycznego generowania zależności klas w formacie make. ant'S Depend task może zamiast tego odczytać plik klasy bezpośrednio, określić, które klasy importuje i usunąć plik klasy, jeśli którakolwiek z nich jest nieaktualna. Bez tego, każda nietrywialna zależność może spowodować, że będziesz zmuszony używać powtarzających się czystych kompilacji, usuwając wszelkie korzyści z używania narzędzia do budowania.

Spacje w nazwach plików

While ani Java, ani C nie zachęcają do używania spacji w nazwach plików kodu źródłowego, w make może to być problem, nawet jeśli spacje znajdują się w ścieżce pliku. Rozważ na przykład, czy Twój kod źródłowy istnieje w C:\My Documents\My Code\program\src. To wystarczyłoby do złamania make. Dzieje się tak dlatego, że make traktuje nazwy plików jako ciągi znaków. ant traktuje ścieżki jako obiekty specjalne.

Skanowanie plików do budowy

make wymaga jawnego ustawienia, które pliki mają być budowane dla każdego celu. ant pozwala określić folder który ma być automatycznie skanowany w poszukiwaniu plików źródłowych. Może to wydawać się drobną wygodą, ale weź pod uwagę, że w Javie każda nowa klasa wymaga nowego pliku. Dodawanie plików do projektu może stać się dużym kłopotem.

I największy problem z make:

Make jest zależny od POSIX

Motto Javy to "Kompiluj raz uruchomiony wszędzie". Ale ograniczanie tej kompilacji do systemów opartych na POSIX, w których Obsługa Javy jest najgorsza, nie jest zamierzone.

Zasady budowania w {[0] } są zasadniczo małe bash Skrypty. Mimo że istnieje port make dla systemu Windows, aby działał poprawnie, musi być dołączony do portu bash, który zawiera warstwę emulacji POSIX dla systemu plików.

Występuje w dwóch odmianach:

  1. MSYS który próbuje ograniczyć tłumaczenie POSIX do ścieżek plików, a tym samym może mieć nieprzyjemne skutki przy uruchamianiu zewnętrznych narzędzi, które nie są specjalnie dla niego stworzone.

  2. cygwin które zapewnia pełną emulację POSIX. Powstałe programy jednak nadal polegają na tej warstwie emulacyjnej.

Z tego powodu w systemie Windows standardowe narzędzie do budowania nie jest nawet make, ale raczej MSBuild, które jest również narzędziem opartym na XML, w zasadzie bliższym ant.

Natomiast, {[7] } 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. On na tyle wszechstronny, że można łatwiej zbudować program C w systemie Windows używając ant niż używając make.

I ostatnia minor:

Nawet programy C nie używają make natywnie

Możesz początkowo tego nie zauważyć, ale programy C zazwyczaj nie są dostarczane z Makefile. Są one dostarczane z CMakeLists.txt, lub bash skrypt konfiguracyjny, który generuje rzeczywiste Makefile. Natomiast źródło programu Java zbudowanego przy użyciu ant jest dostarczane z skrypt ant wstępnie zbudowany. A {[29] } jest produktem innych narzędzi - tyle make nie nadaje się do samodzielnego budowania. ant jest samodzielna i zajmuje się wszystkim, czego potrzebujesz do procesu budowania Javy, bez żadnych dodatkowych wymagań i zależności.

Kiedy uruchamiasz ant na dowolnej platformie, po prostu działa (tm). Nie dostaniesz tego z make. Jest niesamowicie zależny od platformy i konfiguracji.

 3
Author: SlugFiller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-02 13:57:18

Jednym z głównych powodów jest to, że zarówno Ant, jak i Maven (oraz większość narzędzi SCM, CI i IDE przeznaczonych dla Javy) są napisane w Javie przez/for Java developers. Ułatwia to integrację ze środowiskiem programistycznym i pozwala innym narzędziom, takim jak serwery IDE i CI, na integrację części bibliotek ant / maven w ramach infrastruktury budowania / wdrażania.

 1
Author: Chris Nava,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-05 20:29:57

Pewnego razu pracowałem nad projektem Java, który używał gmake. Moje wspomnienia są mgliste, ale IIRC mieliśmy trudności z radzeniem sobie ze strukturą katalogów pakietów, jakiej oczekuje javac. Pamiętam też, że tworzenie plików JAR było kłopotem, chyba że masz coś trywialnego.

 1
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-08 19:55:57

Ant i Maven podchodzą do grafu zależności budowania 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 z make.

 0
Author: John Weldon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-05 19:37:21

Nigdy nie używałem GNU Make dla projektów Java, ale używałem jmk . Niestety nie została zaktualizowana od 2002 roku.

Miał pewną specyficzną dla Javy funkcjonalność, ale był na tyle mały, że można go było umieścić w źródłowym tarballu bez znacznego zwiększania jego rozmiaru.

Obecnie zakładam, że każdy programista Javy, z którym udostępniam kod, ma zainstalowaną Ant.

 0
Author: finnw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-05 20:16:56

ApacheAnt nie jest niczym podobnym do Make. Make polega na opisywaniu zależności między plikami i jak budować pliki. Ant jest o zależności między "zadania", i jest naprawdę bardziej sposobem na sklejenie skryptów budowania razem.

It may helps you AntVsMake

 0
Author: Venky Vungarala,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-17 10:48:47