Co to jest opakowanie „pom” w Maven?

175

Otrzymałem projekt maven do skompilowania i wdrożenia na serwerze tomcat. Nigdy wcześniej nie korzystałem z maven, ale sporo googlowałem. Wygląda na to, że pom.xmlpliki najwyższego poziomu w tym projekcie mają ustawiony typ opakowania jako pom.

Co mam zrobić po mvn installwdrożeniu tej aplikacji? Spodziewałem się, że będę w stanie znaleźć wargdzieś plik lub coś, ale myślę, że szukam w złym miejscu lub brakuje mi kroku.

Derek
źródło
3
mvn install - służy do instalacji artefaktu (jar, war, ear) w lokalnym repozytorium (zwykle będzie to ~ / .m2 / repository direcotry)
Łukasz Siwiński

Odpowiedzi:

148

pomjest w zasadzie kontenerem podmodułów, każdy podmoduł jest reprezentowany przez podkatalog w tym samym katalogu, co w pom.xmlprzypadku pompakowania.

Gdzieś, zagnieżdżone w strukturze projektu, znajdziesz artefakty (moduły) z waropakowaniem. Maven generalnie buduje wszystko w /targetpodkatalogach każdego modułu. Więc po mvn installprzejrzeniu targetpodkatalogu w module z waropakowaniem.

Oczywiście:

$ find . -iname "*.war"

działa równie dobrze ;-).

Tomasz Nurkiewicz
źródło
45

opakowanie pom to po prostu specyfikacja, która stwierdza, że ​​głównym artefaktem nie jest wojna ani słoik, ale sam pom.xml.

Często jest używany w połączeniu z „modułami”, które zwykle znajdują się w podkatalogach danego projektu; jednak może być również używany w niektórych scenariuszach, w których żaden podstawowy plik binarny nie miał być zbudowany, wszystkie inne ważne artefakty zostały zadeklarowane jako drugorzędne artefakty

Pomyśl o projekcie „dokumentacyjnym”, głównym artefaktem może być plik PDF, ale jest już zbudowany, a praca nad zadeklarowaniem go jako dodatkowego artefaktu może być pożądana w konfiguracji, aby powiedzieć mavenowi, jak zbudować plik PDF, który nie wymaga skompilowane.

Edwin Buck
źródło
Inny przykład, który mogę wymyślić w podobnych wierszach, jak projekt pom ==> abstrakcyjna klasa i moduł (y) w nim ==> konkretne klasy (y).
bharatj
22

Pakowanie pomjest używane w projektach, które agregują inne projekty, oraz w projektach, których jedynym użytecznym wynikiem jest dołączony artefakt z jakiejś wtyczki. W twoim przypadku zgaduję, że twój najwyższy poziom pom obejmuje <modules>...</modules>agregację innych katalogów, a rzeczywiste dane wyjściowe są wynikiem jednego z innych (prawdopodobnie pod-) katalogów. Jeśli zostanie odpowiednio zakodowany w tym celu, będzie miał opakowanie war.

bmargulies
źródło
1
Co masz na myśli, mówiąc „którego jedynym użytecznym wynikiem jest dołączony artefakt z jakiejś wtyczki”?
omjego
9

Aby po prostu odpowiedzieć na twoje pytanie, kiedy wykonujesz mvn: install , maven utworzy spakowany artefakt na podstawie ( atrybut pakowania w pom.xml), Po uruchomieniu instalacji mavena możesz znaleźć plik z rozszerzeniem .package

  • W katalogu docelowym obszaru roboczego projektu
  • Również tam, gdzie lokalne repozytorium maven 2 wyszukuje ( .m2 / repository ) na twoim pudełku, twój artefakt jest wymieniony w repozytorium .m2 w katalogu ( groupId / artifactId / artifactId-version.packaging )
  • Jeśli zajrzysz do katalogu, znajdziesz spakowany plik rozszerzenia, a także rozszerzenie pom (rozszerzenie pom to w zasadzie pom.xml użyty do wygenerowania tego pakietu)
  • Jeśli twój projekt Maven jest wielomodułowy, każdy moduł będzie miał dwa pliki, jak opisano powyżej, z wyjątkiem projektu najwyższego poziomu, który będzie miał tylko plik pom
Prasanna Talakanti
źródło
8

Pakowanie artefaktu jako POM oznacza, że ​​ma on bardzo prosty cykl życia

package -> install -> deploy

http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html

Jest to przydatne, jeśli wdrażasz plik pom.xml lub projekt, który nie pasuje do innych typów opakowań.

Używamy opakowań pom w wielu naszych projektach i w razie potrzeby wiążemy dodatkowe fazy i cele.

Na przykład niektóre z naszych aplikacji używają:

prepare-package -> test -> package -> install -> deploy

Po zainstalowaniu aplikacji mvn należy ją dodać do lokalnego repozytorium .m2. Aby publikować w innym miejscu, musisz skonfigurować prawidłowe informacje dotyczące zarządzania dystrybucją. Może być również konieczne użycie wtyczki pomocniczej Maven builder, jeśli artefakty nie są automatycznie dołączane przez Mavena.

James Morgan
źródło
6

Proponuję zobaczyć klasyczny przykład pod adresem : http://maven.apache.org/guides/getting-started/index.html#How_do_I_build_more_than_one_project_at_once

Tutaj my-webapp to projekt sieciowy, który zależy od kodu w projekcie my-app. Aby połączyć dwa projekty w jeden, mamy pom.xml najwyższego poziomu, który wspomina, które projekty (moduły zgodnie z terminologią Mavena) mają zostać ostatecznie dołączone. Taki pom.xml na najwyższym poziomie może używać opakowań pom.

my-webapp może mieć pakiet wojenny i może być zależny od my-app. my-app może mieć opakowanie w postaci słoika.

Vishal
źródło
2

Przykład użycia z życia wzięty

W firmie wykorzystującej język Java mieliśmy projekt w języku Python, który musiał trafić do repozytorium artefaktów Nexusa. Python tak naprawdę nie ma artefaktów, więc po prostu chciałem po prostu .tar lub .zipować pliki Pythona i wypychać. Repozytorium miało już integrację z maven, więc użyliśmy <packaging>pom</packaging>desygnatora z wtyczką zespołu maven do spakowania projektu Pythona jako pliku .zipi przesłania go.

Kroki są opisane w tym poście SO

Adam Hughes
źródło
1

Opakowanie „pom” to nic innego jak pojemnik, który zawiera inne opakowania / moduły, takie jak słoik, wojna i ucho.

jeśli wykonasz jakąkolwiek operację na zewnętrznym pakiecie / kontenerze, taką jak mvn clean compile install. wtedy wewnętrzne pakiety / moduły również otrzymają czystą instalację kompilacji.

nie ma potrzeby wykonywania oddzielnej operacji dla każdego pakietu / modułu.

Abdul Gafoor
źródło
1

https://maven.apache.org/pom.html

Typ opakowania wymagany dla projektów nadrzędnych i agregacyjnych (wielomodułowych). Te typy definiują cele powiązane z zestawem etapów cyklu życia. Na przykład, jeśli opakowanie to słoik, faza pakowania wykona cel jar: jar. Jeśli opakowaniem jest pom, realizowanym celem będzie site: attach-descriptor

TaylorChen
źródło
0

POM (Project Object Model) to nic innego jak skrypt automatyzacji do budowania projektu, możemy napisać skrypt automatyzacji w XML, pliki skryptów budowania mają różne nazwy w różnych narzędziach automatyzacji

tak jak nazywamy build.xml w ANT, pom.xml w MAVEN

MAVEN może pakować słoiki, wojny, uszy i POM, co jest dla nas nowością

Jeśli chcesz, sprawdź CO TO JEST POM.XML

Venky Vungarala
źródło