`

springboot打war包遇到的那些坑

 
阅读更多

官方链接:http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-create-a-deployable-war-file

 

公司开发使用了Springboot,但是为什么我们还会打成war包呢,因为我们公司的运维做了钩子,只要有代码往master上合并,它会自动部署到对应tomcat下面,所以我们公司都用war包部署项目,而且tomcat是一个很完整的servlet容器。

 

关于打war包让我们看看官网怎么说的

The first step in producing a deployable war file is to provide a SpringBootServletInitializer subclass and override its configure method. This makes use of Spring Framework’s Servlet 3.0 support and allows you to configure your application when it’s launched by the servlet container. Typically, you update your application’s main class to extend SpringBootServletInitializer:

 

@SpringBootApplication
public class Application extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }

    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
    }

}

 

 

第一步,balaba一大堆,大概就是说让你在你的主程序类上继承SpringBootServletInitializer,并实现configure方法。

 

The next step is to update your build configuration so that your project produces a war file rather than a jar file. If you’re using Maven and using spring-boot-starter-parent (which configures Maven’s war plugin for you) all you need to do is to modify pom.xml to change the packaging to war:

 

<packaging>war</packaging>

 

第二步让你将maven中的pom.xml打包方式改成war包。

 

The final step in the process is to ensure that the embedded servlet container doesn’t interfere with the servlet container to which the war file will be deployed. To do so, you need to mark the embedded servlet container dependency as provided.

 

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
</dependency>

 

第三部,让你在maven中加入这个jar包,然后你就可以安心的打成war包放到生产环境中了。

 

其实还有第四步(官方文档没有给),写出war名称,finalName这里。

 

 

<build>
        <finalName>websocket</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
</build>

 

生产环境测试(http://host:端口/war包名称),测试后发现没什么问题,美滋滋的下班了,第二天你又对这个项目开发,你发现该项目在你的idea上启动不起来了。启动项目时报了这样的错误。

 

java.lang.IllegalStateException: ApplicationEventMulticaster not initialized - call 'refresh' before multicasting events via the context: org.springframework.context.annotation.AnnotationConfigApplicationContext@4386f16: startup date [Sat Nov 18 23:58:05 CST 2017]; root of context hierarchy
	at org.springframework.context.support.AbstractApplicationContext.getApplicationEventMulticaster(AbstractApplicationContext.java:414)
	at org.springframework.context.support.ApplicationListenerDetector.postProcessBeforeDestruction(ApplicationListenerDetector.java:97)
	at org.springframework.beans.factory.support.DisposableBeanAdapter.destroy(DisposableBeanAdapter.java:253)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroyBean(DefaultSingletonBeanRegistry.java:578)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingleton(DefaultSingletonBeanRegistry.java:554)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.destroySingleton(DefaultListableBeanFactory.java:961)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingletons(DefaultSingletonBeanRegistry.java:523)
	at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.destroySingletons(FactoryBeanRegistrySupport.java:230)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.destroySingletons(DefaultListableBeanFactory.java:968)
	at org.springframework.context.support.AbstractApplicationContext.destroyBeans(AbstractApplicationContext.java:1030)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:556)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:693)
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:360)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:303)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1118)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1107)
	at com.easyto.websocket.WebsocketApplication.main(WebsocketApplication.java:11)
2017-11-18 23:58:05.752 [ERROR] org.springframework.boot.SpringApplication - Application startup failed
org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [com.easyto.websocket.WebsocketApplication]; nested exception is java.lang.IllegalStateException: Failed to introspect annotated methods on class org.springframework.boot.web.support.SpringBootServletInitializer
	at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:181)
	at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:308)
	at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:228)
	at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:270)
	at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:93)
	at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:687)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:525)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:693)
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:360)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:303)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1118)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1107)
	at com.easyto.websocket.WebsocketApplication.main(WebsocketApplication.java:11)
Caused by: java.lang.IllegalStateException: Failed to introspect annotated methods on class org.springframework.boot.web.support.SpringBootServletInitializer
	at org.springframework.core.type.StandardAnnotationMetadata.getAnnotatedMethods(StandardAnnotationMetadata.java:163)
	at org.springframework.context.annotation.ConfigurationClassParser.retrieveBeanMethodMetadata(ConfigurationClassParser.java:380)
	at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:314)
	at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:245)
	at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:198)
	at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:167)
	... 12 common frames omitted
Caused by: java.lang.NoClassDefFoundError: javax/servlet/ServletContext
	at java.lang.Class.getDeclaredMethods0(Native Method)
	at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
	at java.lang.Class.getDeclaredMethods(Class.java:1975)
	at org.springframework.core.type.StandardAnnotationMetadata.getAnnotatedMethods(StandardAnnotationMetadata.java:152)
	... 17 common frames omitted
Caused by: java.lang.ClassNotFoundException: javax.servlet.ServletContext
	at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	... 21 common frames omitted

 

你会想这是什么鬼?其实这就是官网文档的坑,解决此问题,需要你把引入的spring-boot-starter-tomcat包的范围注释掉,或者整个jar包注释掉

 

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <!--<scope>provided</scope>-->
</dependency>

 

经过实验,你可以把整个包都注释掉。

 

<!--<dependency>-->
            <!--<groupId>org.springframework.boot</groupId>-->
            <!--<artifactId>spring-boot-starter-tomcat</artifactId>-->
            <!--<scope>provided</scope>-->
<!--</dependency>-->

 

然后你也可以把你启动类中的这段代码注释掉。

 

@Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }

 

然后你会发现世界很美好,打成的包在tomcat下完美运行,项目在idea下使用springboot方式也完美运行。

 

分享到:
评论

相关推荐

    springboot 打包war包

    本话题聚焦于如何使用Maven来打包一个Spring Boot项目为WAR包。 **Maven与多模块项目** Maven是一个强大的项目管理和依赖管理工具,它通过使用一个标准的项目对象模型(Project Object Model,POM)来描述项目,并...

    springboot打包成war,中文参数乱码

    springboot打包成war,放到外部tomcat中,post请求参数中文乱码,以及tomcat控制台中文乱码问题

    springboot 打成war包 部署至tomcat 中间件运行

    1. **配置pom.xml**:在Maven的pom.xml文件中,你需要确保`packaging`元素设置为`war`,这告诉Maven我们将创建一个WAR包而不是默认的JAR包。 ```xml &lt;packaging&gt;war ``` 2. **添加Spring Boot的Tomcat依赖**:由于...

    springboot-war打包部署.doc

    JAR包则适用于那些需要快速部署和独立运行的场景。 #### 五、注意事项 - **WAR包大小**:WAR包由于包含了更多的静态资源和配置文件,通常比JAR包大。 - **部署灵活性**:WAR包的部署更为灵活,可以通过多种方式部署...

    Spring Boot项目导出war包放到tomcat运行跳转到页面出现404报错

    ### Spring Boot项目导出WAR包并部署到Tomcat遇到404错误的解析与解决方案 在实际开发过程中,经常会遇到将Spring Boot应用打包为WAR格式并部署至Tomcat服务器的需求。这种方式可以更好地与传统Java Web项目的部署...

    SpringBoot项目如何将jar包打包成war包.pdf

    SpringBoot项目通常默认打包为可独立运行的jar文件,但有时我们需要将其打包成war文件,以便部署到...完成这些步骤后,你的SpringBoot应用就可以作为一个标准的war包,部署在任何支持Servlet 3.1及以上版本的容器上了。

    SpringBoot项目Jar转War部署方案

    本文提供SpringBoot项目Jar转War部署方案,希望能够对各位提供帮助!

    springboot打包war的demo

    环境:JDK1.8+Tomcat8.5.38; 此包亲测成功能打war包,能访问controller。blog链接:https://blog.csdn.net/developerFBI/article/details/103418780

    SpringBoot打War包上传到阿里云的LINUX服务器的操作方法

    SpringBoot打War包上传到阿里云的LINUX服务器的操作方法 springboot是一个基于Java的开源框架,使用它可以快速构建生产级别的应用程序。然而,在将springboot应用程序部署到阿里云的LINUX服务器时,需要将其打包成...

    spring boot项目打包成war在tomcat运行的全步骤

    在你的`Application`类所在的包下创建一个名为`SpringBootStartApplication`的类,代码如下: ```java import org.springframework.boot.SpringApplication; import org.springframework.boot.builder....

    SpringBoot之rpm打包文档.rar

    本文档将详细介绍如何将SpringBoot应用打包成RPM包,包括完整的案例和可能遇到的问题。 1. **SpringBoot简介** - SpringBoot基于Spring框架,旨在简化初始设置和配置,提供自动配置和内嵌Web服务器功能。 - 它...

    Springboot项目正确打war包maven版pom.rar

    在Spring Boot项目中,我们通常会使用Maven作为构建...以上就是Spring Boot项目正确打war包的Maven配置方法。请根据自己的项目需求进行适当的调整,并确保所有依赖都已更新至最新稳定版本。如有问题,欢迎随时咨询。

    Springboot 打Jar包,Maven完美解决本地Jar包自动打入Springboot Jar包中

    ### Springboot 打Jar包,Maven完美解决本地Jar包自动打入Springboot Jar包中 #### 背景介绍 随着微服务架构的流行,Spring Boot 成为了开发微服务应用时首选的技术栈之一。它简化了传统的Java Web应用程序的开发...

    springBoot 打war包 程序包com.sun.istack.internal不存在的问题及解决方案

    本文主要探讨了在使用SpringBoot打包WAR时遇到com.sun.istack.internal包不存在的问题以及解决方案。 首先,问题的出现可能是由于在使用IDEA进行打包时,没有正确配置项目的打包方式。通常我们需要在项目的pom.xml...

    springboot项目打成war包并部署到Linux的Tomcat中

    springboot项目打成war包并部署到Linux的Tomcat中流程目录:启动类继承`SpringBootServletInitializer`pom文件添加`war`mvn命令操作(clean、install)打好的war包部署到Linux的Tomcat中本地访问部署好的项目 ...

    使用外置tomcat启动springboot war包的原理 7

    使用外置tomcat启动springboot_war包的原理_7

    springboot+mybatis-war

    标题“springboot+mybatis-war”表明这是一个关于使用Spring Boot框架与MyBatis持久层框架构建Web应用的项目,最终可以被打包成WAR文件。在Java Web开发中,WAR(Web ARchive)文件是标准的部署格式,适用于在如...

    将Springboot3项目打WAR包示例代码

    在Springboot3.x中将项目工程快速打成WAR包的示例代码,适合Springboot初学者或Springboot2.x升级到Springboot3.x的项目开发人员参考使用,JDK版本建议升级到21及以上,如何在Eclipse中打WAR包的方法请参考...

Global site tag (gtag.js) - Google Analytics