Próbuję dowiedzieć się, jak zorganizować wiele (około 50+) projektów maven2, aby można je było wdrożyć w centralnym repozytorium Nexus. Korzystając z mvn deploy
celu, należy określić cel w tagu distributionManagement w następujący sposób:
<distributionManagement>
<repository>
<id>nexus-site</id>
<url>http://central_nexus/server</url>
</repository>
</distributionManagement>
Teraz nie chcę, aby każdy pojedynczy plik pom.xml (z tych 50+) zawierał ten blok w kółko. Moim pierwszym byłby settings.xml
plik, ale wydaje się, że nie jest możliwe (zgodnie z projektem), aby go tam zdefiniować. Zatem pierwsze pytanie brzmiałoby, dlaczego tak jest? Gdyby to było możliwe, mógłbym to określić w pliku settings.xml w dystrybucji maven2, który mógłby być dystrybuowany do wszystkich programistów.
Jedynym możliwym rozwiązaniem, które znalazłem, było utworzenie projektu master-pom obejmującego całą organizację, który zawiera te ustawienia i uzależnienie wszystkich innych pom.xml od tego master-pom za pośrednictwem <parent>
tagu. Ale wygląda to trochę dziwnie w kompilacjach wielomodułowych:
- master configuration POM (pm)
- Project 1 parent pom (p1 with module 1 and module 2 as modules)
- Project 1 module pom (with pm as parent)
- Project 2 module pom (with pm as parent)
Zwykle czytam w całej dokumentacji, że moduł poms powinien używać pom-rodzica, a nie innego. Ale po przeczytaniu strony internetowej maven o dziedziczeniu v. Aggregation napisano, że jest to rzeczywiście możliwe.
Jeden problem, który znalazłem, dotyczył generowania witryny Maven, która wydaje się mieć problemy z tą konfiguracją (moduły nie są poprawnie łączone, jeśli nie mają bezpośredniego odniesienia wstecznego)
Czy jest to więc prawidłowe podejście? Jakieś inne, bardziej oczywiste, prostsze rozwiązanie problemu?
Odpowiedzi:
Najlepszym rozwiązaniem jest utworzenie prostego projektu nadrzędnego pliku pom (z opakowaniem „pom”) ogólnie dla wszystkich projektów w Twojej organizacji.
Można go zbudować, wydać i wdrożyć w lokalnym nexusie, aby każdy miał dostęp do jego artefaktu.
Teraz dla wszystkich projektów, których chcesz używać, po prostu dołącz tę sekcję:
Takie rozwiązanie pozwoli Ci w łatwy sposób dodać inne wspólne rzeczy do wszystkich projektów Twojej firmy. Na przykład, jeśli chcesz ustandaryzować wykorzystanie JUnit do określonej wersji, byłoby to idealne miejsce do tego.
Jeśli masz projekty, które używają struktur wielomodułowych, które mają własnego rodzica, Maven obsługuje również dziedziczenie łańcuchowe, więc jest całkowicie akceptowalne, aby plik nadrzędny pom projektu odnosił się do macierzystego pom firmy, a moduły podrzędne projektu nawet nie wiedziały o twoim spółka dominująca.
Z twojego przykładowego projektu wynika, że próbujesz umieścić swój projekt nadrzędny na tym samym poziomie, co Twój agregator pom. Jeśli Twój projekt potrzebuje własnego elementu nadrzędnego, najlepszym rozwiązaniem, jakie znalazłem, jest uwzględnienie elementu nadrzędnego na tym samym poziomie, co pozostałe moduły i umieszczenie pliku pom.xml agregatora w katalogu głównym, w którym znajdują się wszystkie katalogi modułów.
To, co robisz z tą strukturą, to dołączanie modułu nadrzędnego do agregatora i budowanie wszystkiego za pomocą pliku
mvn install
z katalogu głównego.Używamy dokładnie tego rozwiązania w mojej organizacji, które przetrwało próbę czasu i całkiem dobrze nam się sprawdziło.
źródło
Nie ma potrzeby posiadania rodzica POM.
Możesz całkowicie pominąć część DistributionManagement w swoich poms i ustawić ją na serwerze kompilacji lub w settings.xml.
Aby to zrobić na serwerze kompilacji, po prostu przejdź do
mvn
polecenia:Zobacz https://maven.apache.org/plugins/maven-deploy-plugin/deploy-mojo.html, aby uzyskać szczegółowe informacje, które opcje można ustawić.
Można to również ustawić w pliku
settings.xml
.Po prostu utwórz tam profil, który jest włączony i zawiera właściwość.
Przykład settings.xml:
Upewnij się, że poświadczenia „migawek” i „wersji” znajdują się w
<servers>
sekcji pliku settings.xmlWłaściwości altSnapshotDeploymentRepository i altReleaseDeploymentRepository są wprowadzane za pomocą maven-deploy-plugin w wersji 2.8. Starsze wersje zakończą się niepowodzeniem z komunikatem o błędzie
Aby to naprawić, możesz wymusić nowszą wersję wtyczki:
źródło