spring boot + jersey工程由jar包转为war包在tomcat中启动报错问题

第一步:
  在maven下,将Spring Boot工程由jar转换为war包启动,很简单,将pom.xml文件中的packaging改为war
    <packaging>war</packaging>
  如果你使用Gradle,你需要修改build.gradle来将war插件应用到项目上:
    apply plugin: ‘war‘
第二步:
  产生一个可部署war包的第一步是提供一个SpringBootServletInitializer子类,并覆盖它的configure方法。这充分利用了Spring框架对Servlet 3.0的支持,并允许你在应用通过servlet容器启动时配置它。通常,你只需把应用的主类改为继承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);
    }
    }
然后根据正常方式部署到应用服务器下,正常情况下应该就完成了jar包到war包的转换。

有几点需要说明,网上许多资料中(包括官方文档)说需要将artifactId为spring-boot-starter-tomcat的组件scope写为provided,即

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

原因是内嵌tomcat会与部署使用的外部tomcat起冲突,在某种情况下可能是会出问题,但是我经过测试证明,至少在我的工程中不将内嵌tomcat写为provided也是可以运行的,这样有一个好处就是,通过main方法可以直接启动,如果内嵌tomcat为provided,main方法是无法直接启动的,所以在开发时可以先自己尝试下,方便开发,等到部署时,保险起见可以调成provided。

因为我搭建了jar包的工程并且通过main方法成功启动实现了功能,原以为转为war包会很快,结果发生了错误,花了将近一天的时间才解决问题。

我是部署在tomcat下,使用jersey实现rest,结果启动发生了如下错误,

SEVERE: A child container failed during start
java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/yishi-service]]
at java.util.concurrent.FutureTask.report(FutureTask.java:122)
at java.util.concurrent.FutureTask.get(FutureTask.java:192)
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:915)
at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:871)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1407)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1397)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/yishi-service]]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:153)
... 6 more
Caused by: org.apache.catalina.LifecycleException: Failed to start component [[email protected]]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:153)
at org.apache.catalina.core.StandardContext.resourcesStart(StandardContext.java:4958)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5088)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147)
... 6 more

找了很多资料,各种原因都有,但是都不能解决我的问题,

包括通过官方网页http://start.spring.io/ 获取jersey组件的war包都是有问题的,为了这个问题还换了一个更快速的FQ工具。。。。。

于是我从spring boot fat jar中找问题,终于发现了问题所在,我使用的spring boot 版本为:1.4.2.RELEASE,添加了spring-boot-starter-jersey,其中有两项组件使工程在tomcat中通过war包形式启动报错,一项为<groupId>org.glassfish.jersey.ext</groupId> <artifactId>jersey-bean-validation</artifactId>,由于我不会使用到该组件,因此直接排除了,还有一项为<groupId>org.glassfish.jersey.ext</groupId><artifactId>jersey-spring3</artifactId> ,此项为jersey继承spring,要想jersey管理的bean使用spring的bean,必须使用,此版本为2.23.2,会导致工程启动不了,将版本改为2.22.1即可使用了。简化代码如下:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-jersey</artifactId>
  <exclusions>
  <exclusion>
  <groupId>org.glassfish.jersey.ext</groupId>
  <artifactId>jersey-bean-validation</artifactId>
  </exclusion>
  <exclusion>
  <groupId>org.glassfish.jersey.ext</groupId>
  <artifactId>jersey-spring3</artifactId>
  </exclusion>
  </exclusions>
</dependency>

<dependency>
<groupId>org.glassfish.jersey.ext</groupId>
<artifactId>jersey-spring3</artifactId>
<version>2.22.1</version><!--$NO-MVN-MAN-VER$-->
</dependency>

至此,问题就解决了,希望使用spring boot + jersey 搭建工程的小伙伴,不再踩此坑。

时间: 2024-10-25 08:29:08

spring boot + jersey工程由jar包转为war包在tomcat中启动报错问题的相关文章

使用IDEA搭建Spring boot+Mybatis工程

简介:Spring boot只使用一个核心配置文件,取消了一系列xml配置,甚至连web.xml都没有,全部使用注解的方式完成WEB层的功能.框架内置Tomcat服务器,运行启动类中的Main函数即可启动. 下面就来搭建Spring boot+Mybatis工程 新建工程 勾上web,其他的不用 Finish 完善一下目录结构: 在pom.xml配置所有相关的依赖: 1 <?xml version="1.0" encoding="UTF-8"?> 2 &

Spring Boot + Jersey发生FileNotFoundException (No such file or directory)

我在使用Spring Boot + Jersey 项目,解决了上一篇随笔中的FileNotFoundException,然后又报了一个FileNotFoundException,不过报错信息不一样了 报错信息如下: ERROR o.a.c.c.C.[Tomcat].[localhost].[/] - StandardWrapper.Throwable org.glassfish.hk2.api.MultiException: A MultiException has 1 exceptions.

Spring Boot + Jersey

Jersey是一个非常好的Java REST API库.当你用Jersey实现REST的时候,是非常自然的.同时Spring Boot是Java世界中另一个很好的工具,它减少了程序的应用配置(<初识Spring Boot>).这篇博客就介绍下如何将Jersey和Spring Boot结合起来使用. 需要注意的是Jersey本身自带了hk2这样一个DI库,所以,在结合Spring Boot使用的时候,是比较容易搞混淆的.简单的讲,你应该分清楚,哪一部分是由Spring来管理,哪一部分是由Jers

Spring Initializr 构建Spring Boot/Cloud工程

在之前的所有Spring Boot和Spring Cloud相关博文中,都会涉及Spring Boot工程的创建.而创建的方式多种多样,我们可以通过Maven来手工构建或是通过脚手架等方式快速搭建,也可以通过<Spring Boot快速入门>一文中提到的SPRING INITIALIZR页面工具来创建,相信每位读者都有自己最喜欢和最为熟练的创建方式. 本文我们将介绍嵌入的Intellij中的Spring Initializr工具,它同Web提供的创建功能一样,可以帮助我们快速的构建出一个基础的

Spring Cloud Spring Boot mybatis分布式微服务云架构(二)使用Intellij中的Spring Initializr来快速构建Spring Boot/Cloud工程

在之前的所有Spring Boot和Spring Cloud相关博文中,都会涉及Spring Boot工程的创建.而创建的方式多种多样,我们可以通过Maven来手工构建或是通过脚手架等方式快速搭建,也可以通过<Springboot快速入门>一文中提到的SPRING INITIALIZR页面工具来创建,相信每位读者都有自己最喜欢和最为熟练的创建方式. 本文我们将介绍嵌入的Intellij中的Spring Initializr工具,它同Web提供的创建功能一样,可以帮助我们快速的构建出一个基础的S

spring Boot启动报错Initialization of bean failed; nested exception is java.lang.NoSuchMethodError: org.springframework.core.annotation.AnnotatedElementUtils.getAnnotationAttributes

spring boot 启动报错如下 org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.boot.autoconfigure

IDEA下spring boot+fremarker启动报错would dispatch back to the current handler URL [/hello] again. Check your ViewResolver setup!

详细报错代码(ps:标题中写不下报错主要代码) javax.servlet.ServletException: Circular view path [hello]: would dispatch back to the current handler URL [/hello] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default vie

jar包和war包的区别(转)

jar包和war包的区别:war是一个web模块,其中需要包括WEB-INF,是可以直接运行的WEB模块.而jar一般只是包括一些class文件,在声明了Main_class之后是可以用java命令运行的.它们都是压缩的包,拿Tomcat来说,将war文件包放置它的\webapps\目录下,启动Tomcat,这个包可以自动进行解压,也就是你的web目录,相当于发布了. war包:是做好一个web应用后,通常是网站,打成包部署到容器中.jar包:通常是开发时要引用通用类,打成包便于存放管理.ear

jar包和war包的区别

jar包和war包的区别:war是一个web模块,其中需要包括WEB-INF,是可以直接运行的WEB模块. 而jar一般只是包括一些class文件,在声明了Main_class之后是可以用java命令运行的. 它们都是压缩的包,拿Tomcat来说,将war文件包放置它的\webapps\目录下,启动Tomcat,这个包可以自动进行解压,也就是你的web目录,相当于发布了. war包:是做好一个web应用后,通常是网站,打成包部署到容器中.jar包:通常是开发时要引用通用类,打成包便于存放管理.