webentwicklung-frage-antwort-db.com.de

Maven: beste Möglichkeit, benutzerdefinierte externe JAR mit meinem Projekt zu verknüpfen?

Es sind meine ersten Tage, in denen ich Maven lernte, und ich kämpfe immer noch mit den Grundlagen. Ich habe eine externe .jar-Datei (nicht in den öffentlichen Repos verfügbar), auf die ich in meinem Projekt verweisen muss, und ich versuche herauszufinden, was meine beste Option ist. 

Es ist ein kleines Projekt ohne zentrales Repository für Bibliotheken. Es muss sich also entweder um ein lokales Repository handeln (irgendwie zur Quellcodeverwaltung hinzugefügt, weiß nicht, ob es so funktionieren soll) oder die .jar-Datei muss gespeichert werden Datenträger außerhalb eines formalen Repositorys.

1) Was ist meine beste Option, um die .jar-Datei mit maven zu den Referenzen meines Projekts hinzuzufügen, da ich möchte, dass sowohl das Projekt als auch die Bibliothek in der Quellcodeverwaltung sind?

2) Ich kann immer noch nicht scheinen, dass Eclipse die Abhängigkeit sieht. Ich habe es manuell zu dem Abschnitt des Pom hinzugefügt, und es wird in m2Eclipse in der Liste Abhängigkeiten angezeigt. mvn compile und mvn package sind beide erfolgreich, aber das Programm auszuführen führt zu:

Exception in thread "main" Java.lang.Error: Unresolved compilation problems:
        LibraryStuff cannot be resolved to a type

Dies ist nach dem Bearbeiten des POMs wie folgt:

<dependency>
  <groupId>stuff</groupId>
  <artifactId>library</artifactId>
  <version>1.0</version>
  <systemPath>${lib.location}/MyLibrary.jar</systemPath>
  <scope>system</scope>
</dependency>

Soll ich mvn install: install-file ausführen, obwohl ich die pom.xml bereits wie oben bearbeitet habe?

Vielen Dank!

123

Ich denke, Sie sollten mvn install:install-file verwenden, um Ihr lokales Repository mit den Bibliotheksgläsern zu füllen. Dann sollten Sie den Geltungsbereich von System zu Kompilieren ändern.

Wenn Sie mit maven anfangen, empfehle ich, maven direkt und nicht IDE - Plugins zu verwenden, da dies eine zusätzliche Komplexitätsebene ergibt.

Haben Sie die erforderlichen Gläser in Ihren Klassenpfad gestellt, um den Fehler anzuzeigen? Wenn Sie Typen aus der Bibliothek verwenden, müssen Sie auch zur Laufzeit darauf zugreifen können. Das hat nichts mit Maven selbst zu tun.

Ich verstehe nicht, warum Sie die Bibliothek der Quellcodeverwaltung unterziehen wollen - sie ist für Quellcode und nicht für Binärdosen. 

58
stalker

Sie können ein In-Project-Repository erstellen, sodass Sie nicht jedes Mal run mvn install:install-fileen müssen, wenn Sie an einem neuen Computer arbeiten

<repository>
    <id>in-project</id>
    <name>In Project Repo</name>
    <url>file://${project.basedir}/libs</url>
</repository>

<dependency>
    <groupId>dropbox</groupId>
    <artifactId>dropbox-sdk</artifactId>
    <version>1.3.1</version>
</dependency>

/groupId/artifactId/version/artifactId-verion.jar

detail lesen Sie diesen Blogeintrag

http://charlie.cu.cc/2012/06/how-add-external-libraries-maven/

187
Charlie Wu

Das Maven-Handbuch sagt zu tun dies:

mvn install:install-file -Dfile=non-maven-proj.jar -DgroupId=some.group -DartifactId=non-maven-proj -Dversion=1 -Dpackaging=jar
24

Dies kann leicht mit dem <scope> -Element innerhalb des <dependency> -Elements erreicht werden.

Zum Beispiel:

 <dependencies>
   <dependency>
     <groupId>ldapjdk</groupId>
     <artifactId>ldapjdk</artifactId>
     <scope>system</scope>
     <version>1.0</version>
     <systemPath>${basedir}\src\lib\ldapjdk.jar</systemPath>
   </dependency>
 </dependencies>

Referenz: http://www.tutorialspoint.com/maven/maven_external_dependencies.htm

21
Jignesh Gohel

update Wir haben seit kurzem unseren eigenen Nexus-Server installiert, viel einfacher und sauberer.

In unserer Firma hatten wir einige Gläser, die wir häufig verwendeten, aber weder in Maven-Repositories gehostet wurden, noch wollten wir sie im lokalen Lager haben. Wir haben ein sehr einfaches mvn (öffentliches) Repo auf Github erstellt (Sie können es jedoch auf einem beliebigen Server oder lokal hosten):
note dass dies nur für die Verwaltung einiger seltener JAR-Dateien ideal ist

  1. Repo auf GitHub erstellen:
    https://github.com/<user_name>/mvn-repo/

  2. Fügen Sie das Repository in pom.xml hinzu 
    (Beachten Sie, dass die vollständige Pfad-RAW-Datei sich etwas vom Repo-Namen unterscheidet.)

    <repository>
        <id>project-common</id>
        <name>Project Common</name>
        <url>https://github.com/<user_name>/mvn-repo/raw/master/</url>
    </repository>
    
  3. Hinzufügen einer Abhängigkeit zum Host (Github oder privater Server)
    ein. Alles, was Sie wissen müssen, ist, dass Dateien in dem von @glitch genannten Muster gespeichert werden
    /groupId/artifactId/version/artifactId-version.jar
    b. Erstellen Sie auf Ihrem Host die Ordner, die diesem Muster entsprechen.
    Wenn Sie über eine JAR-Datei mit dem Namen service-sdk-0.0.1.jar verfügen, erstellen Sie den Ordner service-sdk/service-sdk/0.0.1/ und legen die Jar-Datei service-sdk-0.0.1.jar dort ab.
    c. Testen Sie es, indem Sie versuchen, das Glas von einem Browser herunterzuladen (in unserem Fall: https://github.com/<user_name>/mvn-repo/raw/master/service-sdk/service-sdk/0.0.1/service-sdk-0.0.1.jar

  4. Fügen Sie der pom.xml-Datei eine Abhängigkeit hinzu:

    <dependency>
        <groupId>service-sdk</groupId>
        <artifactId>service-sdk</artifactId>
        <version>0.0.1</version>
    </dependency>
    
  5. Genießen

20
Kenny Cason

Verwenden Sie nicht systemPath. Im Gegensatz zu dem, was die Leute hier gesagt haben, können Sie eine externe Dose in einem Ordner unter Ihrem ausgecheckten Projektverzeichnis ablegen und Port Maven finden es wie andere Abhängigkeiten. Hier sind zwei entscheidende Schritte:

  1. Verwenden Sie "mvn install: install-file" mit -DlocalRepositoryPath.
  2. Konfigurieren Sie ein Repository so, dass es auf diesen Pfad in Ihrem POM verweist.

Es ist ziemlich einfach und Sie können hier ein schrittweises Beispiel finden: http://randomizedsort.blogspot.com/2011/10/configuring-maven-to-use-local-library.html

11
Nehc

Wenn Sie das gleiche Problem haben und Spring-Boot v1.4 + verwenden, können Sie dies auf diese Weise tun.

Es gibt ein includeSystemScope , das Sie verwenden können, um Abhängigkeiten des Systembereichs zur Jar hinzuzufügen.

z.B.

Ich verwende Oracle-Treiber für mein Projekt.

<dependency>
        <groupId>com.Oracle</groupId>
        <artifactId>ojdbc14</artifactId>
        <version>10.2.0.3.0</version>
        <scope>system</scope>
        <systemPath>${project.basedir}/src/main/resources/extra-jars/ojdbc14-10.2.0.3.0.jar</systemPath>
    </dependency>

dann make includeSystemScope = true, um die jar in den Pfad/BOOT-INF/lib/** aufzunehmen

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <includeSystemScope>true</includeSystemScope>
    </configuration>
</plugin>

und von der Ressource ausschließen, um ein Duplikat zu vermeiden, ist das Gefäß fett genug ~

<build>
    <testSourceDirectory>src/test/Java</testSourceDirectory>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <excludes>
                <exclude>**/*.jar</exclude>
            </excludes>
        </resource>
    </resources>
</build>

Viel Glück!

5
chendu

Maven Möglichkeit, Nicht-Maven-Gläser zu Maven-Projekt hinzuzufügen

Maven-Projekt und Nicht-Maven-Gläser

Fügen Sie die Maven-Installations-Plugins in Ihren Build-Abschnitt ein.

<plugin>
        <groupId>org.Apache.maven.plugins</groupId>
        <artifactId>maven-install-plugin</artifactId>
        <version>${version.maven-install-plugin}</version>
        <executions>

            <execution>
                <id>install-external-non-maven1-jar</id>
                <phase>clean</phase>
                <configuration>
                    <repositoryLayout>default</repositoryLayout>
                    <groupId>jar1.group</groupId>
                    <artifactId>non-maven1</artifactId>
                    <version>${version.non-maven1}</version>
                    <file>${project.basedir}/libs/non-maven1.jar</file>
                    <packaging>jar</packaging>
                    <generatePom>true</generatePom>
                </configuration>
                <goals>
                    <goal>install-file</goal>
                </goals>
            </execution>
            <execution>
                <id>install-external-non-maven2-jar</id>
                <phase>clean</phase>
                <configuration>
                    <repositoryLayout>default</repositoryLayout>
                    <groupId>jar2.group</groupId>
                    <artifactId>non-maven2</artifactId>
                    <version>${version.non-maven2}</version>
                    <file>${project.basedir}/libs/non-maven2.jar</file>
                    <packaging>jar</packaging>
                    <generatePom>true</generatePom>
                </configuration>
                <goals>
                    <goal>install-file</goal>
                </goals>
            </execution>
            <execution>
                <id>install-external-non-maven3-jar</id>
                <phase>clean</phase>
                <configuration>
                    <repositoryLayout>default</repositoryLayout>
                    <groupId>jar3.group</groupId>
                    <artifactId>non-maven3</artifactId>
                    <version>${version.non-maven3}</version>
                    <file>${project.basedir}/libs/non-maven3.jar</file>
                    <packaging>jar</packaging>
                    <generatePom>true</generatePom>
                </configuration>
                <goals>
                    <goal>install-file</goal>
                </goals>
            </execution>
        </executions>
    </plugin>

Füge die Abhängigkeit hinzu

<dependencies>
    <dependency>
        <groupId>jar1.group</groupId>
        <artifactId>non-maven1</artifactId>
        <version>${version.non-maven1}</version>
    </dependency>
    <dependency>
        <groupId>jar2.group</groupId>
        <artifactId>non-maven2</artifactId>
        <version>${version.non-maven2}</version>
    </dependency>
    <dependency>
        <groupId>jar3.group</groupId>
        <artifactId>non-maven3</artifactId>
        <version>${version.non-maven3}</version>
    </dependency>
</dependencies>

Referenzen Hinweis Ich bin der Inhaber des Blogs

5
craftsmannadeem

Ändern Sie Ihren systemPath .

<dependency>
  <groupId>stuff</groupId>
  <artifactId>library</artifactId>
  <version>1.0</version>
  <systemPath>${project.basedir}/MyLibrary.jar</systemPath>
  <scope>system</scope>
</dependency>
4
Aung Myat Hein

Die pom.xml wird Ihr lokales Repository untersuchen, um die Abhängigkeit zu finden, die Ihrem Artefakt entspricht. Außerdem sollten Sie nicht unbedingt die Attribute system scope oder systemPath verwenden. Diese sind normalerweise für Dinge im JDK und nicht in der JRE reserviert

In dieser Frage erfahren Sie, wie Sie Maven-Artefakte installieren.

3
Tim Sparg

Beachten Sie, dass alle Beispiele dieses Beispiels verwenden 

<repository>...</respository> 

erfordern äußere 

<repositories>...</repositories> 

tags einschließen. Aus einigen Beispielen ist nicht klar.

2
user3897528

Die beste Lösung ist hier ein Repository zu installieren: Nexus oder Artifactory. Wenn Ihnen ein Platz für solche Dinge zur Verfügung steht, beschleunigt dies die Dinge, indem Sie Ihre Daten von außen zwischenspeichern.

Wenn es sich bei der Sache um Open Source handelt, könnten Sie auch put in central betrachten.

Siehe die Anleitung .

2
bmargulies

Mit Eclipse Oxygen können Sie die folgenden Dinge tun:

  1. Platzieren Sie Ihre Bibliotheken in WEB-INF/lib
  2. Projekt -> Build-Pfad konfigurieren -> Bibliothek hinzufügen -> Web-App-Bibliothek

Maven nimmt sie bei der Installation des Projekts mit.

0
Rick

Wenn die externe Dose nur von einem Maven-Projekt erstellt wird, können Sie das gesamte Projekt auf Ihrem System kopieren und eine 

mvn install

im Projektverzeichnis. Dadurch wird die JAR-Datei im .m2-Verzeichnis hinzugefügt, das als lokales Maven-Repository dient. 

Jetzt können Sie das hinzufügen 

<dependency>
     <groupId>copy-from-the=maven-pom-of-existing-project</groupId>
     <artifactId>copy-from-the=maven-pom-of-existing-project</artifactId>
     <version>copy-from-the=maven-pom-of-existing-project</version>
</dependency>

Dies wird sicherstellen, dass Sie 

mvn exec:Java 

funktioniert. Bei Verwendung von hier vorgeschlagen

<scope>system</scope>

Dann müssen Sie Klassen einzeln hinzufügen, während Sie die Ausführung über die Befehlszeile ausführen.

Sie können die externen Gläser mit dem folgenden Befehl hinzufügen: hier beschrieben

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