如何在 Resin 4.0.42 中类加载 Java EE 7 而不使用默认加载的 Default Javaee-16.jar 类
Posted
技术标签:
【中文标题】如何在 Resin 4.0.42 中类加载 Java EE 7 而不使用默认加载的 Default Javaee-16.jar 类【英文标题】:How to classload Java EE 7 in Resin 4.0.42 and not use the Default Javaee-16.jar classloaded by default 【发布时间】:2015-06-05 15:09:33 【问题描述】:我正在使用最新的 Spring 框架 4.1.5 和 Hibernate-Entity-Manager 4.3.8 以及 Javax.Persistence-api 1.0.2 以及 JPA 2.1。该规范依赖于 Java EE 7。我注意到在 Resin 4.0.42 中,它使用“javaee-16.jar”。问题是我收到以下异常:
Caused by: java.lang.NoSuchMethodError: javax.persistence.Table.indexes()
[Ljavax/persistence/Index;
at
org.hibernate.cfg.annotations.EntityBinder.processComplementaryTableDefinitions(EntityBinder.java:973)
at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:824)
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:3845)
Method javax.persistence.Table.indexes() only exists in Java EE 7
(Javax.Persistence-api 1.0.2) as a JPA 2.1 spec and NOT in Java EE 6 as a
JPA 2.0 spec.
问题是我的代码基于 JPA 2.1。反正我可以上课吗
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
</dependency>
即使在 Resin 类加载后:javaee-16.jar first?
【问题讨论】:
【参考方案1】:让它在我首先加载子库的地方工作,而不是相反。 Resin 正在加载 Parent-first。我注意到其他人在仅实现 JPA 2.0 的应用服务器上实现 JPA 2.1 时遇到了同样的挑战。关键是每个应用服务器都有自己特定的方式来首先配置子库(或您的应用程序的库)。
在我的例子中,在 Resin.xml 中,添加以下内容:
<class-loader>
<servlet-hack/>
</class-loader>
【讨论】:
嗨,我试过了,但是树脂的琥珀(树脂的 JPA 1.0 实现)在 persistence.xml 中抱怨<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"> is an unexpected top-level tag
。它是 JPA 2.1 的命名空间。你是怎么摆脱它的? (树脂 4.0.43)【参考方案2】:
我有类似的错误,因为树脂有 jpa 2.0 并且应用程序需要 jpa 2.1
通过将 lib 添加到树脂配置文件中的树脂类路径来修复
<server-default>
<jvm-classpath>path/to/lib/hibernate-jpa-2.1-api-1.0.2.Final.jar</jvm-classpath>
....
<server-default>
【讨论】:
以上是关于如何在 Resin 4.0.42 中类加载 Java EE 7 而不使用默认加载的 Default Javaee-16.jar 类的主要内容,如果未能解决你的问题,请参考以下文章