Dlaczego Maven? Jakie są korzyści? [Zamknięte]

132

Jakie są główne zalety używania mavena w porównaniu z, powiedzmy, mrówką? Wydaje się, że jest to bardziej irytujące niż pomocne narzędzie. Używam maven 2, ze zwykłym Eclipse Java EE (bez m2eclipse) i tomcat.

Zwolennicy mavena w to wierzą

  1. Maven pozwala łatwo uzyskać zależności pakietów

  2. Maven zmusza Cię do posiadania standardowej struktury katalogów

Z mojego doświadczenia

  1. Ustalenie zależności pakietów naprawdę nie jest takie trudne. I tak rzadko to robisz. Prawdopodobnie raz podczas konfiguracji projektu i kilka innych podczas aktualizacji. Z maven w końcu naprawisz niedopasowane zależności, źle napisane poms i zrezygnujesz z wykluczeń pakietów.

  2. Powolny cykl FIX-COMPILE-DEPLOY-DEBUG, który zabija produktywność. To jest moje główne zastrzeżenie. Dokonujesz zmiany, musisz poczekać, aż kompilacja maven zacznie działać i poczekać, aż zostanie wdrożona. Żadnego wdrażania na gorąco.

A może po prostu robię to źle? Proszę, wskaż mi właściwy kierunek, mam uszy.

trix
źródło
1
Naprawdę interesuje mnie punkt 2. Czy ktoś jeszcze zauważa powolny cykl poprawiania-kompilowania-wdrażania? albo każdy trochę wie, ale milczy o tym, ponieważ maven jest najlepszą rzeczą, jaką mamy / najbardziej powszechną / najfajniejszą. Stworzenie wojny / ucha do rozmieszczenia jest wystarczająco złe, maven to pogarsza. Przeglądanie zmian jsp w projekcie maven w rozbitej strukturze katalogów zajmuje na moim komputerze około 5 sekund? mniej niż 1 sek. Mogę zapisywać wiele razy, a to kompiluje tylko ostatnią zmianę, na maven? każdy zapis uruchamia kompilację.
trix
Może to nie problem, ale obsługa / wtyczka IDE? Jednak maven istnieje już od jakiegoś czasu, jeśli nie możemy tego zrobić dobrze, czy powinniśmy przenieść / wymyślić / zaproponować coś innego? oprócz Ivy
trix
2
@Javid Chociaż tytuł pytania wygląda podobnie, treść pytania jest inna IMO i nie uważam tego za oszustwo.
Pascal Thivent
Przez chwilę brzmiało to tak, jakbyś mówił o NuGet ...
micahhoover

Odpowiedzi:

109

Ustalenie zależności pakietów naprawdę nie jest takie trudne. I tak rzadko to robisz. Prawdopodobnie raz podczas konfiguracji projektu i kilka innych podczas aktualizacji. Z maven w końcu naprawisz niedopasowane zależności, źle napisane poms i zrezygnujesz z wykluczeń pakietów.

Nie jest to trudne ... do projektów zabawek. Ale projekty, nad którymi pracuję, mają ich wiele, naprawdę wiele i bardzo się cieszę, że mogę je przejąć, mając dla nich ustandaryzowany schemat nazewnictwa. Ręczne zarządzanie tym wszystkim byłoby koszmarem.

I tak, czasami trzeba popracować nad zbieżnością zależności. Ale pomyśl o tym dwa razy, nie jest to nieodłączne dla Mavena, jest to nieodłączne dla każdego systemu używającego zależności (i mówię tutaj ogólnie o zależnościach Java).

Więc z Antem musisz wykonać tę samą pracę, z wyjątkiem tego, że musisz zrobić wszystko ręcznie: pobranie jakiejś wersji projektu A i jego zależności, pobranie jakiejś wersji projektu B i jego zależności, samodzielne ustalenie, jakich dokładnych wersji używają, sprawdzenie że się nie pokrywają, sprawdzanie, czy nie są niekompatybilne itp. Witaj w piekle.

Z drugiej strony Maven obsługuje zarządzanie zależnościami i pobierze je dla mnie przechodnie i daje mi narzędzia potrzebne do zarządzania złożonością związaną z zarządzaniem zależnościami : mogę analizować drzewo zależności, kontrolować wersje używane w zależnościach przechodnich, wykluczać niektóre z je , jeśli to konieczne, kontrolować Converge całej modułów itp nie ma magicznej. Ale przynajmniej masz wsparcie.

I nie zapominaj, że zarządzanie zależnościami to tylko niewielka część tego, co oferuje Maven, jest o wiele więcej (nie wspominając nawet o innych narzędziach, które ładnie integrują się z Maven, np. Sonar ).

Powolny cykl FIX-COMPILE-DEPLOY-DEBUG, który zabija produktywność. To jest moje główne zastrzeżenie. Dokonujesz zmiany, musisz poczekać, aż kompilacja maven zacznie działać i poczekać, aż zostanie wdrożona. Żadnego wdrażania na gorąco.

Po pierwsze, dlaczego używasz Mavena w ten sposób? Ja nie. Używam mojego IDE do pisania testów, kodu, dopóki nie przejdą, refaktoryzacji, wdrażania, wdrażania na gorąco i uruchamiania lokalnej kompilacji Mavena, gdy skończę, przed zatwierdzeniem, aby upewnić się, że nie zepsuję ciągłej kompilacji.

Po drugie, nie jestem pewien, czy użycie Anta poprawiłoby sytuację. Z mojego doświadczenia wynika, że ​​modularne kompilacje Mavena przy użyciu zależności binarnych zapewniają mi szybszy czas kompilacji niż typowe monolityczne kompilacje Ant. W każdym razie spójrz na Maven Shell, aby uzyskać gotowe do (ponownego) użycie środowiska Maven (które jest niesamowite).

Na koniec, przykro mi to mówić, to nie Maven zabija Twoją produktywność, ale nadużywanie narzędzi. A jeśli nie jesteś z tego zadowolony, cóż, cóż mogę powiedzieć, nie używaj tego. Osobiście używam Mavena od 2003 roku i nigdy nie oglądałem się za siebie.

Pascal Thivent
źródło
@ Pascal, czy możesz powiedzieć, jakich narzędzi używasz? IDE, wtyczki itp. Czy chcesz nam powiedzieć, że jeśli zmienię plik .properties lub plik jsp, zostanie on wdrożony na gorąco bez wykonywania kompilacji maven? (może wdrożenie na gorąco nie jest tutaj właściwym terminem). Nie rozumiałem, co mam na myśli mówiąc o mrówce. Miałem na myśli użycie standardowego katalogu eksplodowanego podczas tworzenia i użycie ant do stworzenia wojny / ucha przed wydaniem. W przypadku katalogu rozstrzelonego zasady są proste, kopiuj / kompiluj pliki z src do klas i nie zmieniaj reszty.
trix
ciąg dalszy ... Jednak w moich projektach wdrażam na tomcat słoiki modułów. Jeśli zmienię .jsp, czy maven nie musi odbudowywać tych słoików?
trix
4
Musisz przyznać, że większość projektów to projekty zabawek, czyli proste zależności. To tylko prawo statystyki.
trix
2
@trix, o gorącym wdrożeniu Ant vs. maven: jeśli nie robisz kompilacji Ant do gorącego wdrożenia, dlaczego używasz Mavena do tego samego? Myślę, że jeśli użyjesz mrówki do tego samego, zajmie to co najmniej tyle samo czasu ... prawda?
Reddy
2
Więc Pascal, czy mógłbyś nam powiedzieć, jak masz projekt skonfigurowany zgodnie z naturą Maven i nie używasz procesu kompilacji do wdrażania? To jest drugi punkt pierwszego pytania. Zastanawiam się, jak to zrobić, więc naprawdę doceniam, jeśli jesteś w stanie udzielić nam jasnego wyjaśnienia.
20

Maven można uznać za kompletne narzędzie do tworzenia projektów, a nie tylko narzędzie do budowania, takie jak Ant. Powinieneś używać Eclipse IDE z wtyczką maven, aby naprawić wszystkie problemy.

Oto kilka zalet Mavena, przytoczonych ze strony Korzyści z używania Mavena :

Henning

  • szybka konfiguracja projektu, żadnych skomplikowanych plików build.xml, tylko POM i gotowe
  • wszyscy programiści w projekcie używają tych samych zależności jar dzięki scentralizowanemu POM.
  • pobieranie szeregu raportów i metryk dla projektu „za darmo”
  • zmniejsz rozmiar dystrybucji źródeł, ponieważ słoiki można pobrać z centralnej lokalizacji

Emmanuel Venisse

  • dostępnych jest wiele celów, więc nie jest konieczne opracowywanie określonej części procesu kompilacji w przeciwieństwie do ANT możemy ponownie wykorzystać istniejące zadania ANT w procesie kompilacji za pomocą wtyczki antrun

Jesse Mcconnell

  • Promuje modułowe projektowanie kodu. Ułatwiając zarządzanie wieloma projektami, pozwala na rozłożenie projektu na wiele logicznych części, łącząc te części razem za pomocą śledzenia zależności w plikach pom.
  • Wymusza modułowe projektowanie kodu. łatwo jest płacić ustom za kod modułowy, ale gdy kod jest w osobnych projektach kompilujących, niemożliwe jest zapylenie odwołań między modułami kodu, chyba że wyraźnie zezwolisz na to w zarządzaniu zależnościami ... nie ma po prostu zrób to teraz i napraw później ”.
  • Zarządzanie zależnościami jest jasno określone. Dzięki mechanizmowi zarządzania zależnościami musisz spróbować schrzanić wersję swojego jar… nie ma żadnego klasycznego problemu „która wersja tego słoika dostawcy to jest?” A ustawienie go w istniejącym projekcie zrywa górę z istniejącego bałaganu, jeśli istnieje, gdy jesteś zmuszony do tworzenia `` nieznanych '' wersji w swoim repozytorium, aby wszystko uruchomić i uruchomić ... to lub okłamiesz się, że znasz aktualna wersja ABC.jar.
  • Silny typowany cykl życia istnieje ściśle określony cykl życia, przez który system oprogramowania przechodzi od rozpoczęcia tworzenia do końca ... a użytkownicy mogą mieszać i dopasowywać swój system do cyklu życia zamiast łączyć ze sobą własny cykl życia. . ma to dodatkową zaletę, ponieważ pozwala ludziom przejść z jednego projektu do drugiego i mówić przy użyciu tego samego słownictwa w zakresie tworzenia oprogramowania

Vincent Massol

  • Większy rozmach: Ant jest teraz dziedzicem i nie porusza się szybko do przodu. Maven szybko posuwa się naprzód i istnieje potencjał posiadania wielu wartościowych narzędzi wokół Maven (CI, projekt Dashboard, integracja IDE itp.).
YoK
źródło
5
Podczas głosowania w dół proszę podać powód, to nie jest powiedziane, ale zasada etyczna dotycząca przepełnienia stosu.
YoK
1
Nie ma nic złego w odniesieniach, ale naprawdę musisz jasno powiedzieć, że treść nie jest Twoja.
Pascal Thivent
Dzięki. Upewnię się, że zacytuję go inaczej niż tylko wspomnę, skąd się wziął. zaledwie 30 nieparzystych dni w stackoverflow i wciąż się uczy sztuki :).
YoK
11

Ustalenie zależności dla małych projektów nie jest trudne. Ale kiedy zaczniesz zajmować się drzewem zależności z setkami zależności, sprawy mogą łatwo wymknąć się spod kontroli. (Mówię tu z doświadczenia ...)

Inną kwestią jest to, że jeśli używasz IDE z kompilacją przyrostową i obsługą Maven (jak Eclipse + m2eclipse), powinieneś mieć możliwość skonfigurowania edycji / kompilacji / wdrażania na gorąco i testowania.

Osobiście tego nie robię, ponieważ zacząłem nie ufać temu sposobowi rozwoju z powodu złych doświadczeń z przeszłości (przed Mavenem). Być może ktoś może skomentować, czy to faktycznie działa z Eclipse + m2eclipse.

Stephen C.
źródło
Można zacząć od mavena, aby pobrać wszystkie zależności, a następnie skopiować zależności do swojego projektu, prawda?
trix
2
Myślę, że mógłbyś. Ale to mogłoby się zepsuć, gdybyś zaktualizował zależności projektu ... lub gdyby twój projekt zależał od migawek.
Stephen C
Mam na myśli 2 projekty, jedynym celem projektu maven jest uzyskanie zależności. Użyj kontroli wersji, aby śledzić zmiany między aktualizacjami zależności. Robię to mimo wszystko, żeby zobaczyć zmiany, na wypadek, gdyby zepsuło to moją kompilację.
trix
4
Ughh. Nie do tego jest przeznaczony Maven. Jedną z największych zalet Mavena jest unikanie sprawdzania bibliotek zależnych pod kątem kontroli wersji. Dzięki takiemu podejściu zaśmiecisz swój system VCS wieloma wersjami wielu plików binarnych. Niektóre systemy VCS szczególnie źle radzą sobie z obsługą plików binarnych.
Stephen C
2
Generalnie podczas pisania programów uczysz się na
własnej skórze
9

Maven jest jednym z narzędzi, w którym musisz z góry zdecydować , że ci się podoba i chcesz z niego korzystać, ponieważ spędzisz trochę czasu na nauce, a podjęcie tej decyzji raz na zawsze pozwoli ci pominąć wszystkie rodzaje wątpliwości podczas nauki (bo lubisz to i chcesz to wykorzystać)!

Silne konwencje pomagają w wielu miejscach - takich jak Hudson, który potrafi zdziałać cuda dzięki projektom Maven - ale na początku może być trudno to zauważyć.

edycja: od 2016 roku Maven jest jedynym narzędziem do budowania języka Java, w którym wszystkie trzy główne środowiska IDE mogą korzystać ze źródeł po wyjęciu z pudełka. Innymi słowy, użycie maven sprawia, że ​​twoja kompilacja staje się agnostyczna. Pozwala to np. Na korzystanie z profilowania Netbeans, nawet jeśli normalnie pracujesz w eclipse

Thorbjørn Ravn Andersen
źródło
1
I odwrotnie, wiele osób przychodzi do majsterkowania z uprzedzoną nienawiścią, bo to nie jest mrówka itp.
Goibniu
Przeciwieństwo? Masz na myśli?
Thorbjørn Ravn Andersen
9

Maven ma kilka zalet w porównaniu z mrówkami. Tutaj próbuję je podsumować.

Konwencja nad konfiguracją
Maven wykorzystuje charakterystyczne podejście do układu projektu i uruchamiania, które ułatwia przejście do projektu. Zwykle potrzeba tylko sumy kontrolnej i polecenia maven, aby uzyskać artefakty projektu.

Modularyzacja
projektu Konwencje projektu sugerują (lub lepiej, zmuszają) dewelopera do modularyzacji projektu. Zamiast monolitycznego projektu często jesteś zmuszony podzielić projekt na mniejsze komponenty podrzędne, co ułatwia debugowanie i zarządzanie ogólną strukturą projektu

Zarządzanie zależnościami i cykl życia projektu
Ogólnie, z dobrą konfiguracją SCM i wewnętrznym repozytorium, zarządzanie zależnościami jest dość łatwe i znowu jesteś zmuszony myśleć w kategoriach cyklu życia projektu - wersje komponentów, zarządzanie wydaniami i tak dalej. Trochę bardziej skomplikowane niż coś mrówkowego, ale znowu poprawa jakości projektu.

Co jest nie tak z mavenem?
Maven nie jest łatwe. Cykl tworzenia (co i kiedy jest zrobione) nie jest tak jasny w POM. Pojawiają się również problemy z jakością komponentów i brakującymi zależnościami w repozytoriach publicznych.
Najlepszym podejściem (dla mnie) jest posiadanie wewnętrznego repozytorium do buforowania (i utrzymywania) zależności oraz zastosowanie do zarządzania wydaniami komponentów. W przypadku projektów większych niż przykładowe projekty w książce, podziękujesz mavenowi przed lub po

Luca Botti
źródło
6

Maven może zapewnić korzyści dla Twojego procesu kompilacji, stosując standardowe konwencje i praktyki w celu przyspieszenia cyklu rozwoju, a jednocześnie pomaga osiągnąć wyższy wskaźnik sukcesu. Aby uzyskać bardziej szczegółowe informacje o tym, w jaki sposób Maven może pomóc Ci w procesie rozwoju, zapoznaj się z Korzyściami z używania Maven.

user433555
źródło
3

Maven to potężne narzędzie do zarządzania projektami oparte na POM (model obiektowy projektu). Służy do tworzenia projektów, zależności i dokumentacji. Upraszcza proces budowania, podobnie jak ANT. Ale jest zbyt zaawansowany niż ANT. Maven pomaga w zarządzaniu - kompilacjami, dokumentacją, raportowaniem, SCM, wydaniami, dystrybucją. - repozytorium maven to katalog spakowanego pliku JAR z plikiem pom.xml. Maven wyszukuje zależności w repozytoriach.

Nikhil Pahariya
źródło
2

Nigdy nie trafiłem na punkt 2? Czy możesz wyjaśnić, dlaczego uważasz, że wpływa to w jakikolwiek sposób na wdrożenie. Jeśli cokolwiek, maven pozwala na strukturyzację projektów w sposób modułowy, który faktycznie pozwala na poprawki błędów w określonej warstwie i umożliwia na przykład niezależne tworzenie API od pozostałej części projektu.

Możliwe, że próbujesz upchnąć wszystko w jednym module, w takim przypadku problem nie jest wcale maven, ale sposobem, w jaki go używasz.

Goibniu
źródło
Używam zwykłej jee eclipse, maven 2 i tomcat. Oczywiście aplikacja internetowa. Jeśli zmieniam plik właściwości lub plik jsp, aby zobaczyć moje zmiany w tomcat, maven musi wykonać kompilację, utworzyć war / ear i wdrożyć na tomcat. Jest to powolne w porównaniu z sytuacją, gdy używam rozstrzelonej struktury katalogów.
trix
1
@trix Hot deploy pod Eclipse z Tomcat po prostu działa. Robisz to źle.
Pascal Thivent
0

To powinien być komentarz, ale nie pasował do długości komentarza, więc opublikowałem go jako odpowiedź.

Wszystkie korzyści wymienione w innych odpowiedziach można osiągnąć prostszymi środkami niż przy użyciu Mavena. Jeśli na przykład jesteś nowy w projekcie, i tak spędzisz więcej czasu na tworzeniu architektury projektu, łączeniu komponentów, kodowaniu niż na pobieraniu słoików i kopiowaniu ich do folderu lib. Jeśli masz doświadczenie w swojej domenie, to już wiesz, jak rozpocząć projekt od jakich bibliotek. Nie widzę żadnej korzyści z używania mavena, zwłaszcza gdy stwarza wiele problemów podczas automatycznego wykonywania „zarządzania zależnościami”.

Mam tylko średniozaawansowaną znajomość Mavena, ale mówię Ci, że robiłem duże projekty (takie jak ERP) bez korzystania z Mavena.

Syed Aqeel Ashiq
źródło