wake-up-neo.net

Maven 2 Assembly mit Abhängigkeiten: jar under scope "system" nicht enthalten

Ich verwende das maven-Assembly-Plugin, um ein Jar meiner Anwendung zu erstellen, einschließlich der folgenden Abhängigkeiten:

<Assembly>
    <id>macosx</id>
    <formats>
       <format>tar.gz</format>
       <format>dir</format>
    </formats>
    <dependencySets>
        <dependencySet>
            <includes>
                <include>*:jar</include>
            </includes>
            <outputDirectory>lib</outputDirectory>
        </dependencySet>
    </dependencySets>
</Assembly>

(Ich habe einige andere Dinge weggelassen, die nicht mit der Frage zusammenhängen.)

Bisher hat dies gut funktioniert, da ein lib -Verzeichnis mit allen Abhängigkeiten erstellt wurde. Ich habe jedoch kürzlich eine neue Abhängigkeit hinzugefügt, deren Gültigkeitsbereich system ist, und sie wird nicht in das Ausgabeverzeichnis lib kopiert. Ich muss hier etwas Grundlegendes vermissen, also rufe ich um Hilfe.

Die Abhängigkeit, die ich gerade hinzugefügt habe, ist:

<dependency>
  <groupId>sourceforge.jchart2d</groupId>
  <artifactId>jchart2d</artifactId>
  <version>3.1.0</version>
  <scope>system</scope>
  <systemPath>${project.basedir}/external/jchart2d-3.1.0.jar</systemPath>
</dependency>

Die einzige Möglichkeit, diese Abhängigkeit einzubeziehen, bestand darin, dem Assembly-Element Folgendes hinzuzufügen:

<files>
    <file>
        <source>external/jchart2d-3.1.0.jar</source>
        <outputDirectory>lib</outputDirectory>
    </file>
</files>

Dies zwingt mich jedoch dazu, die pom- und die Assembly-Datei zu ändern, wenn diese JAR-Datei umbenannt wird, wenn überhaupt. Außerdem scheint es einfach falsch zu sein.

Ich habe es versucht mit <scope>runtime</scope> in den dependencySets und <include>sourceforge.jchart2d:jchart2d</include> ohne glück.

Wie fügen Sie Ihrer Assembly-Datei in Maven 2 eine JAR-Datei mit dem Gültigkeitsbereich system hinzu?

Danke vielmals

59

Ich bin nicht überrascht, dass Systembereichsabhängigkeiten nicht hinzugefügt werden (Abhängigkeiten mit einem Systembereich müssen schließlich per Definition explizit angegeben werden). Wenn Sie diese Abhängigkeit wirklich nicht in Ihrem lokalen Repository ablegen möchten (zum Beispiel, weil Sie sie als Teil Ihres Projekts verteilen möchten), würde ich Folgendes tun:

  • Ich würde die Abhängigkeit in ein "Dateisystem-Repository" stellen, das für das Projekt lokal ist.
  • Ich würde dieses Repository in meinem pom.xml Folgendermaßen deklarieren:

    <repositories>
      <repository>
        <id>my</id>
        <url>file://${basedir}/my-repo</url>
      </repository>
    </repositories>
    
  • Ich würde das Artefakt nur ohne den Gültigkeitsbereich system deklarieren, dies ist nur eine Quelle von Problemen:

    <dependency>
      <groupId>sourceforge.jchart2d</groupId>
      <artifactId>jchart2d</artifactId>
      <version>3.1.0</version>
    </dependency>
    

Ich bin nicht zu 100% sicher, dass dies Ihren Anforderungen entspricht, aber ich denke, es ist eine bessere Lösung als die Verwendung des Systemumfangs.

Update: Ich hätte das in meiner ursprünglichen Antwort erwähnen sollen und korrigiere es jetzt. Verwenden Sie zum Installieren einer Drittanbieter-Bibliothek im dateibasierten Repository install:install-file Mit dem Parameter localRepositoryPath :

mvn install:install-file -Dfile=<path-to-file> \
                         -DgroupId=<myGroup> \
                         -DartifactId=<myArtifactId> \
                         -Dversion=<myVersion> \
                         -Dpackaging=<myPackaging> \
                         -DlocalRepositoryPath=<path-to-my-repo>

Sie können dies so einfügen, wie es sich in einer * nix-Shell befindet. Entfernen Sie unter Windows "\" Und setzen Sie alles in eine einzelne Zeile.

79
Pascal Thivent

Übrigens können Sie es automatisieren und zu einem Teil Ihres Maven-Builds machen. Folgendes wird Ihre JAR-Datei in Ihrem lokalen Repository installieren, bevor Sie sie kompilieren:

        <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-install-plugin</artifactId>
            <executions>
                <execution>
                    <id>hack-binary</id>
                    <phase>validate</phase>
                    <configuration>
                        <file>${basedir}/lib/your-lib.jar</file>
                        <repositoryLayout>default</repositoryLayout>
                        <groupId>your-group</groupId>
                        <artifactId>your-artifact</artifactId>
                        <version>0.1</version>
                        <packaging>jar</packaging>
                        <generatePom>true</generatePom>
                    </configuration>
                    <goals>
                        <goal>install-file</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
25
alx

Ich finde eine einfache Lösung für den Fall, dass Sie ein Glas kreieren

<plugin>
  <groupId>org.Apache.maven.plugins</groupId>
  <artifactId>maven-war-plugin</artifactId>
  <version>2.1.1</version>
  <configuration>
    <webResources>
    <resource>
      <directory>dependencies/mydep</directory>
        <targetPath>WEB-INF/lib</targetPath>
        <filtering>true</filtering>
        <includes>
           <include>**/*.jar</include>
        </includes>
    </resource>
  </webResources>
</configuration>
</plugin>
15
mc.dev

Sie können dies auch durch Hinzufügen eines zusätzlichen dependencySet in Ihren dependencySets erledigen.

<dependencySet>
  <scope>system</scope>
  <includes>
    <include>*:jar</include>
  </includes>
  <outputDirectory>lib</outputDirectory>
</dependencySet>

Am besten verwenden Sie einen Repository-Manager (wie Nexus, Artifactory, Archiva) und installieren diese Art von Abhängigkeit in einem bestimmten Repository. Danach können Sie solche Dinge als einfache Abhängigkeit verwenden. Dies wird dein Leben vereinfachen.

Docs: https://maven.Apache.org/plugins/maven-Assembly-plugin/Assembly.html

5
khmarbaise

Bearbeitet: Tut mir leid, dass ich nicht realisiert habe, dass alx auch über die Problemumgehung für den sauberen Lebenszyklus gesprochen hat.

<plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-install-plugin</artifactId>
    <executions>
        <execution>
            <id>hack-binary</id>
            <phase>clean</phase>
            <configuration>
                <file>${basedir}/lib/your-lib.jar</file>
                <repositoryLayout>default</repositoryLayout>
                <groupId>your-group</groupId>
                <artifactId>your-artifact</artifactId>
                <version>0.1</version>
                <packaging>jar</packaging>
                <generatePom>true</generatePom>
            </configuration>
            <goals>
                <goal>install-file</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Auf der Grundlage der von alx bereitgestellten Lösung können Sie den Installationsdateischritt in der Bereinigungsphase ausführen. Da sich die Bereinigungsphase jedoch nicht im Standardlebenszyklus befindet, müssen Sie zum ersten Mal mvn clean ausführen, um sicherzustellen, dass das Glas im lokalen Repository bereit ist.

beispiel: mvn clean; mvn package

2
ykyuen

Eine einfache Lösung hierfür ist das Hinzufügen in das lokale Maven-Repository

Eine Möglichkeit besteht darin, mvn install-Befehle zu verwenden, wie im vorherigen Beitrag vorgeschlagen.

Eine andere einfache Möglichkeit ist: 1) Klicken Sie in Ihrer Eclipse-ID mit der rechten Maustaste auf das Projekt und wählen Sie die Option Maven. 2) Wählen Sie die Option Ein Artefakt in einem Maven-Repository installieren oder bereitstellen und klicken Sie auf Weiter. 3) Klicken Sie auf "Durchsuchen" neben dem Kontrollkästchen "Artefaktdatei" und wählen Sie Ihre JAR-Datei aus. 4) Geben Sie die GroupId und ArtifactId sowie die Version ein, um sicherzustellen, dass "POM generieren" und "Prüfsumme erstellen" aktiviert sind

Klicken Sie auf Fertig stellen, Wallah !!! Wenn Ihre Arbeit erledigt ist, wird das Glas in Ihrem lokalen Repository hinzugefügt, das Sie im Verzeichnis setting.xml oder m2 definieren können

Fügen Sie nun einfach die einfache Maven-Abhängigkeit gemäß der GroupId-, ArtifactId- und JAR-Version hinzu, die Sie gemäß dem Import eingegeben haben, und das ist, dass Ihr externes JAR von Maven gepackt wird.

2
swapnil thorat

bei meiner Lösung hat es einfacher geklappt:

entferne aus deiner Abhängigkeit:

<dependency>
  <groupId>tiago.medici</groupId>
  <artifactId>eureka</artifactId>
  <version>0.0.1</version>
</dependency> 

Fügen Sie dann das maven-install-Plugin ebenfalls in die pom.xml ein.

<plugin>
  <groupId>org.Apache.maven.plugins</groupId>
  <artifactId>maven-install-plugin</artifactId>
  <executions>
    <execution>
      <id>install-external</id>
      <phase>clean</phase>
      <configuration>
        <file>${basedir}/external/tiago.medici-0.0.1.jar</file>
        <repositoryLayout>default</repositoryLayout>
        <groupId>tiago.medici</groupId>
        <artifactId>eureka</artifactId>
        <version>0.0.1</version>
        <packaging>jar</packaging>
        <generatePom>true</generatePom>
      </configuration>
      <goals>
        <goal>install-file</goal>
      </goals>
    </execution>
  </executions>
</plugin>
1
Tiago Medici