2016-06-22 40 views
4

Ich arbeite an einem Spring-Boot-Projekt (Projekt A), das in anderen Projekten (Projekt B, Projekt C ...) enthalten sein würde. Ich habe mehrere Abhängigkeiten in Projekt A, aber in dem Projekt, das Projekt A importiert, kann einige oder nur eine erforderlich sein. Ich versuche, einen Weg zu finden, um die Jar-Abhängigkeiten während des Packens von Projekt A auszuschließen, so dass die benötigten von Project B während der Laufzeit bereitgestellt werden. Ich möchte die Abhängigkeiten verfügbar haben, wenn das Projekt A für Testzwecke unabhängig ausgeführt wird.Spring-Boot: Abhängigkeiten von der Verpackung ausschließen

bereits versucht, die folgenden

ich verwendet hat versucht:

<scope>provided</scope> 
<optional>true</optional> 

noch die Gläser in dem letzten Artefakt enden.

auch versucht, den folgenden auf die Feder-boot-Maven-Plugin

  <plugins> 
      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
       <executions> 
        <execution> 
         <goals> 
          <goal>repackage</goal> 
         </goals> 
         <configuration> 
          <excludeArtifactIds>spring-boot-starter-redis</excludeArtifactIds> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 

Dies würde die Feder-Boot-Abhängigkeit nur entfernen, aber die Gläser für die Kinder dieser Abhängigkeit würden immer noch in dem am Ende endgültiges Artefakt.

Antwort

6

In unserem aktuellen Projekt haben wir die Anforderung eine WAR-Datei für die Anwendung zu erstellen, die in einem JEE-Server bereitgestellt werden muss. Die WAR-Datei darf nur die benötigten JAR-Dateien enthalten, ohne eine API oder Implementierung, die bereits vom JEE-Server bereitgestellt wurde.

Aber wir wollen die Möglichkeit behalten, eine ausführbare Kriegs- oder Jar-Datei zu erzeugen, wie sie standardmäßig von Boot für Testzwecke zur Verfügung gestellt wird.

Um dies zu erreichen, haben wir alle optionalen Abhängigkeiten als bereitgestellt. Zum Beispiel haben wir einige direkte Abhängigkeiten, die in der Entwicklung verwendet werden, wie der JDBC-Treiber, den wir nicht in die bereitgestellte WAR-Datei aufnehmen wollen. Außerdem gibt es einige Boot-Haupt-Starter, die Abhängigkeiten zu anderen Startern und Bibliotheken bereitstellen, die wir auf einem JEE-Server nicht benötigen. Dies ist der Fall der Spring-Boot-Starter-Tomcat und Spring-Start-Starter-JDBC Starter. In unserem Projekt haben wir die followind Abhängigkeiten in unserer pom.xml Datei:

<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-tomcat</artifactId> 
    <scope>provided</scope> 
</dependency> 
<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-jdbc</artifactId> 
    <scope>provided</scope> 
</dependency> 
<dependency> 
    <groupId>com.oracle</groupId> 
    <artifactId>ojdbc7</artifactId> 
    <scope>provided</scope> 
</dependency> 

Auf diese Weise diese Abhängigkeiten werden nicht in der ursprünglichen jar/Krieg Datei enthalten sein, aber die Feder Boot Maven Plugin enthalten sie in der lib- Ordner des umgepackten Glas/Krieg.

Diese Abhängigkeiten werden vom JEE-Server nicht gesehen, machen aber die gepackte Anwendung größer als nötig. Die Lösung ist der Feder Boot Maven zu sagen Plugin die neu verpackte Datei unter einem anderen Namen zu erstellen, sowie ohne die Entwicklungstools:

<plugin> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-maven-plugin</artifactId> 
    <configuration> 
     <mainClass>${start-class}</mainClass> 
     <classifier>exec</classifier> 
    </configuration> 
</plugin> 

Auf diese Weise Maven wird zwei Pakete für Ihre Anwendung erzeugen:

  • Das standardmäßige jar/war-Paket ohne alle angegebenen Abhängigkeiten.
  • Ein neu verpackt Name Datei, deren Enden mit _exec.jar/.war, mit allen zur Verfügung gestellt Abhängigkeiten im lib bereitgestellten Ordner und die Unterstützung der Anwendung mit Java laufen -jar Datei

In In Ihrem Fall könnten Sie die gleiche Technik verwenden, um das Paket für das Projekt A zu generieren, das in Projekt B enthalten sein soll, und das Paket für Projekt A, das als eigenständiges Projekt ausgeführt wird.

Wenn Sie das Paket für Projekt A nicht selbst erstellen müssen und es nur in Ihrer IDE testen, können Sie sogar das Spring Boot Maven Plugin von Ihrem pom.xml entfernen.

+0

Ich habe die Methode verwendet, die Sie mit der angegeben haben, und mein Problem wurde gelöst. Dadurch werden die ** artifact-exec.jar ** und ** artefact.jar ** erstellt, wobei ** artefact.jar ** als Bibliothek verwendet werden kann und ** artect-exec.jar ** zum Ausführen als verwendet werden kann eigenständige. Saubere Lösung ohne irgendwelche Hacks zu Pom-Datei. Danke Cèsar :) – Sandheep

-1

innen Projekt B pom.xml Sie folgendes tun:

<dependencies> 
    .... 
    <dependency> 
     <groupId>com.example</groupId> 
     <artifactId>projectA</artifactId> 

     <exclusions> 
      <exclusion> 
       <groupId>com.foo.bar</groupId> 
       <artifactId>baz</artifactId> 
      </exclusion> 
      .... 
     </exclusions> 
    </dependency> 
    ..... 
    </dependencies> 
+0

Danke für den Tipp. Aber ich bin mir bereits bewusst, dass dieser Ausschluss bei Projekt B gemacht werden kann. Ich wollte sehen, ob es einen Weg gibt, dies während der Verpackung von Projekt A selbst zu erreichen. Wollte die Last des Ausschließens unerwünschter Abhängigkeiten von dem implementierenden Projekt entfernen. Der Bereich mit dem Tag soll die Gläser nicht in das endgültige Artefakt einbeziehen. Wollte überprüfen, ob es einige Überschreibungen von Spring-Boot-Maven-Plugin gemacht – Sandheep

+1

gut, nach http://docs.spring.io/spring-boot/docs/current/maven-plugin/examples/exclude-dependency.html Sie schließen nur die Artefakte aus, aber nicht ihre transitiven Abhängigkeiten. – WeMakeSoftware