2015-11-07 11 views
9

Używam programu Gradle do zbudowania i spakowania bardzo prostego pakietu wiosennego (99% zawartości statycznej) do słoika z osadzonym tomcat.Gradle: Zbuduj "słoik tłuszczu" z zależnościami sprężyny rozruchowej

Próbowałem utworzyć wspomniany słoik, początkowo wynik wyniósł 86 tys. I nie został uruchomiony, ponieważ brakowało niektórych klas wiosennych. Doszedłem do wniosku, że ten słoik, który zawierałem, nie zawierał zależności od aplikacji, a ponieważ potrzebowałem całkowicie zamkniętego słoika, powinienem przeprowadzić więcej badań.

To wtedy odkryłem, że należy dodać sekcję from {configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } do "słoika", co powoduje, że pobiera ona wszystkie zależności. (Mam nadzieję). Jestem zaznajomiony z ideą operatora trójskładnikowego i widzę, co próbuje tutaj zrobić.

Niestety nadal nie działa! Oto błąd, który pojawia się przy uruchamianiu, a poniżej znajduje się mój build.gradle.

Chcę aplikacji wiosennego rozruchu z wbudowanym kocurem całkowicie zawartym w słoiku. Czy robię coś bardzo niekonwencjonalnego?
Każda pomoc w tym miejscu byłaby bardzo doceniana.

(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 Używam:

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 

Odpowiedz

16

Nie trzeba zrobić sobie dodatkowe konfiguracje Gradle do budowania artefakt tłuszczu słoik stosowania wiosna-boot, ponieważ użyć Gradle wiosenna wtyczka do bootowania. Ma już zadanie, aby zrobić to za Ciebie. Możesz przeczytać o tym w oficjalnym przewodniku użytkownika here i here.

Po prostu usuń wszystko, co trzeba, aby rozpakować zawartość zależności i użyj tego zadania, aby uzyskać pojedynczy plik jar z aplikacją.

Przy okazji, być może zainteresuje Cię inne rozwiązanie, które może zapewnić lepsze rozmiary archiwów, możesz przeczytać o jednym z nich, o nazwie Capsule, in this article.

+0

Znalazłem zadanie bootRepackage w dokumentacji i jeszcze nie próbowałem go użyć, ponieważ czułem, że dokumentacja nie w pełni wyjaśnia, w jaki sposób. Cóż, myliłem się, ponieważ jest to tak proste, jak pokazano w dokumentach i działa tak dobrze, jak tylko mogłem mieć nadzieję. Dziękuję również za prowadzenie w Capsule, będę musiał spróbować. – user1445967

+0

@Stanislav Po prostu FYI ten ostatni link już nie istnieje. –

+0

.. i od Spring Boot 2.0 zadanie gradle nazywa się bootjar (i odpowiednio bootwar), zobacz https://spring.io/blog/2017/04/05/spring-boot-s-new-gradle-plugin –

Powiązane problemy