wake-up-neo.com

Wie füge ich eine Abhängigkeit zu einem Spring Boot Jar in einem anderen Projekt hinzu?

Ich habe eine Spring Boot-Anwendung und daraus ein Jar erstellt. Folgendes ist mein pom.xml:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-mail</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <dependency>
        <groupId>org.thymeleaf.extras</groupId>
        <artifactId>thymeleaf-extras-Java8time</artifactId>
        <version>2.1.0.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <!-- WebJars -->
    <dependency>
        <groupId>javax.mail</groupId>
        <artifactId>mail</artifactId>
        <version>1.4.7</version>
    </dependency>
    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.6.2</version>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

Ich möchte dieses Glas in meiner anderen Anwendung verwenden, also fügte ich dieses Glas meiner Anwendung hinzu. Aber wenn ich in diesem Jar eine Methode aufrufe, wirft sie ein ClassNotFoundException.

Wie kann ich dieses Problem beheben? Wie kann ich einer Spring Boot-JAR eine Abhängigkeit hinzufügen?

44
sparrow

Standardmäßig packt Spring Boot Ihre JAR-Datei in eine ausführbare JAR-Datei. Dazu werden alle Klassen in BOOT-INF/classes Und alle abhängigen Bibliotheken in BOOT-INF/lib Eingefügt. Das Erstellen dieser fetten JAR-Datei hat zur Folge, dass Sie sie nicht mehr als Abhängigkeit für andere Projekte verwenden können.

From Klassifizierer für benutzerdefiniertes Umpacken :

Standardmäßig ersetzt das Ziel repackage das ursprüngliche Artefakt durch das neu gepackte. Dies ist ein vernünftiges Verhalten für Module, die eine App darstellen. Wenn Ihr Modul jedoch als Abhängigkeit von einem anderen Modul verwendet wird, müssen Sie einen Klassifizierer für das neu gepackte Modul bereitstellen.

Der Grund dafür ist, dass Anwendungsklassen in BOOT-INF/classes Gepackt sind, so dass das abhängige Modul die Klassen eines neu gepackten Jar nicht laden kann.

Wenn Sie das ursprüngliche Hauptartefakt behalten möchten, um es als Abhängigkeit zu verwenden, können Sie in der Zielkonfiguration von classifier ein repackage hinzufügen:

<plugin>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-maven-plugin</artifactId>
  <version>1.4.1.RELEASE</version>
  <executions>
    <execution>
      <goals>
        <goal>repackage</goal>
      </goals>
      <configuration>
        <classifier>exec</classifier>
      </configuration>
    </execution>
  </executions>
</plugin>

Mit dieser Konfiguration erstellt das Spring Boot Maven-Plugin zwei JARs: Das Haupt-Maven-Projekt entspricht einem normalen Maven-Projekt, während dem zweiten der Klassifikator angehängt und das ausführbare JAR angehängt wird.

92
Tunaki

Was @Tunaki sagte, war größtenteils korrekt, aber der eine fehlende Teil, der auf Ihrer ursprünglichen Frage beruhte, war:

Diese auslösende ClassNotFoundException. Das in der Spring Boot-Anwendung verwendete externe Gefäß fehlt.

Dies liegt an der Tatsache, dass in der aus der Maven-Verpackung erstellten FatJAR die abhängigen Bibliotheken an einem bestimmten Speicherort angegeben sind, der für die Ausführung der Anwendung durch Spring Boot geeignet ist. Wenn Sie die JAR-Datei nur zum Klassenpfad einer anderen Anwendung hinzufügen, sollten Sie das tun, was @Tunaki sagte, und auch die abhängigen JAR-Dateien zum Klassenpfad hinzufügen. Die beste Möglichkeit, damit zu arbeiten, besteht darin, das Maven-Abhängigkeits-Plugin zu verwenden, das speziell auf die dependency:copy-dependencies mojo, um alle Abhängigkeiten in einen Ordner herunterzuladen, den Sie beim Kompilieren der anderen Anwendung als Bibliothekspfad angeben können.

2
Shawn Clark

Tunakis Antwort ist richtig, funktioniert aber nicht in Spring Boot 2 .

Spring Boot 1.x

  <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>1.5.20.RELEASE</version>
    <executions>
      <execution>
        <goals>
          <goal>repackage</goal>
        </goals>
        <configuration>
          <classifier>exec</classifier>
        </configuration>
      </execution>
    </executions>
    ...
  </plugin>

Weiterlesen


Spring Boot 2.x

Wenn Sie spring-boot-starter-parent Verwenden, wird das Ziel repackage bei einer Ausführung mit der ID repackage automatisch ausgeführt. In diesem Setup sollte nur die Konfiguration wie im folgenden Beispiel angegeben werden:

  <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <executions>
      <execution>
        <id>repackage</id>
        <configuration>
          <classifier>exec</classifier>
        </configuration>
      </execution>
    </executions>
    ...
  </plugin>

Weiterlesen

2
Andrea Ligios

Sie können Ihr Projekt mit dem maven-Assembly-Plugin erweitern

<plugin>
        <groupId>org.Apache.maven.plugins</groupId>
        <artifactId>maven-Assembly-plugin</artifactId>
        <version>3.1.0</version>
        <configuration>
        <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        </configuration>
        <executions>
        <execution>
            <id>make-Assembly</id>
            <phase>package</phase>
            <goals>
            <goal>single</goal>
            </goals>
            </execution>
        </executions>
</plugin>

Nach dem Bau erhalten Sie 3 Gläser. Das Hauptprojekt ist dasselbe wie ein gewöhnliches Maven-Projekt, während das zweite den Klassifizierer mit exec angehängt hat und die ausführbare JAR ist. Der dritte JAR-Name wird von jar-with-dependencies angehängt und enthält Ihre Klassen mit Klassen, die als Abhängigkeiten in Ihrer Spring-Boot-Anwendung (Spring-Boot-Starter-Web, Thymeleaf, ...) hinzugefügt wurden Anwendung, in der Sie dieses Projekt als Abhängigkeit hinzufügen möchten, müssen Sie keine Abhängigkeiten vom Spring-Boot-Projekt hinzufügen.

2

Für Spring Boot 2 muss die @Tunaki-Antwort entsprechend der Dokumentation etwas modifiziert werden, wenn spring-boot-starter-parent Als Parent verwendet wird:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <executions>
      <execution>
        <id>repackage</id>
        <configuration>
          <classifier>exec</classifier>
        </configuration>
      </execution>
    </executions>

Nehmen Sie nicht den zusätzlichen <id>repackage</id>, Der erforderlich ist, um die Ausführung von spring-boot-starter-parent Zu überschreiben.

0
k_o_

Sie können Ihre Projekte so einrichten, dass der Batch-Launcher auf eine JAR-Datei angewiesen ist, die für Ihre andere Anwendung freigegeben wird.

Anders gesagt, laut Ihrer ursprünglichen Anfrage:

Ich möchte dieses Glas in meiner anderen Anwendung verwenden, also fügte ich dieses Glas meiner Anwendung hinzu.

Nehmen wir an, Ihr Glas ist Ihr Projekt A und Ihre Anwendung ist Ihr Projekt B.

Ich schlage nun vor, dass Sie den Startteil von A entfernen. Dann haben Sie es in ein neues Projekt C eingefügt, in das Spring Boot eingebettet ist und das sich fast vollständig auf A verlässt.

Da A nun ein einfaches Gefäß ist, kann B es als Abhängigkeit verwenden.

0
dounyy

Verwenden Sie den folgenden Build-Abschnitt, um drei Dinge zu erledigen:

  1. Erstellen Sie das Spring Boot Jar mit dem Spring-Boot-Maven-Plugin
  2. Erstellen Sie mit dem maven-Assembly-Plugin ein normales Jar mit Ihrem Quellcode kompilierten Klassen
  3. Installieren Sie das normale Glas lokal im Ordner m2
  4. Wenn Sie die normale JAR in einem Remote-Repository bereitstellen möchten, konfigurieren Sie das Bereitstellungs-Plugin

    <project xmlns="http://maven.Apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0 http://maven.Apache.org/xsd/maven-4.0.0.xsd">
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.Apache.maven.plugins</groupId>
                <artifactId>maven-Assembly-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                        <configuration>
                            <appendAssemblyId>true</appendAssemblyId>
                            <descriptors>
                                <descriptor>src/main/resources/sources-jar-build.xml</descriptor>
                            </descriptors>
                            <finalName>${pom.artifactId}-${pom.version}</finalName>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                 <groupId>org.Apache.maven.plugins</groupId>
                <artifactId>maven-install-plugin</artifactId>
                <executions>
                    <execution>
                        <id>install-file</id>
                        <goals>
                            <goal>install-file</goal>
                        </goals>
                        <configuration>
                            <file>${pom.artifactId}-${pom.version}</file>
                            <artifactId>${pom.artifactId}</artifactId>
                            <groupId>${pom.groupId}</groupId>
                            <version>${pom.version}</version>
                        </configuration>
                    </execution>
                </executions>               
            </plugin>
        </plugins>
    </build>
    

Platzieren Sie den folgenden Inhalt in einer Datei mit dem Namen "sources-jar-build.xml" im Ressourcenordner:

<Assembly
    xmlns="http://maven.Apache.org/plugins/maven-Assembly-plugin/Assembly/1.1.2"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.Apache.org/plugins/maven-Assembly-plugin/Assembly/1.1.2 http://maven.Apache.org/xsd/Assembly-1.1.2.xsd">
    <id>sources</id>
    <includeBaseDirectory>false</includeBaseDirectory>

    <formats>
        <format>jar</format>
    </formats>
    <fileSets>
        <fileSet>
            <directory>${project.basedir}/target/classes</directory>
            <outputDirectory>/</outputDirectory>
        </fileSet>
    </fileSets>
</Assembly>
0
Kumar Abhishek