Mam projekt wielomodułowy, taki jak ten:
main-project/
module1/
module2/
sub-module1/
sub-module2/
sub-module3/
...
module3/
module4/
...
Muszę zdefiniować zestaw właściwości (które są zależne od środowiska, w którym chcę wydać mój projekt) w Maven2. Nie będę używać, <properties>
ponieważ jest wiele właściwości ... Dlatego używam wtyczki Properties Maven2 .
Pliki właściwości znajdują się w main-project/
katalogu. Jak mogę ustawić poprawny katalog w głównym pom.xml, aby wskazać każdemu dziecku, gdzie znaleźć plik właściwości?
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>properties-maven-plugin</artifactId>
<version>1.0-alpha-1</version>
<executions>
<execution>
<phase>initialize</phase>
<goals>
<goal>read-project-properties</goal>
</goals>
<configuration>
<files>
<file>???/env_${env}.properties</file>
</files>
</configuration>
</execution>
</executions>
</plugin>
Jeśli <file>env_${env}.properties</file>
ustawię tylko , to gdy Maven2 kompiluje pierwszy moduł, nie znajdzie main-project/env_dev.properties
pliku. Jeśli ustawię <file>../env_${env}.properties</file>
, błąd zostanie podniesiony na poziomie nadrzędnym lub na dowolnym poziomie podmodułu ...
maven-2
properties
Romain Linsolas
źródło
źródło
${maven.multiModuleProjectDirectory}
Odpowiedzi:
Spróbuj ustawić właściwość w każdym pomie, aby znaleźć główny katalog projektu.
U rodzica:
U dzieci:
W wnukach:
źródło
${parent.basedir}
już nie analizuje niczego w 3.0.4 ...${project.basedir}/..
ale tak naprawdę działa to tylko w projektach wielomodułowych, które są w ścisłej hierarchii katalogów.file.separator
zmiennej<main.basedir>${project.basedir}${file.separator}..</main.basedir>
Przynajmniej w aktualnej wersji mavena (3.6.0) możesz z niego skorzystać
${maven.multiModuleProjectDirectory}
źródło
Użyj katalogu-maven-plugin z katalogiem celu .
W przeciwieństwie do innych sugestii:
Wtyczka pozwala ustawić wybraną właściwość na ścieżkę bezwzględną dowolnego modułu projektu. W moim przypadku ustawiłem go na moduł główny ... W moim projekcie root pom:
Odtąd $ {myproject.basedir} w każdym podmodułu pom zawsze ma ścieżkę do modułu głównego projektu. Oczywiście możesz ustawić właściwość na dowolny moduł, nie tylko na katalog główny ...
źródło
Znalazłem rozwiązanie, aby rozwiązać mój problem: przeszukuję pliki właściwości za pomocą wtyczki Groovy Maven.
Ponieważ mój plik właściwości jest koniecznie w bieżącym katalogu, w ../ lub .. / .., napisałem mały kod Groovy, który sprawdza te trzy foldery.
Oto wyciąg z mojego pom.xml:
To działa, ale nie podoba mi się to.
Więc jeśli masz lepsze rozwiązanie, nie wahaj się pisać!
źródło
Tak więc problem, jaki widzę, polega na tym, że nie można uzyskać bezwzględnej ścieżki do katalogu nadrzędnego w maven.
<rant> Słyszałem, że mówiono o tym jako o anty-wzorcu , ale dla każdego anty-wzorca istnieje dla niego prawdziwy, uzasadniony przypadek użycia i mam dość maven, który mówi mi, że mogę podążać tylko za ich wzorcami. </ rant>
Tak więc praca, którą znalazłem, polegała na użyciu antrun. Spróbuj tego w podrzędnym pom.xml:
Jeśli biegniesz
mvn verify
, powinieneś zobaczyć coś takiego:Możesz następnie użyć
${main.basedir}
dowolnej innej wtyczki, itp. Zajęło mi to trochę czasu, zanim to zrozumiałem, więc mam nadzieję, że pomoże to komuś innemu.źródło
Inna alternatywa:
w pompie rodzicielskim użyj:
W pompkach dziecięcych możesz odwołać się do tej zmiennej.
Główne zastrzeżenie: Zmusza cię do wykonywania polecenia zawsze z głównego katalogu nadrzędnego pom. Następnie, jeśli chcesz uruchamiać polecenia (na przykład test) tylko dla określonego modułu, użyj następującej składni:
test mvn --projects
Konfiguracja surefire do parametryzacji zmiennej „path_to_test_data” może zatem wyglądać następująco:
źródło
Poniższy mały profil zadziałał dla mnie. Potrzebowałem takiej konfiguracji dla CheckStyle, którą umieściłem w
config
katalogu w katalogu głównym projektu, dzięki czemu mogę go uruchomić z modułu głównego oraz z modułów podrzędnych.To nie zadziała dla zagnieżdżonych modułów, ale jestem pewien, że można to zmodyfikować, używając kilku profili z różnymi
exists
. (Nie mam pojęcia, dlaczego w tagu weryfikacyjnym powinno znajdować się „../ ..”, a po prostu „..” w samej nadpisanej właściwości, ale działa to tylko w ten sposób).źródło
W moim przypadku działa to tak:
źródło
Znalazłem rozwiązanie tego problemu: użyj $ {parent.relativePath}
źródło
Jesteś w projekcie C, projekt C to podmoduł z B, a B to podmoduł z A. Próbujesz dotrzeć do
src/test/config/etc
katalogu modułu D z projektu C. D jest również podmodułem z A. Poniższe wyrażenie umożliwia uzyskanie ścieżki URI:źródło
źródło
W odpowiedzi na inne pytanie pokazałem, jak można rozszerzyć wtyczkę maven-properties-plugin o zewnętrzne deskryptory właściwości zdefiniowane w zależnościach Mavena.
Możesz rozszerzyć ten pomysł, aby mieć wiele plików JAR deskryptorów, każdy z nazwą środowiska jako część artifactId, zawierający $ {env} .properties. Następnie możesz użyć właściwości, aby wybrać odpowiedni jar i plik właściwości, na przykład:
źródło
Po prostu ulepszam groovy skrypt z góry, aby zapisać właściwość w głównym pliku właściwości nadrzędnych:
źródło
Myślę, że jeśli użyjesz wzorca rozszerzenia użytego w przykładzie dla wtyczki findbugs i multimodułu, możesz być w stanie ustawić globalne właściwości związane ze ścieżkami bezwzględnymi. Używa góry
przykład dla wielu modułów
Pom najwyższego poziomu ma niepowiązany projekt build-config i element nadrzędny aplikacji dla modułów projektu wielomodułowego. Element nadrzędny aplikacji używa rozszerzenia, aby połączyć się z projektem build-config i uzyskać z niego zasoby. Służy do przenoszenia wspólnych plików konfiguracyjnych do modułów. Może to być również kanał dla właściwości. Możesz zapisać główny katalog do pliku właściwości używanego przez build-config. (wydaje się zbyt skomplikowane)
Problem polega na tym, że do projektu wielomodułowego należy dodać nowy najwyższy poziom, aby to zadziałało. Próbowałem przejść na stronę z naprawdę niepowiązanym projektem build-config, ale był niezdarny i wydawał się kruchy.
źródło
To rozszerza odpowiedź Romaintaza, która jest niesamowita, ponieważ rozwiązuje problem, a także wyraźnie wskazuje na brakującą funkcjonalność Mavena. Wybrałem późniejszą wersję wtyczki i dodałem przypadek, w którym projekt może mieć więcej niż 3 poziomy głębokości.
Zdecydowałem się nie używać właściwości do definiowania nazwy pliku. Zwróć uwagę, że jeśli plik build.properties nie zostanie znaleziony, będzie się obracał w nieskończoność. Dodałem wykrywanie .git dir, ale nie chciałem zbytnio komplikować odpowiedzi, więc nie jest tutaj pokazany.
źródło
Podobny problem musiałem rozwiązać dla lokalnego repozytorium umieszczonego w głównym projekcie projektu wielomodułowego. Zasadniczo prawdziwą ścieżką był
${basedir}
/ lib. W końcu zdecydowałem się na to w moimparent.pom
:To
basedir
zawsze pokazuje aktualny moduł lokalny, nie ma sposobu na zdobycie ścieżki do projektu "głównego" (wstyd Mavena). Niektóre z moich modułów podrzędnych są o jeden kierunek głębsze, niektóre o dwa kanały głębsze, ale wszystkie z nich są modułami bezpośrednimi elementu nadrzędnego, który definiuje adres URL repozytorium.Więc to nie rozwiązuje ogólnie problemu. Zawsze możesz połączyć to z zaakceptowaną odpowiedzią Claya i zdefiniować inną właściwość - działa dobrze i musi zostać ponownie zdefiniowana tylko w przypadkach, gdy wartość z
parent.pom
nie jest wystarczająco dobra. Lub możesz po prostu zmienić konfigurację wtyczki - co robisz tylko w artefaktach POM (rodzicach innych podmodułów). Wartość wyodrębniona do właściwości jest prawdopodobnie lepsza, jeśli potrzebujesz jej w większej liczbie miejsc, zwłaszcza gdy nic w konfiguracji wtyczki się nie zmienia.Użycie
basedir
w wartości było tutaj istotną częścią, ponieważ URLfile://${project.parent.relativePath}/lib
nie chciał załatwić sprawy (usunąłem jeden ukośnik, aby uczynić go względnym). Konieczne było użycie własności, która daje mi dobrą ścieżkę absolutną, a następnie przejście względem niej względem niej.Jeśli ścieżka nie jest adresem URL / URI, prawdopodobnie upuszczenie nie jest takim problemem
basedir
.źródło
Uzyskałem dostęp do powyższego katalogu za pomocą $ {basedir} .. \ src \
źródło
sub-module1
będzie wskazywał katalogmodule2
, a nie plikmain-project
.Próbowałeś
../../env_${env}.properties
?Zwykle wykonujemy następujące czynności, gdy moduł2 znajduje się na tym samym poziomie co podmoduły
Myślę, że ../ .. pozwoliłby ci podskoczyć o dwa poziomy. Jeśli nie, możesz skontaktować się z autorami wtyczki i sprawdzić, czy jest to znany problem.
źródło