LifecycleException:无法在 Tomcat 中启动组件部署战争

Posted

技术标签:

【中文标题】LifecycleException:无法在 Tomcat 中启动组件部署战争【英文标题】:LifecycleException: Failed to start component deploying war in Tomcat 【发布时间】:2016-07-23 11:38:35 【问题描述】:

我用 Spring Boot 实现了 restful api。当我在带有嵌入式 Tomcat 服务器的 Spring Boot Suite 中启动应用程序时,它可以工作。但是,当我尝试将战争部署到 Tomcat 7 时,出现以下错误:

SEVERE: Exception fixing docBase for context [/cgweb]
java.io.FileNotFoundException: /Users/djiao/Downloads/apache-tomcat-7.0.68/webapps/cgweb/LICENSE (Is a directory)

SEVERE: ContainerBase.addChild: start: 
org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/cgweb]]
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: javax.persistence.JoinColumn.foreignKey()Ljavax/persistence/ForeignKey;
Caused by: java.lang.NoSuchMethodError: javax.persistence.JoinColumn.foreignKey()Ljavax/persistence/ForeignKey;

SEVERE: Error deploying web application archive /Users/djiao/Downloads/apache-tomcat-7.0.68/webapps/cgweb.war
java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina
].StandardHost[localhost].StandardContext[/cgweb]]

我知道可能有数百个类似类型的帖子。经过我2天多的研究,以下是导致此类问题的主要原因。

    Tomcat 版本与 java 编译器版本不匹配。

我使用 java 7 编译并使用 Tomcat 7 进行部署。我确保我为 JAVA_HOME 而不是 jdk 路径设置了 jre 路径。

    jpa 2.0 和 2.1 之间的冲突(与外键错误有关)。

我在我的依赖项中都有并删除了 2.0。

    hibernate-entitymanger 和 hibernate-core 之间的版本不匹配。

检查了pom的依赖层次,都是4.3.11.Final。

    通过手动将战争复制到 webapp 文件夹进行部署。

尝试在 Tomcat 管理器 UI 中部署。

这些都不适用于我的案例。尝试了一切,但没有任何效果。由于我使用的是 Spring Boot,因此大部分配置都是自动完成的。我没有 web.xml。我在主应用程序类之前有以下注释。

@SpringBootApplication
@EntityScan("org.mdacc.rists.cghub.model") 
@EnableJpaRepositories(basePackages = "org.mdacc.rists.cghub.ws.repository")

在 application.properties 中,除了数据源配置之外,我还有以下几行。

spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.mysql5Dialect
spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.EJB3NamingStrategy
spring.data.jpa.repositories.enabled=true

还有其他可能导致部署失败的原因吗?

【问题讨论】:

检查是否有任何休眠或 JPA 相关的 jar 文件在 tomcat 服务器 lib 或 common 目录中,这优先于您在 WEB-INF/lib 中打包的文件。并且只是为了确保进行干净的构建并清理 tomcat 工作目录并重新启动。 抱歉,java.lang.NoSuchMethodError: javax.persistence.JoinColumn.foreignKey()Ljavax/persistence/ForeignKey 只意味着一件事。您在运行时的 CLASSPATH 中有一个 JPA API v2.0 jar。仍然。所以打印出运行时system.classpath 尝试使用-verbose:class 运行 Tomcat。它会告诉你 JPA 2.0 类是从哪里加载的 @Neil Stockton 如何打印运行时 system.classpath? @AndyWilkinson 我运行了startup.sh -verbose:class,但在 catalina.[date].log 中没有打印任何关于课程的信息。我应该在哪里寻找这些信息? 【参考方案1】:

总结一下这个问题,即使从这个项目中删除了 jpa 2.0 的 maven 依赖项,war 文件也同时具有 jpa 2.0 和 2.1 jar 文件。

原因是,jpa 2.0 是从另一个项目中挑选出来的,该项目是该项目的依赖项之一。为该依赖包执行 maven clean(删除 jpa 2.0 之后)并再次重建它解决了这个问题。

【讨论】:

以上是关于LifecycleException:无法在 Tomcat 中启动组件部署战争的主要内容,如果未能解决你的问题,请参考以下文章

org.apache.catalina.LifecycleException: Failed to stop component(生命周期异常)

org.apache.catalina.LifecycleException: Failed to start component

org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].Standard

org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].Standard

org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].Standard

##org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].Standa