首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring运行在Tomcat8.5.x上,但不是8.0.37 java.lang.NoClassDefFoundError: org/apache/coyote/UpgradeProtocol

Spring运行在Tomcat8.5.x上,但不是8.0.37 java.lang.NoClassDefFoundError: org/apache/coyote/UpgradeProtocol
EN

Stack Overflow用户
提问于 2019-01-17 22:19:10
回答 1查看 2.2K关注 0票数 1

相对来说,Spring并不是什么新鲜事,所以我猜我做得不对。我一直在将一个较旧的java soap服务转换为spring。我能够在tomcat 8.5和更高版本上本地运行它,但是当我在tomcat 8.0.37上运行它(这是我要部署它的服务器)时,我会得到下面的错误。我在另一个项目中遇到了这个错误,但是在另一个项目中,我意识到我不必要地创建了一个servlet,因此,一旦我删除了servlet代码,我就很适合去做。在这种情况下,我需要创建一个servlet。错误是查找Tomcat 8.0.37中没有的"org/apache/coyote/UpgradeProtocol“。不知道我的代码中有什么在尝试使用它。如有任何建议请见谅,谢谢。

pom中的猫依赖关系..。

代码语言:javascript
复制
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.0.7.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

错误..。

2019年-01-17 16:05:12,539重度[StandardEngineCatalina.StandardHostlocalhost.StandardContext/exampleServices] org.apache.catalina.core.ContainerBase Method= addChildInternal Message= ContainerBase.addChild: start: org.apache.catalina.LifecycleException:未能启动组件在org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:725) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:725) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701)在org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717) at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:940) at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1816) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor( java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) ):org.springframework.beans.factory.BeanCreationException:错误创建类路径资源中定义了containerFactory的bean,通过工厂方法实例化com/removed/exampleServices/exampleServicesConfiguration.class: Bean失败;嵌套异常是org.springframework.beans.BeanInstantiationException:未能实例化org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory:工厂方法'containerFactory‘抛出的异常;嵌套的例外是java.lang.NoClassDefFoundError: org/apache/coyote/UpgradeProtocol at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1246) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1246) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1096) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:535) at org.springframework。beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:495) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:317) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:315) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:759) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:548) at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:142) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) at org.springframework.boot.SpringApplication.refreshContext(( org.springframework.boot.SpringApplication.run(SpringApplication.java:307) at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.run(SpringBootServletInitializer.java:157) at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.createRootApplicationContext(SpringBootServletInitializer.java:137) at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.java:91) at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer. )( org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5303) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145) )

下面的配置类,我假设问题在于我如何创建我的TomcatServletWebServerFactory或ServletRegistrationBean

代码语言:javascript
复制
@ComponentScan({"com.example.exampleservices", "com.example.examplesoapservices"})
@Configuration
@EnableAWSF
public class exampleservicesConfiguration {


static {
    // Statically initialize SystemImpl so it doesn't slow down first
    // request
    try {
        SystemImpl.getInstance();
    } catch (exampleException e) {
        throw new RuntimeException(e);
    }
}

@Bean
public ServletRegistrationBean messageDispatcherServlet(ApplicationContext applicationContext) {
    ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new WSSpringServlet(), "/exampleservicesSOAP/*", "/exampleservicesSOAPV3/*");
    //ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new WSSpringServlet(), "/exampleservicesPort/*", "/exampleservicesPortV3/*");
    servletRegistrationBean.setEnabled(true);
    servletRegistrationBean.setLoadOnStartup(0);
    return servletRegistrationBean;
}


@Bean
@SneakyThrows
public SpringBinding springBinding(exampleservicesSOAPImpl exampleservicesSOAPImpl, AWSFHandlers awsfHandlers) throws Exception {
    SpringBinding springBinding = new SpringBinding();
    springBinding.setUrl("/exampleservicesSOAP");
    SpringService springService = new SpringService();
    springService.setBean(exampleservicesSOAPImpl);
    springService.setHandlers(awsfHandlers.getAwsfHandlers());
    springBinding.setService(springService.getObject());
    return springBinding;
}

@Bean
@SneakyThrows
public SpringBinding springBindingV3(exampleservicesSOAPV3Impl exampleservicesSOAPV3Impl, AWSFHandlers awsfHandlers) throws Exception {
    SpringBinding springBinding = new SpringBinding();
    springBinding.setUrl("/exampleservicesSOAPV3");
    SpringService springService = new SpringService();
    springService.setBean(exampleservicesSOAPV3Impl);
    springService.setHandlers(awsfHandlers.getAwsfHandlers());
    springBinding.setService(springService.getObject());
    return springBinding;
}

@Bean
public Executor threadPoolTaskExecutor(){
    return new ThreadPoolTaskExecutor();
}

@Bean
public TomcatServletWebServerFactory  containerFactory() {
    return new TomcatServletWebServerFactory () {
        protected void customizeConnector(Connector connector) {
            super.customizeConnector(connector);
        }
    };
}

@Bean
public Jaxb2Marshaller jaxb2Marshaller() {
    Jaxb2Marshaller jaxb2Marshaller = new Jaxb2Marshaller();
    jaxb2Marshaller.setContextPath(exJAXBContext.JAXB_CONTEXT_PATH);
    return jaxb2Marshaller;
}

@Bean
private static JAXBContext initContext() {
    try {
        return JAXBContext.newInstance(BasicServiceComponents.eesvcof.getClass().getPackage().getName() + ":" + BasicServiceComponents.eesvcofV3.getClass().getPackage().getName());
    } catch (JAXBException e) {
        e.printStackTrace();
        return null;
    }

}


private static final JAXBContext context = initContext();

@Bean
public Marshaller marshaller() {
    Marshaller marshaller = null;
    try {
        marshaller = this.context.createMarshaller();
    } catch (JAXBException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    //any setters
    return marshaller;
}

@Bean
public Unmarshaller unmarshaller() {
    Unmarshaller unmarshaller = null;
    try {
        unmarshaller = this.context.createUnmarshaller();
    } catch (JAXBException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    //any setters
    return unmarshaller;
}

}

EN

回答 1

Stack Overflow用户

发布于 2019-01-20 15:58:59

嗯,很可能是因为SpringBoot2.0系列需要释放说明中提到的Tomcat8.5。UpgradeProtocol与Tomcat8.0中不存在的HTTP2相关,所以最好的方法是在application.properties中禁用HTTP2:

代码语言:javascript
复制
server.http2.enabled=false
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54245082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档