it-swarm.com.de

Wie füge ich lokale JAR-Dateien zu einem Maven-Projekt hinzu?

Wie füge ich lokale JAR-Dateien (die noch nicht im Maven-Repository enthalten sind) direkt in die Bibliotheksquellen meines Projekts ein?

989

Installieren Sie die JAR wie folgt in Ihrem lokalen Maven-Repository:

mvn install:install-file \
   -Dfile=<path-to-file> \
   -DgroupId=<group-id> \
   -DartifactId=<artifact-id> \
   -Dversion=<version> \
   -Dpackaging=<packaging> \
   -DgeneratePom=true

Wo sich jeder bezieht auf:

<path-to-file>: Der Pfad zu der zu ladenden Datei, z. B. → c:\kaptcha-2.3.jar

<group-id>: Die Gruppe, unter der die Datei registriert werden soll, z. B. → com.google.code

<artifact-id>: Der Artefaktname für die Datei, z. B. → kaptcha

<version>: Die Version der Datei, z. B. → 2.3

<packaging>: Das Packen der Datei, z. → jar

Referenz

562
user373455

Sie können lokale Abhängigkeiten direkt hinzufügen (wie in build maven project mit eingeschlossenen Propriatery-Bibliotheken erwähnt):

<dependency>
    <groupId>com.sample</groupId>
    <artifactId>sample</artifactId>
    <version>1.0</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/src/main/resources/yourJar.jar</systemPath>
</dependency>

Update

In neuen Releases ist diese Funktion als veraltet markiert, funktioniert aber noch und wurde noch nicht entfernt (Sie sehen nur eine Warnung im Protokoll beim Start des Maven). Bei maven group wird ein Problem https: //issues.Apache.org/jira/browse/MNG-6523 (Sie können teilnehmen und beschreiben, warum diese Funktion hilfreich ist manche Fälle). Ich hoffe dieses Feature bleibt dabei!

Wenn Sie mich fragen, solange das Feature nicht entfernt wird, verwende ich dies, um Abhängigkeit von nur einer frechen JAR-Datei herzustellen in meinem Projekt, das nicht in das Repository passt. Wenn dieses Feature entfernt wird, gibt es hier viele gute Antworten, aus denen ich später auswählen kann!

1280
Alireza Fattahi

Erstens möchte ich diese Antwort einem anonymen Stack Overflow-Benutzer gutschreiben - ich bin mir ziemlich sicher, dass ich hier zuvor eine ähnliche Antwort gesehen habe - aber jetzt kann ich sie nicht finden.

Die beste Möglichkeit, lokale JAR-Dateien als Abhängigkeit zu haben, besteht darin, ein lokales Maven-Repository zu erstellen. Ein solches Repository ist nichts weiter als eine richtige Verzeichnisstruktur mit POM-Dateien.

Für mein Beispiel: Ich habe mein Masterprojekt auf ${master_project} und Unterprojekt1 ist auf ${master_project}/${subproject1}.

Dann erstelle ich ein Maven-Repository in: ${master_project}/local-maven-repo.

In der pom-Datei in Unterprojekt1 unter ${master_project}/${subproject1}/pom.xml muss das Repository angegeben werden, das den Dateipfad als URL-Parameter verwendet:

<repositories>
    <repository>
        <id>local-maven-repo</id>
        <url>file:///${project.parent.basedir}/local-maven-repo</url>
    </repository>
</repositories>

Die Abhängigkeit kann wie für jedes andere Repository angegeben werden. Dies macht Ihr POM-Repository unabhängig. Wenn zum Beispiel die gewünschte JAR in Maven Central verfügbar ist, müssen Sie sie nur aus Ihrem lokalen Repo löschen und sie wird aus dem Standard-Repo gezogen.

    <dependency>
        <groupId>org.Apache.felix</groupId>
        <artifactId>org.Apache.felix.servicebinder</artifactId>
        <version>0.9.0-SNAPSHOT</version>
    </dependency>

Als letztes müssen Sie die JAR-Datei mit dem Schalter -DlocalRepositoryPath wie folgt zum lokalen Repository hinzufügen:

mvn org.Apache.maven.plugins:maven-install-plugin:2.5.2:install-file  \
    -Dfile=/some/path/on/my/local/filesystem/felix/servicebinder/target/org.Apache.felix.servicebinder-0.9.0-SNAPSHOT.jar \
    -DgroupId=org.Apache.felix -DartifactId=org.Apache.felix.servicebinder \
    -Dversion=0.9.0-SNAPSHOT -Dpackaging=jar \
    -DlocalRepositoryPath=${master_project}/local-maven-repo

Sobald die JAR-Datei installiert ist, kann Ihr Maven-Repository an ein Code-Repository übergeben werden, und die gesamte Einrichtung ist systemunabhängig. ( Arbeitsbeispiel in GitHub ).

Ich stimme zu, dass es keine gute Praxis ist, JARs für das Repo von Quellcode zu verpflichten, aber im wirklichen Leben sind schnelle und schmutzige Lösungen manchmal besser als ein vollständiges Nexus-Repo, um eine JAR zu hosten, die Sie nicht veröffentlichen können.

115
JJ Roman

Erstellen Sie einen neuen Ordner, sagen wir local-maven-repo im Stammverzeichnis Ihres Maven-Projekts.

Fügen Sie einfach ein lokales Repo in Ihren <project> Ihres pom.xml ein:

<repositories>
    <repository>
        <id>local-maven-repo</id>
        <url>file:///${project.basedir}/local-maven-repo</url>
    </repository>
</repositories>

Gehen Sie dann für jedes externe Glas, das Sie installieren möchten, zum Stammverzeichnis Ihres Projekts und führen Sie Folgendes aus:

mvn deploy:deploy-file -DgroupId=[GROUP] -DartifactId=[ARTIFACT] -Dversion=[VERS] -Durl=file:./local-maven-repo/ -DrepositoryId=local-maven-repo -DupdateReleaseInfo=true -Dfile=[FILE_PATH]
104
Anthony O.

Ich hätte gerne eine solche Lösung - benutze maven-install-plugin in der pom-Datei:

        <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-install-plugin</artifactId>
            <version>2.5.2</version>
            <executions>
                <execution>
                    <phase>initialize</phase>
                    <goals>
                        <goal>install-file</goal>
                    </goals>
                    <configuration>
                        <file>lib/yourJar.jar</file>
                        <groupId>com.somegroup.id</groupId>
                        <artifactId>artefact-id</artifactId>
                        <version>x.y.z</version>
                        <packaging>jar</packaging>
                    </configuration>
                </execution>
            </executions>
        </plugin>

In diesem Fall können Sie mvn initialize ausführen und jar wird in local maven repo installiert. Jetzt ist diese JAR-Datei während eines Maven-Schritts auf diesem Computer verfügbar (vergessen Sie nicht, diese Abhängigkeit wie jede andere Maven-Abhängigkeit in pom mit dem Tag <dependency></dependency> aufzunehmen). Es ist auch möglich, jar install nicht an den Schritt initialize zu binden, sondern an jeden anderen Schritt, den Sie möchten.

30
sphinks
<dependency>
    <groupId>group id name</groupId>
    <artifactId>artifact name</artifactId>
    <version>version number</version>
    <scope>system</scope>
    <systemPath>jar location</systemPath>
</dependency>
26
Satish Karuturi

Ja, das können Sie haben, aber es ist keine gute Idee.

Installieren Sie stattdessen alle diese Gläser, um Repos zu maven

Siehe auch

14
Jigar Joshi

Eine Möglichkeit besteht darin, es auf Ihren eigenen Maven-Repository-Manager (wie Nexus) hochzuladen. Es ist jedoch eine gute Praxis, einen eigenen Repository-Manager zu haben.

Eine andere nette Möglichkeit, die ich kürzlich gesehen habe, ist das Einbinden des Maven-Installations-Plugins in Ihren Build-Lebenszyklus: Sie deklarieren im POM, dass die Dateien im lokalen Repository installiert werden sollen. Es ist ein kleiner, aber feiner Aufwand und kein manueller Schritt erforderlich.

http://maven.Apache.org/plugins/maven-install-plugin/install-file-mojo.html

9
Puce

Fügen Sie Ihre eigene lokale JAR in die POM-Datei ein und verwenden Sie diese in maven build.

mvn install:install-file -Dfile=path-to-jar -DgroupId=owngroupid -DartifactId=ownartifactid -Dversion=ownversion -Dpackaging=jar

Zum Beispiel:

mvn install:install-file -Dfile=path-to-jar -DgroupId=com.decompiler -DartifactId=jd-core-Java -Dversion=1.2 -Dpackaging=jar

Fügen Sie es dann wie folgt zum POM hinzu:

enter image description here

8

Der wirklich schnelle und schmutzige Weg ist, auf eine lokale Datei zu verweisen:

<dependency>
      <groupId>sample</groupId>  
       <artifactId>com.sample</artifactId>  
       <version>1.0</version> 
      <scope>system</scope>
      <systemPath>C:\DEV\myfunnylib\yourJar.jar</systemPath>
</dependency>

Dies wird jedoch (offensichtlich) nur auf Ihrem Computer ausgeführt. Für die gemeinsame Nutzung ist es normalerweise sinnvoll, ein geeignetes m2-Archiv (Nexus/Artifactory) zu verwenden, oder wenn Sie keines davon haben oder keinen lokalen Maven einrichten möchten strukturierte Archivierung und Konfiguration eines "Repository" in Ihrem pom: local:

<repositories>
    <repository>
        <id>my-local-repo</id>
        <url>file://C:/DEV//mymvnrepo</url>
    </repository>
</repositories>

fernbedienung:

<repositories>
    <repository>
        <id>my-remote-repo</id>
        <url>http://192.168.0.1/whatever/mavenserver/youwant/repo</url>
    </repository>
</repositories>

hierfür ist auch ein relativer Pfad über die Variable basedir möglich:

<url>file:${basedir}</url>
8
fl0w

Natürlich können Sie diesem Ordner auch Gläser hinzufügen. Aber vielleicht tut es nicht das, was du erreichen willst ...

Wenn Sie diese Jars zum Kompilieren benötigen, überprüfen Sie diese verwandte Frage: Kann ich Jars zu maven 2 build classpath hinzufügen, ohne sie zu installieren?

Verwenden Sie den Systembereich auch NICHT, bevor jemand dies vorschlägt.

7
Cephalopod

befehlszeile :

mvn install:install-file -Dfile=c:\kaptcha-{version}.jar -DgroupId=com.google.code
-DartifactId=kaptcha -Dversion={version} -Dpackaging=jar
6
Hassani

Ein weiterer interessanter Fall ist, wenn Sie in Ihrem Projekt private Portemonnaies haben möchten. Möglicherweise möchten Sie die Funktionen von Maven beibehalten, um transitive Abhängigkeiten aufzulösen. Die Lösung ist ziemlich einfach.

  1. Erstellen Sie einen Ordner libs in Ihrem Projekt
  2. Fügen Sie die folgenden Zeilen in Ihre pom.xml-Datei ein

    <properties><local.repository.folder>${pom.basedir}/libs/</local.repository.folder>
    </properties>
    
    <repositories>
       <repository>
            <id>local-maven-repository</id>
            <url>file://${local.repository.folder}</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
       </repository>
    </repositories>
    
  3. Öffnen Sie den Ordner . M2/repository und kopieren Sie die Verzeichnisstruktur des Projekts, das Sie importieren möchten, in den Ordner libs.

Z.B. Angenommen, Sie möchten die Abhängigkeit importieren

<dependency>
    <groupId>com.mycompany.myproject</groupId>
    <artifactId>myproject</artifactId>
    <version>1.2.3</version>
</dependency>

Gehen Sie einfach auf . M2/repository und Sie werden den folgenden Ordner sehen

com/mycompany/myproject/1.2.

Kopieren Sie alles in Ihren libs-Ordner (wieder einschließlich der Ordner unter . M2/repository) und Sie sind fertig.

5
JeanValjean

Am besten erstellen Sie Ihr eigenes Remote-Repository.

Siehe hier für Einzelheiten dazu. Schauen Sie sich den Abschnitt ' Hochladen in ein Remote-Repository ' an.

3
Simeon

Schauen Sie sich auch an ...

<scope>compile</scope>

Maven-Abhängigkeiten . Dies ist die Standardeinstellung, aber ich habe in einigen Fällen festgestellt, dass Maven diesen Bereich auch explizit so einstellt, dass lokale Bibliotheken im lokalen Repository gefunden werden.

2
kervin

Dies ist eine kurze Syntax für neuere Versionen:

mvn install:install-file -Dfile=<path-to-file>

Es funktioniert, wenn die JAR von Apache Maven erstellt wurde - der häufigste Fall. Dann enthält es eine pom.xml in einem Unterordner des META-INF-Verzeichnisses, das standardmäßig gelesen wird.

Quelle: http://maven.Apache.org/guides/mini/guide-3rd-party-jars-local.html

2
joro

Ich möchte einen Code freigeben, mit dem Sie einen Ordner mit Gläsern hochladen können. Dies ist nützlich, wenn ein Anbieter kein öffentliches Repository hat und Sie viele Bibliotheken manuell hinzufügen müssen. Ich habe beschlossen, eine .bat-Datei zu erstellen, anstatt maven direkt aufzurufen, da möglicherweise nicht genügend Speicher zur Verfügung steht. Es wurde für eine Windows-Umgebung vorbereitet, kann aber leicht an Linux-Betriebssysteme angepasst werden:

import Java.io.File;
import Java.io.IOException;
import Java.io.PrintWriter;
import Java.util.Date;
import Java.util.jar.Attributes;
import Java.util.jar.JarFile;
import Java.util.jar.Manifest;

public class CreateMavenRepoApp {

    private static final String OCB_PLUGIN_FOLDER = "C://your_folder_with_jars";

    public static void main(String[] args) throws IOException {

    File directory = new File();
    //get all the files from a directory
    PrintWriter writer = new PrintWriter("update_repo_maven.bat", "UTF-8");
    writer.println("rem "+ new Date());  
    File[] fList = directory.listFiles();
    for (File file : fList){
        if (file.isFile()){               
        String absolutePath = file.getAbsolutePath() ;
        Manifest  m = new JarFile(absolutePath).getManifest();
        Attributes attributes = m.getMainAttributes();
        String symbolicName = attributes.getValue("Bundle-SymbolicName");

        if(symbolicName!=null &&symbolicName.contains("com.yourCompany.yourProject")) {
            String[] parts =symbolicName.split("\\.");
            String artifactId = parts[parts.length-1];
            String groupId = symbolicName.substring(0,symbolicName.length()-artifactId.length()-1);
            String version = attributes.getValue("Bundle-Version");
            String mavenLine= "call mvn org.Apache.maven.plugins:maven-install-plugin:2.5.1:install-file -Dfile="+ absolutePath+" -DgroupId="+ groupId+" -DartifactId="+ artifactId+" -Dversion="+ version+" -Dpackaging=jar ";
            writer.println(mavenLine);          
        }

        }
    }
    writer.close();
    }

}

Führen Sie die Datei update_repo_maven.bat aus, nachdem Sie diese Hauptdatei von einer beliebigen IDE ausgeführt haben.

2
Luis Muzikant

Beachten Sie, dass es NICHT unbedingt eine gute Idee ist, ein lokales Repo zu verwenden. Wenn dieses Projekt mit anderen geteilt wird, haben alle anderen Probleme und Fragen, wenn es nicht funktioniert, und das Glas wird auch in Ihrem Versionsverwaltungssystem nicht verfügbar sein!

Obwohl das gemeinsame Repo die beste Antwort ist, ist das Einbetten des Glases besser als ein lokales Repo, wenn Sie dies aus irgendeinem Grund nicht tun können. Repo-Inhalte, die nur lokal verfügbar sind, können insbesondere im Laufe der Zeit viele Probleme verursachen.

1
Frank

In Ihrem lokalen Repository können Sie Ihr jar installieren, indem Sie die Befehle eingeben

 mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> \
-DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging>

Folgen Sie diesem nützlichen Link , um dasselbe von der mkyoung-Website aus zu tun. Sie können auch Maven Guide für das gleiche überprüfen

1
bpjoshi

Aus irgendeinem Grund habe ich in der Webanwendung für die Wartung weder Alireza Fattahis Lösung noch JJ Romans Lösung ordnungsgemäß gearbeitet. In beiden Fällen geht die Zusammenstellung in Ordnung (sie sieht das Glas), aber die Verpackung enthält das Glas nicht innerhalb des Krieges.

Die einzige Möglichkeit, wie ich es schaffen konnte, bestand darin, das Glas auf /src/main/webapp/WEB-INF/lib/ zu setzen und es dann mit der Lösung von Fattahis oder Roman zu kombinieren.

1
Haroldo_OK

Ich denke, eine bessere Lösung für dieses Problem besteht darin, maven-install-plugin zu verwenden, um die Dateien bei der Installation automatisch zu installieren. So richte ich es für mein Projekt ein.

Fügen Sie zunächst den Pfad (in dem Sie die lokalen .jars speichern) als Eigenschaft hinzu.

<properties>
    <local.sdk>/path/to/jar</local.sdk>
</properties>

Fügen Sie dann unter plugins ein Plugin hinzu, um die Jars beim Kompilieren zu installieren.

<plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-install-plugin</artifactId>
    <version>2.5.2</version>
    <executions>
        <execution>
            <id>1</id>
            <phase>initialize</phase>
            <goals>
                <goal>install-file</goal>
            </goals>
            <configuration>
                <groupId>com.local.jar</groupId> 
                <artifactId>appengine-api</artifactId>
                <version>1.0</version>
                <packaging>jar</packaging>
                <file>${local.sdk}/lib/impl/appengine-api.jar</file>
            </configuration>
        </execution>
        <execution>
            <id>appengine-api-stubs</id>
            <phase>initialize</phase>
            <goals>
                <goal>install-file</goal>
            </goals>
            <configuration>
                <groupId>com.local.jar</groupId>
                <artifactId>appengine-api-stubs</artifactId>
                <version>1.0</version>
                <packaging>jar</packaging>
                <file>${local.sdk}/lib/impl/appengine-api-stubs.jar</file>
            </configuration>
        </execution>
    </executions>
</plugin>

Schließlich können Sie in Abhängigkeiten die Gläser hinzufügen

<dependency>
    <groupId>com.local.jar</groupId>
    <artifactId>appengine-api</artifactId>
    <version>1.0</version>
</dependency>

<dependency>
    <groupId>com.local.jar</groupId>
    <artifactId>appengine-api-stubs</artifactId>
    <version>1.0</version>
    <scope>test</scope>
</dependency>

Wenn Sie Ihr Projekt so einrichten, wird es auch dann weiter erstellt, wenn Sie es auf einen anderen Computer übertragen (vorausgesetzt, dass alle JAR-Dateien in dem durch die Eigenschaft local.sdk angegebenen Pfad enthalten sind).

Verwenden Sie für groupId einen eindeutigen Namen, um sicherzustellen, dass keine Konflikte vorliegen.

Wenn Sie jetzt mvn install oder mvn test lokale Gläser hinzufügen, werden diese automatisch hinzugefügt.

1
Sudara

Rufen Sie zum Installieren von Drittanbieter-JAR den folgenden Befehl auf

mvn install:install-file -DgroupId= -DartifactId= -Dversion= -Dpackaging=jar -Dfile=path

In Apache Maven 3.5.4 musste ich doppelte Anführungszeichen hinzufügen. Ohne Anführungszeichen hat es bei mir nicht geklappt.

beispiel: mvn install: install-file "-Dfile = Speicherort in der JAR-Datei" "-DgroupId = Gruppen-ID" "-DartifactId = Artefakt-ID" "-Dversion = Version" "-Dpackaging = Pakettyp"

0
Kavindu Gayan
  1. mVN installieren

Sie können Code unten in die Befehlszeile schreiben oder, wenn Sie Eclipse Built-In Maven verwenden, mit der rechten Maustaste auf Projekt -> Ausführen als -> Konfigurationen ausführen ... -> im linken Bereich mit der rechten Maustaste auf Maven Build -> Neue Konfiguration -> Schreiben der Code in Goals & im Basisverzeichnis: $ {project_loc: NameOfYourProject} -> Run

mvn install:install-file
   -Dfile=<path-to-file>
   -DgroupId=<group-id>
   -DartifactId=<artifact-id>
   -Dversion=<version>
   -Dpackaging=<packaging>
   -DgeneratePom=true

wo sich jeder auf bezieht:

<Pfad zur Datei>: Der Pfad zur zu ladenden Datei, z. B. -> c:\kaptcha-2.3.jar

<Gruppen-ID>: Die Gruppe, unter der die Datei registriert werden soll, z. B. -> com.google.code

<Artefakt-ID>: Der Artefaktname für die Datei, z. B. -> Kaptcha

<version>: Die Version der Datei, z. B. -> 2.3

<packaging>: das Verpacken der Datei, z.B. -> Glas

2.Nach der Installation wird jar in der Datei pom.xml deklariert.

 <dependency>
      <groupId>com.google.code</groupId>
      <artifactId>kaptcha</artifactId>
      <version>2.3</version>
 </dependency>
0
Mazen Embaby

DIESE ANTWORT IS NUR FÜR Eclipse-BENUTZER:

Wenn Sie Eclipse verwenden, platzieren Sie die JAR-Datei in lib /, klicken Sie mit der rechten Maustaste auf den Namen der JAR-Datei und klicken Sie auf "Zum Erstellungspfad hinzufügen". Eclipse erstellt eine "referenzierte Bibliothek" und stellt das Glas für Sie bereit

Es löste den Import des Glases sofort im Programm für mich auf

0
Anandkumar

Ich hatte den gleichen Fehler bei einer Reihe von Abhängigkeiten in meiner pom.xml. Es stellte sich heraus, dass die Versionen der Abhängigkeiten in der pom.xml nicht angegeben und im übergeordneten Repository erwähnt wurden. Aus irgendeinem Grund wurden die Versionsdetails nicht mit diesem Repo synchronisiert. Daher habe ich die Versionen manuell mit dem Tag eingegeben und es hat wie ein Zauber funktioniert. Wenig Zeit erforderlich, um die Versionen im übergeordneten Element zu suchen und hier anzugeben. Dies kann jedoch nur für die Gläser durchgeführt werden, die den Artefaktfehler anzeigen, und es funktioniert. Hoffe das hilft jemandem.

0
Ranjan Rozario