it-swarm.com.de

Gradle: Baue "Fat Jar" mit Spring Boot Abhängigkeiten

Ich verwende Gradle, um eine sehr einfache Spring-Boot-Anwendung (99% statischer Inhalt) in ein Gefäß mit eingebettetem Tomcat zu erstellen und zu verpacken.

Ich habe versucht, das Glas zu erstellen, das Ergebnis war zunächst 86k und wurde nicht gestartet, da einige Spring-Boot-Klassen fehlten. Ich kam zu dem Schluss, dass dieses Gefäß, das ich gemacht hatte, keine Abhängigkeiten der Anwendung enthielt, und da ich ein vollständig in sich geschlossenes Gefäß wollte, sollte ich mehr Nachforschungen anstellen.

Zu diesem Zeitpunkt habe ich den Rat entdeckt, den from {configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }-Abschnitt zum 'jar' hinzuzufügen, der dazu führt, dass er alle Abhängigkeiten einbezieht. (Ich hoffe). Ich bin mit der Idee des ternären Operators vertraut und kann sehen, was hier versucht wird.

Leider funktioniert es immer noch nicht! Hier ist der Fehler, den ich beim Starten bekomme, und unten ist mein build.gradle. 

Ich möchte eine Spring Boot-Anwendung mit eingebettetem Tomcat, die vollständig in einem Glas enthalten ist. Mache ich etwas sehr Unkonventionelles?
Jede Hilfe an dieser Stelle wäre sehr dankbar. 

(About 80 lines of successful Spring Boot launch messages followed immediately by:
18:16:54.890 [main] WARN  o.s.b.c.e.AnnotationConfigEmbeddedWebApplicationContext - Exception encountered during context initialization - cancelling refresh attempt
org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.Java:132) [SpringWsTest1.jar:na]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.Java:474) ~[SpringWsTest1.jar:na]
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.Java:117) [SpringWsTest1.jar:na]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.Java:689) [SpringWsTest1.jar:na]
    at org.springframework.boot.SpringApplication.run(SpringApplication.Java:321) [SpringWsTest1.jar:na]
    at org.springframework.boot.SpringApplication.run(SpringApplication.Java:969) [SpringWsTest1.jar:na]
    at org.springframework.boot.SpringApplication.run(SpringApplication.Java:958) [SpringWsTest1.jar:na]
    at ws.Application.main(Application.Java:11) [SpringWsTest1.jar:na]
Caused by: org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.getEmbeddedServletContainerFactory(EmbeddedWebApplicationContext.Java:182) [SpringWsTest1.jar:na]
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.Java:155) [SpringWsTest1.jar:na]
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.Java:129) [SpringWsTest1.jar:na]
    ... 7 common frames omitted
18:16:54.891 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Destroying singletons in org.s[email protected]3b084709: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,application,org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor,org.springframework.context.annotation.ConfigurationClassPostProcessor.enhancedConfigurationProcessor,demoController,greetingController,org.springframework.boot.autoconfigure.AutoConfigurationPackages]; root of factory hierarchy
18:16:54.891 [main] ERROR o.s.boot.SpringApplication - Application startup failed
org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.Java:132) ~[SpringWsTest1.jar:na]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.Java:474) ~[SpringWsTest1.jar:na]
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.Java:117) ~[SpringWsTest1.jar:na]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.Java:689) [SpringWsTest1.jar:na]
    at org.springframework.boot.SpringApplication.run(SpringApplication.Java:321) [SpringWsTest1.jar:na]
    at org.springframework.boot.SpringApplication.run(SpringApplication.Java:969) [SpringWsTest1.jar:na]
    at org.springframework.boot.SpringApplication.run(SpringApplication.Java:958) [SpringWsTest1.jar:na]
    at ws.Application.main(Application.Java:11) [SpringWsTest1.jar:na]
Caused by: org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.getEmbeddedServletContainerFactory(EmbeddedWebApplicationContext.Java:182) ~[SpringWsTest1.jar:na]
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.Java:155) ~[SpringWsTest1.jar:na]
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.Java:129) ~[SpringWsTest1.jar:na]
    ... 7 common frames omitted
Exception in thread "main" org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.Java:132)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.Java:474)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.Java:117)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.Java:689)
    at org.springframework.boot.SpringApplication.run(SpringApplication.Java:321)
    at org.springframework.boot.SpringApplication.run(SpringApplication.Java:969)
    at org.springframework.boot.SpringApplication.run(SpringApplication.Java:958)
    at ws.Application.main(Application.Java:11)
Caused by: org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.getEmbeddedServletContainerFactory(EmbeddedWebApplicationContext.Java:182)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.Java:155)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.Java:129)
    ... 7 more

build.gradle ich verwende:

println System.getProperty("Java.home")

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.2.7.RELEASE")
    }
}

apply plugin: 'Java'
apply plugin: 'Eclipse'
apply plugin: 'idea'
apply plugin: 'spring-boot'


jar {
    manifest {
        attributes 'Main-Class': 'ws.Application'
    }

    from {
        configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
    }
}


repositories {
    mavenCentral()
}


dependencies {
    compile("org.springframework.boot:spring-boot-starter-web")
    testCompile("junit:junit")
}

task wrapper(type: Wrapper) {
    gradleVersion = '2.3'
}

sourceCompatibility = 1.8
targetCompatibility = 1.8
9
user1445967

Sie müssen sich keine zusätzlichen Gradle-Konfigurationen erstellen, um ein Fettgefäß-Artefakt einer Spring-Boot-Anwendung zu erstellen, da Sie ein Gradle-Spring-Boot-Plugin verwenden. Es hat bereits eine Aufgabe bootRepackage, die es für Sie erledigt. Sie können darüber im offiziellen Benutzerhandbuch hier und hier nachlesen.

Löschen Sie einfach alles, was Sie getan haben, um den Inhalt von Abhängigkeiten zu entpacken, und verwenden Sie diese Aufgabe, um eine einzelne JAR-Datei mit Ihrer Anwendung zu erhalten.

Übrigens, Sie könnten an einer anderen Lösung interessiert sein, die möglicherweise eine bessere Archivgröße bietet, Sie können über eine davon, Capsule, in diesem Artikel lesen.

21
Stanislav

Bei aktuellen Versionen von Gradle fügen Sie dies oben in Ihrer build.gradle-Datei ein:

plugins {
    id "org.springframework.boot" version "2.0.0.RELEASE"
}

dann nur gradle build - Sie müssen nichts weiter tun.

Siehe die Startseite dieses Plugins , um die neueste Version zu finden.

1
Bohemian