2015-11-07 133 views
9

我正在使用Gradle构建一个非常简单的spring引导应用程序(静态内容为99%)并将其封装到一个嵌入式tomcat的jar中。Gradle:使用Spring Boot Dependencies创建'fat jar'

我试着创建所说的jar,起初结果是86k,并没有启动,因为它缺少一些Spring引导类。我得出的结论是,这个jar包含了应用程序的所有依赖关系,并且因为我确实需要一个完全独立的jar,所以我应该做更多的研究。

这是当我发现建议将from {configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }部分添加到“jar”,这会导致它引入所有的依赖关系。 (我希望)。我熟悉三元运算符的思想,我可以看到它在这里做什么。

不幸的是,它仍然不工作!这是我启动时发生的错误,下面是我的build.gradle。

我想要一个带有嵌入式tomcat的弹簧启动应用程序,它完全包含在一个jar中。我在做一些非常规的事情吗?
在这一点上的任何帮助将不胜感激。

(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我使用:

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 

回答

16

你不必让自己的gradle额外配置构建春季启动应用程序的脂肪罐子神器,因为你使用gradle这个春季开机插件。它已经有一个任务bootRepackage为你做。您可以在官方用户指南herehere中阅读。

只需删除已解压缩的所有依赖项内容,然后使用此任务在应用程序中获取单个jar文件即可。

顺便说一句,你可能有兴趣看看其他解决方案,这可能会提供更好的档案大小,你可以阅读其中的一个,名为胶囊,in this article

+0

我在文档中发现了bootRepackage任务,并且还没有尝试使用它,因为我觉得文档没有完全解释如何。那么,我错了,因为它就像我希望的那样,在文档和作品中显示的一样简单。也感谢Capsule的领导,我将不得不尝试它。 – user1445967

+0

@Stanislav仅供参考,后者的链接不再存在。 –

+0

..自从Spring Boot 2.0以来,gradle任务被称为bootjar(和bootwar相应),请参阅https://spring.io/blog/2017/04/05/spring-boot-s-new-gradle-plugin –

相关问题