Maven installieren und 3rd-Party-Abhängigkeiten mit einfachen Befehlszeilen bereitstellen

StackOverflow https://stackoverflow.com/questions/4632648

  •  08-10-2019
  •  | 
  •  

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 .

sein

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 oder mvn 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

War es hilfreich?

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 Sie mvn install oder die übergeordnete pom mvn 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

  1. Wenn Sie bereits have this maven project source, installieren Sie einfach in lokale Repo

    mvn clean install

  2. Wenn Sie have the jar and the pom of it, installieren Glas mit pom

    mvn install:install-file -Dfile=/.../.../target.jar -DpomFile=/.../../target.pom

  3. Wenn Sie don't have a pom with target jar, schreiben ein und verwenden oberen Befehl.

  4. Wenn Sie nicht die pom-Datei davon erholen können, können Sie aufgeben sollte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top