Maven installieren und 3rd-Party-Abhängigkeiten mit einfachen Befehlszeilen bereitstellen
Frage
Wir haben eine Reihe von Dritten Abhängigkeiten, die nicht überall gehostet werden. Für jede von ihnen haben wir eine JAR-Datei, dass wir zu unserem Repository zu installieren und / oder einsetzen möchten in der Lage sein. Einige der JAR-Dateien haben ihre eigenen Abhängigkeiten und wir müssen auch diese erklären.
Wir haben für jede JAR-Datei pom.xml Dateien vorgenommen, die die groupId, artifactId, Abhängigkeiten deklarieren usw. Diese pom.xml-Dateien haben alle ein gemeinsames Mutter pom, die einige der gemeinsamen Informationen (zB <repositories>
und <distributionManagement>
) erklärt .
Ich möchte in der Lage sein, installieren oder diese Abhängigkeiten mit etwas so einfaches wie mvn install
und mvn deploy
(oder vielleicht mvn install:install-file
und mvn deploy:deploy-file
) einsetzen und verfügen über alle notwendigen Eigenschaften für diese Befehle (artifactId
, repositoryId
, etc.) Lese von den pom.xml-Dateien.
Um diese an der Arbeit, zumindest für die Bereitstellung, habe ich versucht, die folgend in meinen Eltern pom setzen:
<build>
<plugins>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.4</version>
<configuration>
<file>${jarfile}</file>
<pomFile>pom.xml</pomFile>
<repositoryId>our-id</repositoryId>
<url>our-url</url>
</configuration>
</plugin>
</plugins>
</build>
und dann jede des Kind Poms mit definiert die jarfile
Eigenschaft. Das erlaubt mir mvn deploy:deploy-file
zu laufen alle Kind pom Artefakte zu implementieren. Vermutlich könnte ich tun etwas ähnliches mvn install:install-file
zur Arbeit kommen.
Aber mit diesem Ansatz, ich bin nicht in der Lage, die Eltern pom freizugeben (was ich tun muß, da das Kind Poms davon abhängen), und wenn ich zu mvn release:perform
auf dem übergeordneten pom versuchen, erhalte ich Fehler wie:
Cannot override read-only parameter: pomFile
Ich fühle mich wie ich bin wahrscheinlich über diese in die falsche Richtung gehen. Alles, was ich wirklich tun möchte, ist:
- Setzen Sie den gemeinsamen Code für alle den Dritten Gläser in einer gemeinsamen Mutter pom
- Schreiben Sie eine zusätzliche minimale pom für jeden Drittes Glas
- Die Lage sein, so etwas wie
mvn install
odermvn deploy
laufen, ohne dass alle die komplizierten Befehlszeileneigenschaften angeben müssen
Wie kann ich am besten erreicht das?
Edit:. Machte es darüber klarer Im Idealfall würde Ich mag Lage sein, etwas so einfaches wie mvn install
oder mvn deploy
laufen und nicht Eigenschaften auf der Kommandozeile angeben müssen
Lösung 2
Ok, ich fand eine Lösung, die mir nur mvn install
oder mvn deploy
und haben die JAR-Datei auf den lokalen oder Remote-Repository installiert laufen zu lassen. Inspiriert von ein Beitrag zu der maven-Benutzerliste und mit der build-Helfer-Plugin , in der Mutter pom, ich habe:
<pluginManagement>
<plugins>
<!-- Attach the jar file to the artifact -->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.5</version>
<executions>
<execution>
<id>attach-artifacts</id>
<phase>package</phase>
<goals>
<goal>attach-artifact</goal>
</goals>
<configuration>
<artifacts>
<artifact>
<file>${artifactId}-${version}.jar</file>
<type>jar</type>
</artifact>
</artifacts>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
Und dann in den Kindern Poms, ich habe:
<packaging>pom</packaging>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
...
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
Einige der Stücke davon, dass ich zunächst gestolpert:
- Die
attach-artifact
Ausführung unter<pluginManagement>
sein sollte, so ist es nicht ausgefuehrt wird, wenn Siemvn install
oder die übergeordnete pommvn deploy
. - Die Kinder brauchen die
build-helper-maven-plugin
unter den Build-Plugins zu geben, so dass Code von der übergeordneten<pluginManagement>
fuehrt wird. - Die Kinder haben
<packaging>pom</packaging>
erklärt werden, weil Sie nicht ein Glas zu einem Artefakt hinzufügen können, wenn sie den gleichen Namen wie das Artefakt hat.
Der einzige Nachteil ich zu diesem Ansatz ist, dass das Artefakt als Typ pom
statt jar
vom Typ eingesetzt wird. Aber ich habe keine wirklichen Folgen gesehen.
Andere Tipps
Wenn Maven ist eine Abhängigkeit fehlt, wird es geben Ihnen einen Fehler in seiner Ausgabe, die die Befehlszeile Ausgabe enthält das Glas zu einem Remote-Repository hinzuzufügen. Das Befehlszeile wird automatisch ein POM für Sie erstellen und die beiden zusammen laden. Ist das nicht ausreichend für Ihre Bedürfnisse?
Mit dieser Anlage benutzen, wenn ich weiß, dass ich eine Abhängigkeit ohne Remote-Repository Darstellung haben, ich habe gerade in der Regel gehen Sie vor und definieren es in meinem Build mit der GAV, dass ich will, laufen einmal die Build, dann schauen Sie auf den Buildfehler . Kopieren Sie aus dem Befehl für den Einsatz, führen Sie dann den Befehl. Sie werden sicherstellen möchten, dass Sie die <repository>
Elemente richtig in der übergeordneten POM eingerichtet und auch <server>
Elemente in Ihrem settings.xml
mit dem Repository-Upload-Passwort einrichten entspricht. Other than that, Sie sollten gut gehen.
Ich möchte hinzufügen, dass Sie Nexus sollten überprüfen, bevor zu viel bekommen. Es ist der Mühe wert jetzt einzurichten! : -)
ich dieses Problem in meiner Arbeit erfüllen:
Jetzt habe ich eine target.jar (es hat eine Abhängigkeitsliste: a.jar, b.jar, c.jar ...), ich will
mvn install:install-file
verwenden, um es in meinem lokalen Repo zu setzen, aber wenn ich laufe der Befehl Schlag
mvn install:install-file -Dfile=/Users/username/.../target.jar -DgroupId=com.cnetwork.relevance -DartifactId=target -Dversion=1.0.0
aber wenn ich es benutze ich fand es gibt viele Fehler, das Glas, die target.jar können nicht finden a.jar
, b.jar
, c.jar
, wie zum Beispiel:
com.cnetwork.a does not exist
com.cnetwork.b does not exist
com.cnetwork.c does not exist
Dann ging ich ~/.m2/repository/.../target/1.0.0/target.pom
die pom-Datei des Ziels zu finden, aber nichts drin!
...
<groupId>com.cnetwork.relevance</groupId>
<artifactId>target</artifactId>
<version>1.0.0</version>
....
# no dependencies about a/b/c.jar !!!
Dies ist, was falsch läuft, wird die install:file -Dfile -DgroupId -D..
keine Abhängigkeiten in pom hinzufügen, korrigiere ich die Antwort durch diese Methode
-
Wenn Sie bereits
have this maven project source
, installieren Sie einfach in lokale Repomvn clean install
-
Wenn Sie
have the jar and the pom of it
, installieren Glas mit pommvn install:install-file -Dfile=/.../.../target.jar -DpomFile=/.../../target.pom
-
Wenn Sie
don't have a pom with target jar
, schreiben ein und verwenden oberen Befehl. -
Wenn Sie nicht die pom-Datei davon erholen können, können Sie aufgeben sollte.