Ich habe ein Multi-Modul-Projekt wie dieses:
main-project/
module1/
module2/
sub-module1/
sub-module2/
sub-module3/
...
module3/
module4/
...
Ich muss in Maven2 eine Reihe von Eigenschaften definieren (die von der Umgebung abhängen, von der ich mein Projekt freigeben möchte). Ich werde nicht verwenden, <properties>
da es viele Eigenschaften gibt ... Daher verwende ich das Eigenschaften Maven2-Plugin .
Die Eigenschaftendateien befinden sich im main-project/
Verzeichnis. Wie kann ich das richtige Verzeichnis in der Hauptdatei pom.xml festlegen, um allen untergeordneten Elementen anzugeben, wo sich die Eigenschaftendatei befindet?
<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>
Wenn ich nur setze <file>env_${env}.properties</file>
, findet Maven2 beim Kompilieren des ersten Moduls die main-project/env_dev.properties
Datei nicht. Wenn ich einstelle <file>../env_${env}.properties</file>
, wird ein Fehler auf der übergeordneten Ebene oder auf einer beliebigen Untermodulebene ausgelöst ...
quelle
${maven.multiModuleProjectDirectory}
Antworten:
Versuchen Sie, in jedem POM eine Eigenschaft festzulegen, um das Hauptprojektverzeichnis zu finden.
Im Elternteil:
Bei den Kindern:
Bei den Enkelkindern:
quelle
${parent.basedir}
analysiert nicht mehr in irgendetwas in 3.0.4 ...${project.basedir}/..
aber das funktioniert wirklich nur in Projekten mit mehreren Modulen, die sich in einer strengen Verzeichnishierarchie befinden.file.separator
<main.basedir>${project.basedir}${file.separator}..</main.basedir>
Zumindest in der aktuellen Maven-Version (3.6.0) können Sie davon Gebrauch machen
${maven.multiModuleProjectDirectory}
quelle
Verwenden Sie das Verzeichnis-Maven-Plugin mit dem Verzeichnis des Ziels .
Im Gegensatz zu anderen Vorschlägen:
Mit dem Plugin können Sie eine Eigenschaft Ihrer Wahl auf den absoluten Pfad aller Module des Projekts festlegen. In meinem Fall habe ich es auf das Root-Modul gesetzt ... In meinem Projekt root pom:
Von da an hat $ {myproject.basedir} in einem beliebigen Submodul pom immer den Pfad des Projektstammmoduls. Und natürlich können Sie die Eigenschaft auf jedes Modul festlegen, nicht nur auf das Root-Verzeichnis ...
quelle
Ich habe eine Lösung gefunden, um mein Problem zu lösen: Ich durchsuche die Eigenschaftendateien mit dem Groovy Maven-Plugin.
Da sich meine Eigenschaftendatei notwendigerweise im aktuellen Verzeichnis befindet, in ../ oder in .. / .., habe ich einen kleinen Groovy-Code geschrieben, der diese drei Ordner überprüft.
Hier ist der Auszug aus meiner pom.xml:
Das funktioniert, aber ich mag es nicht wirklich.
Also, wenn Sie eine bessere Lösung haben, zögern Sie nicht zu posten!
quelle
Aus meiner Sicht besteht das Problem darin, dass Sie den absoluten Pfad zu einem übergeordneten Verzeichnis in maven nicht erhalten können.
<rant> Ich habe gehört, dass dies als Anti-Muster bezeichnet wird , aber für jedes Anti-Muster gibt es einen echten, legitimen Anwendungsfall, und ich habe es satt, mir zu sagen, dass ich nur ihren Mustern folgen kann. </ schimpfen>
Die Arbeit, die ich fand, bestand darin, Antrun zu verwenden. Versuchen Sie dies in der untergeordneten Datei pom.xml:
Wenn du rennst
mvn verify
, solltest du so etwas sehen:Sie können es dann
${main.basedir}
in jedem anderen Plugin usw. verwenden. Ich habe eine Weile gebraucht , um das herauszufinden, also hoffe, es hilft jemand anderem.quelle
Eine andere Alternative:
Verwenden Sie im übergeordneten POM:
In den Kinder-Poms können Sie auf diese Variable verweisen.
Haupteinschränkung: Sie werden gezwungen, den Befehl immer aus dem übergeordneten Haupt-POM-Verzeichnis auszuführen. Wenn Sie dann Befehle (z. B. Test) nur für ein bestimmtes Modul ausführen möchten, verwenden Sie diese Syntax:
MVN-Test - Projekte
Die Konfiguration von todsicher zur Parametisierung einer Variablen "path_to_test_data" kann dann sein:
quelle
Das folgende kleine Profil hat bei mir funktioniert. Ich brauchte eine solche Konfiguration für CheckStyle, die ich in das
config
Verzeichnis im Stammverzeichnis des Projekts gestellt habe, damit ich sie vom Hauptmodul und von den Submodulen ausführen kann.Es funktioniert nicht für verschachtelte Module, aber ich bin sicher, dass es dafür mit mehreren Profilen mit unterschiedlichen geändert werden kann
exists
. (Ich habe keine Ahnung, warum das Verifizierungs-Tag "../ .." und in der überschriebenen Eigenschaft selbst nur ".." enthalten sollte, aber es funktioniert nur auf diese Weise.)quelle
In meinem Fall funktioniert es so:
quelle
Ich habe eine Lösung gefunden, um dieses Problem zu lösen: Verwenden Sie $ {parent.relativePath}
quelle
Sie befinden sich in Projekt C, Projekt C ist das Submodul von B und B ist das Submodul von A. Sie versuchen, das
src/test/config/etc
Verzeichnis von Modul D aus Projekt C zu erreichen . D ist auch das Submodul von A. Der folgende Ausdruck ermöglicht es, den URI-Pfad abzurufen:quelle
quelle
In einer Antwort auf eine andere Frage habe ich gezeigt, wie das Maven-Properties-Plugin erweitert werden kann, um externe Eigenschaftsbeschreibungen zu verwenden, die in Maven-Abhängigkeiten definiert sind.
Sie können diese Idee auf mehrere Deskriptor-Jars erweitern, die jeweils den Umgebungsnamen als Teil der Artefakt-ID enthalten und eine $ {env} .properties enthalten. Anschließend können Sie mit der Eigenschaft die entsprechende JAR- und Eigenschaftendatei auswählen, z. B.:
quelle
Ich verbessere nur das groovige Skript von oben, um die Eigenschaft in die übergeordnete Eigenschaftendatei zu schreiben:
quelle
Ich denke, wenn Sie das im Beispiel für Findbugs Plugin & Multimodule verwendete Erweiterungsmuster verwenden, können Sie möglicherweise globale Eigenschaften in Bezug auf absolute Pfade festlegen. Es verwendet ein Top
Beispiel für Multi-Modul
Das POM der obersten Ebene verfügt über ein nicht verwandtes Build-Konfigurationsprojekt und ein übergeordnetes App-Element für die Module des Multimodul-Projekts. Das übergeordnete App-Element verwendet die Erweiterung, um sich mit dem Build-Config-Projekt zu verknüpfen und Ressourcen daraus abzurufen. Dies wird verwendet, um allgemeine Konfigurationsdateien zu den Modulen zu übertragen. Es kann auch eine Leitung für Eigenschaften sein. Sie können das oberste Verzeichnis in eine Eigenschaftendatei schreiben, die von der Build-Konfiguration verwendet wird. (es scheint zu komplex)
Das Problem ist, dass dem Multi-Modul-Projekt eine neue oberste Ebene hinzugefügt werden muss, damit dies funktioniert. Ich habe versucht, mit einem wirklich unabhängigen Build-Config-Projekt Schritt zu halten, aber es war klobig und schien brüchig.
quelle
Dies erweitert die Antwort von romaintaz, was insofern fantastisch ist, als es das Problem löst und auch deutlich auf die fehlende Funktionalität von maven hinweist. Ich habe eine spätere Version des Plugins aufgegriffen und den Fall hinzugefügt, dass das Projekt mehr als 3 Ebenen tief sein könnte.
Ich habe beschlossen, keine Eigenschaft zum Definieren des Dateinamens zu verwenden. Beachten Sie, dass sich die Datei build.properties für immer dreht, wenn sie nicht gefunden wird. Ich habe eine .git-Verzeichniserkennung hinzugefügt, wollte die Antwort jedoch nicht zu komplizieren, sodass sie hier nicht angezeigt wird.
quelle
Ich musste ein ähnliches Problem für das lokale Repository lösen, das im Hauptprojekt des Multi-Modul-Projekts platziert war. Im Wesentlichen war der eigentliche Pfad
${basedir}
/ lib. Schließlich entschied ich mich in meinemparent.pom
:Das
basedir
zeigt immer zum aktuellen lokalen Modul, es gibt keine Möglichkeit, den Weg zum "Master" -Projekt zu finden (Mavens Schande). Einige meiner Submodule sind ein Dir tiefer, andere zwei Dir tiefer, aber alle sind direkte Submodule des übergeordneten , das die Repo-URL definiert.Dies löst das Problem also im Allgemeinen nicht. Sie können es jederzeit mit der von Clay akzeptierten Antwort kombinieren und eine andere Eigenschaft definieren - funktioniert einwandfrei und muss nur in Fällen neu definiert werden, in denen der Wert von
parent.pom
nicht gut genug ist. Oder Sie konfigurieren das Plugin einfach neu - was Sie nur bei POM-Artefakten (Eltern anderer Submodule) tun. Der in die Eigenschaft extrahierte Wert ist wahrscheinlich besser, wenn Sie ihn an mehreren Stellen benötigen, insbesondere wenn sich nichts in der Plugin-Konfiguration ändert.Die Verwendung
basedir
im Wert war hier der wesentliche Teil, weil URLfile://${project.parent.relativePath}/lib
den Trick nicht ausführen wollte (ich habe einen Schrägstrich entfernt, um ihn relativ zu machen). Es war notwendig, eine Eigenschaft zu verwenden, die mir einen guten absoluten Pfad gibt, und dann relativ dazu zu gehen.Wenn der Pfad nicht URL / URI ist, ist es wahrscheinlich kein Problem, ihn zu löschen
basedir
.quelle
Ich habe mit $ {basedir} .. \ src \ auf das obige Verzeichnis zugegriffen
quelle
sub-module1
wird es auf das Verzeichnis von zeigenmodule2
, nicht auf dasmain-project
.Hast du es versucht
../../env_${env}.properties
?Normalerweise machen wir Folgendes, wenn sich Modul2 auf derselben Ebene wie die Untermodule befindet
Ich würde denken, das ../ .. würde dich zwei Ebenen hochspringen lassen. Wenn nicht, können Sie sich an die Autoren des Plug-Ins wenden und prüfen, ob dies ein bekanntes Problem ist.
quelle