2016-10-17 26 views
15

Mam aplikację Spring Boot i stworzyłem z tego Jar. Oto mój pom.xml:Jak dodać zależność do Spring Boot Jar w innym projekcie?

<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> 

Chcę skorzystać z tej Jar w moim innej aplikacji tak dodało ten słoik do mojej aplikacji. Ale kiedy wywołuję metodę w tym Słoiku, rzuca ona ClassNotFoundException.

Jak mogę rozwiązać ten problem? Jak mogę dodać zależność do pliku JAR Spring Boot?

+0

Nie można użyć zmanipulowanego przez wiosenny klucz-plugin-jar jako "normalnej" zależności, ponieważ jego struktura została zmieniona na "możliwą do uruchomienia" jako autonomiczny plik JAR dla Spring. Sugerowałbym wyodrębnienie kodu potrzebnego w obu aplikacjach w osobnym module nieobsługującym wiosennego rozruchu (tak tradycyjnego JAR). – Tome

Odpowiedz

35

Domyślnie Spring Boot przepakowuje twój JAR w plik wykonywalny JAR, i robi to przez umieszczenie wszystkich twoich klas wewnątrz BOOT-INF/classes i wszystkich zależnych bibliotek wewnątrz BOOT-INF/lib. Konsekwencją utworzenia tego grubego pliku JAR jest to, że nie można go już używać jako zależności od innych projektów.

Od Custom repackage classifier:

Domyślnie celem repackage zastąpi oryginalnego artefakt z przepakowaniu jeden. To rozsądne zachowanie dla modułów reprezentujących aplikację, ale jeśli moduł jest wykorzystywany jako zależność innego modułu, musisz podać klasyfikator dla przepakowanego.

Powodem tego jest to, że klasy aplikacji są spakowane w BOOT-INF/classes, więc moduł zależny nie może załadować przepakowanych klas słoika.

Jeśli chcesz zachować oryginalny główny artefakt w celu wykorzystania go jako zależność, można dodać classifier w konfiguracji repackage cel:

W tej konfiguracji, sprężyna Boot Maven Plugin utworzy 2 JARs: główny będzie taki sam jak zwykły projekt Maven, podczas gdy drugi będzie miał dołączony klasyfikator i będzie wykonywalny JAR.

+1

Tak więc przy uruchomieniu "instalacji czystej mvn" plik jar, który może być użyty jako zależność, zostanie dodany do repozytorium .m2? – Hervian

2

Co stwierdził @Tunaki był głównie poprawne, ale brakuje jednej części opartej na oryginalnym pytaniem było:

To rzucanie ClassNotFoundException. Brak zewnętrznego słoja użytego w aplikacji rozruchowej wiosna .

Wynika to z faktu, że FatJAR utworzony z opakowania maven posiada biblioteki zależne określone w określonej lokalizacji, które działają w taki sposób, w jaki Spring Boot wykonuje aplikację. Jeśli dodajesz JAR do ścieżki klasy innego programu, powinieneś zrobić to, co powiedział @Tunaki, a także dołączyć zależne pliki JAR do ścieżki klasy. Najlepszym sposobem na pracę z tym jest użycie narzędzia Maven Dependency Plugin specjalnie ukierunkowanego na mojo, aby pobrać wszystkie zależności do folderu, który można następnie określić jako ścieżkę biblioteki podczas kompilowania drugiej aplikacji.

0

Możesz skonfigurować swoje projekty tak, aby program uruchamiający wsad był oparty na słoiku, który byłby współdzielony z twoją drugą aplikacją.

Said inny sposób, jak na swój początkowy wniosek:

Chcę skorzystać z tej Jar w moim innej aplikacji tak dodało ten słoik do mojej aplikacji.

Załóżmy, że słoik jest projekt A, a aplikacja jest projekt B.

Teraz, co proponuję, jest to, że usunięcie części wodowania z A; następnie umieścisz go w nowym projekcie C, który osadziłby Spring Boot, a to prawie całkowicie opierało się na A.

Następnie, ponieważ A jest teraz prostym słojem, B może użyć go jako zależności.

0

Można rozszerzyć swój projekt przez maven montaż plugin

<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> 

Po kompilacji dostaniesz 3 słoiki. Główny będzie taki sam, jak zwykły projekt Maven, podczas gdy drugi będzie miał klasyfikator dołączony do exec i będzie wykonywalnym plikiem JAR. Trzecia nazwa słoika zostanie dołączona przez słoik-z-zależnościami i będzie zawierała twoje klasy z klasami dodanymi jako zależności w twoim wiosennym pakiecie startowym (wiosenny boot-starter-web, thymeleaf, ...), więc do pom of the aplikacja, w której chcesz dodać ten projekt jako zależność, nie będziesz musiał dodawać zależności z projektu wiosennego rozruchu.

Powiązane problemy