我正在使用Gradle构建非常简单的Spring Boot应用程序(99%静态内容)并将其打包到带有嵌入式tomcat的jar中。
我尝试创建该jar,起初结果是86k并没有启动,因为它缺少一些Spring引导类。我得出的结论是,我制作的这个jar不包含应用程序的任何依赖项,并且由于我确实想要一个完全独立的jar,因此我应该做更多的研究。
这是当我发现将from {configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }节添加到“ jar” 的建议时,这导致它提取所有依赖项的建议。(我希望)。我熟悉三元运算符的概念,可以在这里看到它的作用。
from {configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
不幸的是,它仍然无法正常工作!这是我启动时遇到的错误,下面是我的build.gradle。
我想要一个在jar中完全包含嵌入式tomcat的Spring Boot应用程序。我是否在做一些非常规的事情? 在这一点上的任何帮助将不胜感激。
(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.springframework.beans.factory.support.DefaultListableBeanFactory@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:
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
由于使用了gradle spring boot插件,因此您无需为构建spring- boot应用程序的胖罐构件而进行额外的gradle配置。它已经有一项任务bootRepackage要为您完成。您可以在此处和此处的官方用户指南中阅读有关它的信息。
bootRepackage
只需删除您完成的所有操作以解压缩依赖项内容,然后使用此任务即可在您的应用程序中获取单个jar文件。
顺便说一句,您可能有兴趣查看其他解决方案,它可能会提供更好的存档大小,您可以在本文中阅读其中一种名为Capsule的内容。