【发布时间】: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 中没有打印任何关于课程的信息。我应该在哪里寻找这些信息?
标签: hibernate rest tomcat jpa spring-boot