Spring Boot 应用 WAR 部署到 Resin 4:有没有办法先使用 app (WEB-INF/lib) 类加载器?
Posted
技术标签:
【中文标题】Spring Boot 应用 WAR 部署到 Resin 4:有没有办法先使用 app (WEB-INF/lib) 类加载器?【英文标题】:Spring Boot application WAR deployment to Resin 4: is there a way to use app (WEB-INF/lib) classloader first? 【发布时间】:2018-02-27 12:45:44 【问题描述】:我正在尝试将 Spring Boot 应用程序作为 WAR 部署到 Caucho Resin 4。点击应用程序时出现错误:
org.springframework.context.ApplicationContextException: Unable to
start embedded container; nested exception is
org.springframework.beans.factory.BeanCreationException: Error creating
bean with name
'org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration'
: Bean instantiation via constructor failed; nested exception is
org.springframework.beans.BeanInstantiationException: Failed to
instantiate
[org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration$
$EnhancerBySpringCGLIB$$58b91c9d]: Constructor threw exception; nested
exception is
org.springframework.beans.factory.UnsatisfiedDependencyException: Error
creating bean with name 'dashboardResource' defined in file
[/var/resin/webapps/itasng-0.8.5/WEB-INF/classes/gov/nih/cit/itasng/
rest/DashboardResource.class]: Unsatisfied dependency expressed through
constructor parameter 0; nested exception is
org.springframework.beans.factory.UnsatisfiedDependencyException: Error
creating bean with name 'payPeriodRepository' defined in file
[/var/resin/webapps/itasng-0.8.5/WEB-INF/classes/gov/nih/cit/itasng/
persistence/PayPeriodRepository.class]: Unsatisfied dependency
expressed through constructor parameter 0; nested exception is
org.springframework.beans.factory.BeanCreationException: Error creating
bean with name
'org.springframework.orm.jpa.SharedEntityManagerCreator#0': Cannot
resolve reference to bean 'entityManagerFactory' while setting
constructor argument; nested exception is
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.Table.indexes()[Ljavax/persistence/Index; at
org.springframework.boot.context.embedded.EmbeddedWebApplicationContext
.onRefresh(EmbeddedWebApplicationContext.java:137)
~[spring-boot-1.5.7.RELEASE.jar:1.5.7.RELEASE]
...
很明显,这是一个典型的类加载问题:由 Resin lib 的父类加载器加载的类(例如 lib/javaee-16.jar)会导致使用较新版本(例如 WEB-INF)构建的应用程序出现问题/lib/hibernate-jpa-2.1-api-1.0.0.Final.jar)。
我之前使用的大多数应用服务器在供应商特定的–web.xml
描述符中都有一个设置,用于切换类加载器顺序,以便首先加载 WEB-INF/lib 类。但是,如果存在这样的选项,Resin 文档并没有一个简单的答案。
有没有办法在 Resin 4 中切换类加载顺序,或者有什么替代解决方案?
【问题讨论】:
【参考方案1】:在 Resin 4.0 中没有办法先使用应用类加载器。
相关类加载问题的潜在解决方法可能涉及使用
<jvm-classpath>
优先于 Resin 的类路径。
一个示例用例是使用更高版本的 JPA 而不是开箱即用的 JPA 2.0。
文档参考:
http://www.caucho.com/resin-4.0/admin/cluster-config.xtp#jvm-classpath
【讨论】:
以上是关于Spring Boot 应用 WAR 部署到 Resin 4:有没有办法先使用 app (WEB-INF/lib) 类加载器?的主要内容,如果未能解决你的问题,请参考以下文章
一个 Spring Boot 项目,部署到 JAR 或 WAR
Spring Boot 应用 WAR 部署到 Resin 4:有没有办法先使用 app (WEB-INF/lib) 类加载器?
《Spring Boot编程实战与面试指南》05-04:Spring Boot应用的打包和部署
将 Spring Boot WAR 部署到 Tomcat 8 - 访问资源时的 HTTP 404
Spring Boot + Angular 应用程序作为 WAR 部署到 Heroku,抛出 404,除非我在 URL 中包含“index.html”