Co to jest Maven? Kompilacja i zarządzanie zależnościami dla języka Java

Apache Maven jest kamieniem węgielnym programowania w języku Java i najczęściej używanym narzędziem do zarządzania kompilacjami dla języka Java. Uproszczony, oparty na XML model konfiguracji Maven umożliwia programistom szybkie opisanie lub uchwycenie zarysu dowolnego projektu opartego na Javie, co sprawia, że ​​rozpoczynanie i udostępnianie nowych projektów jest bardzo proste. Maven obsługuje również rozwój oparty na testach, długoterminową konserwację projektu, a jego deklaratywna konfiguracja i szeroki zakres wtyczek sprawiają, że jest popularną opcją dla CI / CD. Ten artykuł to krótkie wprowadzenie do Mavena, w tym Maven POM i struktura katalogów oraz polecenia do tworzenia pierwszego projektu Mavena.

Zauważ, że najnowszą wersją Mavena w chwili pisania tego tekstu jest Maven 3.6.3.

Maven kontra Ant i Gradle

Maven nie jest jedynym narzędziem do budowania w ekosystemie Java, chociaż jest najbardziej popularne. Ant, wcześniejsza generacja narzędzia konfiguracyjnego opartego na XML, nie ma standardowych, opartych na konwencji praktyk i zarządzania zależnościami Mavena, ale oferuje elastyczność, której nie znajdziesz w Maven. Gradle to nowsze narzędzie, które działa na szczycie ekosystemu Maven (przy użyciu repozytoriów Maven), ale obsługuje konfigurację przy użyciu DSL opartego na Groovy lub Kotlin. Wszystkie trzy są same w sobie dobrymi narzędziami do budowania i każdy z nich można zintegrować z procesem CI / CD. Liczy się wybór odpowiedniego do swoich potrzeb i umiejętność odpowiedniego wykorzystania.

Jak działa Maven

Podobnie jak wiele wspaniałych narzędzi, Maven bierze to, co kiedyś było nadmiernie skomplikowane (piekło konfiguracji) i upraszcza to do strawnych części. Maven składa się z trzech elementów:

  • POM: plik opisujący projekt Maven i jego zależności.
  • Katalog: znormalizowany format opisu projektu Mavena w POM.
  • Repozytoria: miejsce przechowywania i wykrywania oprogramowania innych firm.

Maven POM : każdy projekt Java, który używa Maven, ma plik POM (model obiektu projektu) w swoim katalogu głównym. pom.xmlOpisuje zależności projektu i powie Ci, jak je zbudować. ( Zależności to oprogramowanie innych firm wymagane przez projekt. Niektóre typowe przykłady to JUnit i JDBC. Zobacz centralne repozytorium Maven, aby uzyskać listę wszystkich dostępnych narzędzi i popularnych zależności).

Katalog Maven : Katalog Maven implementuje tak zwaną konwencję zamiast konfiguracji , eleganckie rozwiązanie do piekła konfiguracji. Zamiast wymagać od programistów definiowania układu i ręcznie konfigurowanych komponentów dla każdego nowego projektu (jak to miało miejsce w przypadku makefilei Ant), Maven ustanawia wspólną strukturę projektu i oferuje standardowy format pliku do opisania jego działania. Po prostu podłączasz swoje wymagania, a Maven wywołuje zależności i konfiguruje projekt za Ciebie.

Scentralizowane repozytoria : wreszcie Maven używa scentralizowanych repozytoriów do wykrywania i publikowania pakietów projektów jako zależności. Kiedy odwołujesz się do zależności w swoim projekcie, Maven wykryje ją w scentralizowanym repozytorium, pobierze ją do repozytorium lokalnego i zainstaluje w projekcie. Przez większość czasu wszystko to jest niewidoczne dla Ciebie jako programisty.

Dostęp do zależności Maven

Domyślnie Maven rozwiązuje zależności z centralnego repozytorium Maven. Popularną alternatywą jest JCenter, który ma szerszy zestaw dostępnych pakietów. Organizacje publikują również i hostują wewnętrzne repozytoria, które mogą być publiczne lub prywatne. Aby uzyskać dostęp do repozytorium, określasz jego adres URL w Maven POM lub możesz poinstruować Mavena, aby szukał w innych repozytoriach.

Instalowanie Mavena

Maven to projekt Java, więc zanim go zainstalujesz, musisz mieć zainstalowany JDK w swoim środowisku programistycznym. (Więcej informacji na temat pobierania i instalowania pakietu JDK można znaleźć w artykule „Co to jest JDK? Wprowadzenie do zestawu Java Development Kit”).

Gdy masz już skonfigurowane środowisko programistyczne Java, możesz zainstalować Maven w zaledwie kilku krokach:

  1. Pobierz najnowszą wersję Mavena (Maven 3.6.3 w chwili pisania tego tekstu).
  2. Rozpakuj apache.mavenplik .zip w dogodnym miejscu.
  3. Umieść ten plik na swojej ścieżce. Na przykład w systemie Unix lub Linux: export PATH=$PATH:/home/maven/.

Powinieneś teraz mieć dostęp do mvnpolecenia. Wpisz, mvn -vaby upewnić się, że pomyślnie zainstalowałeś Maven.

Maven POM

Katalogiem głównym każdego projektu Maven jest pom.xmlplik. Pomimo reputacji uciążliwego XML w rzeczywistości działa całkiem dobrze w tym przypadku użycia. POM Maven jest łatwy do odczytania i ujawnia wiele z tego, co dzieje się w projekcie. (Jeśli pracowałeś z JavaScript, pom.xmlma on podobny cel jak package.jsonplik Node NPM ).

Listing 1 przedstawia bardzo prostego Mavena pom.xml.

Listing 1. Simple Maven POM

   4.0.0 com.javaworld what-is-maven 1.0-SNAPSHOT Simple Maven Project jar   junit junit 4.12 test    

Zrozumienie Maven POM

Kiedy już to zrozumiesz, POM nie jest tajemniczy. Na początek możesz przejrzeć preambułę XML, która po prostu odwołuje się do oficjalnego schematu POM. Zwróć jednak uwagę, że XML zaczyna się od modelVersion. To mówi Mavenowi, jakiej wersji POM ma użyć, w tym przypadku Maven POM 4.0.0.

Następnie trzeba groupId, artifactIdi version. Razem te trzy atrybuty jednoznacznie identyfikują każdy zasób zarządzany przez Mavena w repozytorium. Te atrybuty w górnej części pliku opisują projekt Maven.

Teraz spójrz na dependenciessekcję POM, w której opisujemy zależności projektu. W tym przypadku do tej pory pobraliśmy tylko jedną zależność, JUnit. Zauważ, że JUnit jest także opisana w kategoriach jego groupId, artifactIdi version.

Niezależnie od tego, czy opisujesz własny projekt, czy zależność od projektu, te wartości konsekwentnie informują Maven, gdzie znaleźć projekt w repozytorium Maven i która wersja jest dostępna do użycia.

Hostowanie projektu w repozytorium Maven

Należy pamiętać, że POM definiuje wszystko, czego potrzebuje Twój projekt, ale także opisuje Twój projekt jako potencjalną zależność. Jeśli budujesz projekt, który będzie zależnością - powiedzmy, tworząc bibliotekę dla innych projektów - będziesz musiał udostępnić ją na jeden z czterech sposobów:

  1. Udostępnij go lokalnie.
  2. Opublikuj w prywatnie zarządzanym zdalnym repozytorium.
  3. Publikuj w prywatnym repozytorium w chmurze.
  4. Publikuj w publicznym repozytorium, takim jak Maven Central.

W pierwszym przypadku w ogóle nie korzystasz ze zdalnego repozytorium. Zamiast tego inni programiści pobiorą i zainstalują Twój projekt lokalnie w swoim repozytorium Maven, używając mvn installpolecenia.

W drugim przypadku używasz hostowanego repozytorium Maven, używając prywatnie kontrolowanego serwera do publikowania i pobierania zależności. Do tego potrzebny jest menedżer repozytorium, taki jak Apache Archiva.

Nowszą alternatywą jest użycie prywatnego zdalnego repozytorium, ale poleganie na usłudze w chmurze do zarządzania nim, na przykład Cloudsmith. Daje to korzyść zdalnie hostowanych zależności bez konieczności wstawiania serwera repozytorium. Ta usługa jest oczywiście odpłatna.

Wreszcie niewielki procent projektów trafi do repozytorium Central Maven lub JCenter, które są przeznaczone dla powszechnie używanych, publicznych pakietów. Jeśli tworzysz zależność typu open source, która ma być używana przez innych, będziesz potrzebować jednego z tych scentralizowanych repozytoriów, aby udostępnić swoją pracę światu.

  • Dowiedz się więcej o hostowaniu projektu w repozytorium Maven i uzyskaj listę dostępnych repozytoriów.
  • Zobacz oficjalną dokumentację Mavena na temat wtyczki Maven Release, używanej do przygotowywania i zarządzania oprogramowaniem publikowanym w repozytorium Maven.

Zbuduj pakiet Maven

Jeśli utworzysz pom.xmlz Listingu 1 i umieścisz go w katalogu, będziesz mógł uruchamiać polecenia Mavena przeciwko niemu. Maven ma wiele poleceń, a więcej jest dostępnych za pośrednictwem wtyczki, ale wystarczy znać ich garść, aby rozpocząć.

Jako pierwsze polecenie spróbuj wykonać mvn package. Mimo że nie masz jeszcze żadnego kodu źródłowego, wykonanie tego polecenia nakazuje Mavenowi pobranie zależności JUnit. Możesz sprawdzić dane wyjściowe rejestrowania Mavena, aby zobaczyć, że zależność została załadowana.

Zakres zależności

Być może zauważyłeś zależność JUnit w przykładzie POM jest oznaczona jako scope test. Zakres jest ważną koncepcją w zarządzaniu zależnościami, zasadniczo umożliwiającą zdefiniowanie i ograniczenie sposobu, w jaki każda zależność będzie wywoływana i używana w projekcie. testZakres zapewnia, że zależność jest dostępna podczas uruchamiania testów, ale nie wtedy, gdy aplikacja jest pakowana do wdrożenia.

Innym powszechnym zakresem jest provided, który informuje platformę, że zależność jest zapewniana przez środowisko wykonawcze. Jest to często widoczne w przypadku plików JARS serwletów podczas wdrażania w kontenerze serwletów, ponieważ kontener zapewni te pliki JARS. Zobacz dokumentację Apache Maven, aby uzyskać pełną listę zakresów zależności Maven.

Struktura katalogów Mavena

Po wykonaniu polecenia zwróć uwagę, że Maven utworzył /targetkatalog. To jest standardowa lokalizacja dla wyników twojego projektu. Pobrane zależności będą znajdować się w /targetkatalogu wraz z artefaktami skompilowanej aplikacji.

Następnie chcesz dodać plik Java, który umieścisz w src/katalogu Maven . Utwórz /src/main/java/com/javaworld/Hello.javaplik z zawartością Listingu 2.

Listing 2. Hello.java

 com.javaworld public class Hello { public static void main(String[] args){ System.out.println("Hello, JavaWorld"); } } 

/srcŚcieżka jest standardowym miejscem dla plików źródłowych Twojego projektu. Większość projektów umieszcza swoje główne pliki w folderze /src/main/, a pliki Java przechodzą do ścieżki klas poniżej /java. Ponadto, jeśli chcesz dołączyć zasoby, które nie są kodem, takie jak pliki konfiguracyjne lub obrazy, możesz użyć /src/main/resources. Zasoby w tej ścieżce zostaną dodane do głównej ścieżki klas. Pliki testowe trafiają do /src/test/java.

Aby przejrzeć, oto kilka kluczowych części struktury projektu Maven (zgodnie z definicją w standardowej strukturze katalogów Maven):

Kluczowe części standardowej struktury katalogów Maven

pom.xml Plik deskryptora projektu
/ src / main / java Lokalizacja plików źródłowych
/ src / main / resources Lokalizacja aktywów innych niż źródła
/ src / test / java Lokalizacja testowych plików źródłowych
/cel Lokalizacja danych wyjściowych kompilacji

Zarządzanie projektem Maven

mvn packagePolecenie nakazuje Maven aby zbierać projektu. Wydaj to polecenie, gdy będziesz gotowy zebrać wszystkie pliki projektu w jednym miejscu. Przypomnij sobie, że w pliku POM dla tego projektu ustawiliśmy typ pakowania na jar, więc to polecenie mówi Mavenowi, aby spakował pliki aplikacji do JAR.

Maven oferuje szereg dodatkowych opcji kontrolowania sposobu zarządzania plikiem JAR, niezależnie od tego, czy jest to gruby, czy cienki plik JAR, oraz określania pliku wykonywalnego mainclass. Zobacz dokumentację Maven, aby dowiedzieć się więcej o zarządzaniu plikami w Maven.

Po spakowaniu projektu prawdopodobnie będziesz chciał wydać plik mvn install. To polecenie wypycha projekt do lokalnego repozytorium Maven. Gdy znajdzie się w lokalnym repozytorium, jest dostępny dla innych projektów Maven w twoim lokalnym systemie. Jest to przydatne w przypadku scenariuszy programistycznych, w których Ty i / lub Twój zespół tworzycie pliki JAR zależności, które nie zostały jeszcze opublikowane w centralnym repozytorium.

Dodatkowe polecenia Mavena

Wprowadź, mvn testkiedy będziesz gotowy do uruchomienia testów jednostkowych, które zostały zdefiniowane w /src/java/testkatalogu.

Wpisz, mvn compilekiedy będziesz gotowy do skompilowania plików klas projektu. Jeśli korzystasz z konfiguracji wdrażania na gorąco, to polecenie wyzwala moduł ładujący klasy wdrażania na gorąco. (Narzędzie do wdrażania na gorąco - podobnie jak polecenie Spring Boot mvn spring-boot:run- będzie obserwować pliki klas pod kątem zmian, a kompilacja spowoduje skompilowanie plików źródłowych, a uruchomiona aplikacja odzwierciedli te zmiany).

Rozpoczęcie nowego projektu: Archetypes in Maven and Spring

Maven archetyp jest szablon do uruchamiania nowych projektów opartych na różnych predefiniowanych ustawień. Każdy archetyp oferuje wstępnie spakowane zależności, na przykład dla projektu aplikacji internetowej Java EE lub Java. Możesz także utworzyć nowy archetyp z istniejącego projektu, a następnie użyć go do szybkiego tworzenia nowych projektów w oparciu o te wstępnie zdefiniowane układy. Zobacz dokumentację Maven, aby dowiedzieć się więcej o archetypach Apache Maven.

Framework Spring, który dobrze współpracuje z Mavenem, oferuje dodatkowe, wyrafinowane możliwości wycofywania nowych projektów. Na przykład Spring Initializr to narzędzie, które pozwala bardzo szybko zdefiniować elementy, które chcesz w nowej aplikacji. Initializr nie jest archetypem Mavena per se, ale służy temu samemu celowi generowania układu projektu na podstawie wstępnych specyfikacji. Z poziomu Initializr możesz pisać mvn archetype:generatei przeglądać opcje, aby znaleźć archetyp odpowiedni dla tego, co budujesz.

Dodawanie zależności