Einfache Antwort: Ich habe eine IDE wie Eclipse eingebaut target/und möchte auch über die Befehlszeile bauen können, ohne dass sich die beiden Prozesse gegenseitig auf die Zehen treten.
John Sullivan
Ein weiterer Anwendungsfall, den ich dafür gefunden habe - src/it/my-integration-test-project/pom.xmldas Erstellen von Integrationstests wie über die Befehlszeile, ohne ein targetVerzeichnis im Quellbaum zu erstellen , das kopiert wird, wenn die Integrationstests als Teil der Überprüfungsphase des enthaltenen Projekts ausgeführt werden.
Vielen Dank. Warum wird die zweite Lösung nicht empfohlen?
Igor Mukhin
1
@iimuhin, die erste Lösung ist die korrekte Nutzung der durch die Maven-Konfiguration gegebenen Möglichkeiten, die zweite ist eher ein Trick, damit es funktioniert. Wenn die Optionen -Dproject.build.directoryverwendet werden sollten, wären sie verwendbar. und dies ist eine -Dproject.build.directoryProblemumgehung für das Problem. Außerdem geben Sie bei der ersten Lösung ein für alle Mal Pfade an. Sie können beim Starten der Befehlszeile keinen Tippfehler im Verzeichnisnamen ausführen. Sie können diese Lösung auch dann problemlos verwenden, wenn Sie mit einer IDE usw. arbeiten.
Colin Hebert
8
Das Problem bei der Profillösung besteht darin, dass viele der Anwendungsfälle zum Ändern des Zielverzeichnisses benutzerspezifisch sind (z. B. das Erstellen auf einer RAM-Festplatte) und nicht zum POM gehören. Profile in der benutzerspezifischen settings.xml dürfen kein Build-Element enthalten, daher ist dies keine Option.
EricS
Ich mag diese Antwort, aber vielleicht können Sie ein Profil auch über die settings.xmlBefehlszeile aktivieren , um noch mehr Portabilität zu erzielen?
Schurke
1
Ich mag Ihre "nicht empfohlene Lösung", da sie es mir ermöglichte, in alternativen Verzeichnissen auf der Befehlszeile aufzubauen, ohne Eclipse zu stören, das auf das Standardziel $ {project.basedir} / target verweist. Daher kann ich in Eclipse codieren, während ich gleichzeitig auf der Befehlszeile baue, ohne darauf zu warten, dass Eclipse aktualisiert / neu erstellt wird
Francois Marot
28
Colin hat Recht, dass ein Profil verwendet werden sollte. Seine Antwort codiert jedoch das Zielverzeichnis im Profil fest. Eine alternative Lösung wäre, ein Profil wie das folgende hinzuzufügen:
Dies hätte zur Folge, dass das Build-Verzeichnis in das geändert wird, was in der Eigenschaft alt.build.dir angegeben ist, die in einem POM, in den Einstellungen des Benutzers oder in der Befehlszeile angegeben werden kann. Wenn die Eigenschaft nicht vorhanden ist, erfolgt die Kompilierung im normalen Zielverzeichnis.
Entschuldigen Sie die Frage zu n00b, aber wie können Sie die Eigenschaft in der Einstellungsdatei des Benutzers festlegen, damit dies von Vorteil ist? Ich verstehe aus der Einstellungsreferenz , dass die in der Einstellungsdatei festgelegten Eigenschaften nicht in die Einstellungsdatei interpoliert werden.
Michael Scheper
Welchen Vorteil hätte dieses Angebot? Ich vermisse wahrscheinlich etwas, aber unter der Annahme, dass die 'Fälle' des OP in der Befehlszeile angegeben sind, würde dies nicht dazu führen, dass der Parameter -Dalt.build.dir=~/mytargetder Verwendung -Dfür eine andere Eigenschaft entspricht?
Michael Scheper
Ah, ich habe gerade festgestellt, dass alle hier über das Hinzufügen von Profilen zum POM sprechen und nicht über settings.xml. Das würde meine Fragen mindestens so m00t wie n00b machen. Das tut mir leid.
target/
und möchte auch über die Befehlszeile bauen können, ohne dass sich die beiden Prozesse gegenseitig auf die Zehen treten.src/it/my-integration-test-project/pom.xml
das Erstellen von Integrationstests wie über die Befehlszeile, ohne eintarget
Verzeichnis im Quellbaum zu erstellen , das kopiert wird, wenn die Integrationstests als Teil der Überprüfungsphase des enthaltenen Projekts ausgeführt werden.Antworten:
Sie sollten Profile verwenden.
<profiles> <profile> <id>otherOutputDir</id> <build> <directory>yourDirectory</directory> </build> </profile> </profiles>
Und fange mit deinem Profil an
mvn compile -PotherOutputDir
Wenn Sie Ihr Verzeichnis wirklich über die Befehlszeile definieren möchten, können Sie Folgendes tun (überhaupt NICHT empfohlen ):
<properties> <buildDirectory>${project.basedir}/target</buildDirectory> </properties> <build> <directory>${buildDirectory}</directory> </build>
Und kompiliere so:
mvn compile -DbuildDirectory=test
Dies liegt daran, dass Sie das Zielverzeichnis nicht mithilfe von ändern können
-Dproject.build.directory
quelle
-Dproject.build.directory
verwendet werden sollten, wären sie verwendbar. und dies ist eine-Dproject.build.directory
Problemumgehung für das Problem. Außerdem geben Sie bei der ersten Lösung ein für alle Mal Pfade an. Sie können beim Starten der Befehlszeile keinen Tippfehler im Verzeichnisnamen ausführen. Sie können diese Lösung auch dann problemlos verwenden, wenn Sie mit einer IDE usw. arbeiten.settings.xml
Befehlszeile aktivieren , um noch mehr Portabilität zu erzielen?Colin hat Recht, dass ein Profil verwendet werden sollte. Seine Antwort codiert jedoch das Zielverzeichnis im Profil fest. Eine alternative Lösung wäre, ein Profil wie das folgende hinzuzufügen:
<profile> <id>alternateBuildDir</id> <activation> <property> <name>alt.build.dir</name> </property> </activation> <build> <directory>${alt.build.dir}</directory> </build> </profile>
Dies hätte zur Folge, dass das Build-Verzeichnis in das geändert wird, was in der Eigenschaft alt.build.dir angegeben ist, die in einem POM, in den Einstellungen des Benutzers oder in der Befehlszeile angegeben werden kann. Wenn die Eigenschaft nicht vorhanden ist, erfolgt die Kompilierung im normalen Zielverzeichnis.
quelle
-Dalt.build.dir=~/mytarget
der Verwendung-D
für eine andere Eigenschaft entspricht?