我正面临
java.lang.NoSuchMethodError:javax.persistence.PersistenceContext.synchronization((Ljavax/persistence/SynchronizationType
在Tomcat 8中部署我的应用程序时,因为tomcat类加载器正在从位于TOMCAT_HOME\lib文件夹的文件加载PersistenceContext类.jar并且从annotations-api加载PersistenceContext类.jar不包含如下同步方法
package javax.persistence;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface PersistenceContext {
String name() default "";
String unitName() default "";
PersistenceContextType type() default PersistenceContextType.TRANSACTION;
PersistenceProperty[] properties() default {};
}
虽然我想 tomcat 从 javax.persitence-api-2.2 jar 加载 PersistenceContext 类,我已经将其复制到 TOMCAT_HOME\lib 文件夹而不是 annotations-api .jar存在于 TOMCAT_HOME\lib 文件夹中,因为来自 javax.persitence-api-2.2 jar 的 PersistenceContext 类包含如下同步方法
package javax.persistence;
import java.lang.annotation.ElementType;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Repeatable(PersistenceContexts.class)
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface PersistenceContext {
String name() default "";
String unitName() default "";
PersistenceContextType type() default PersistenceContextType.TRANSACTION;
SynchronizationType synchronization() default SynchronizationType.SYNCHRONIZED;
PersistenceProperty[] properties() default {};
}
这样tomcat在部署我的应用程序时就不会给出java.lang.NoSuchMethodError:javax.persistence.PersistenceContext.synchronization((Ljavax/persistence/SynchronizationType。
如何在 Tomcat 8中给出优先级,以便 Tomcat 8 将从 javax.persistence-api-2.2 加载 PersistenceContext 类.jar而不是 annotations-api.jar ?
编辑:Tomcat 8 lib 文件夹已经包含 annotations-api.jar我已经在 Tomcat 的 lib 文件夹中复制了 javax.persistence-api-2.2.jar,以便在 Tomcat 8 中支持 eclipselink,因此在我的依赖项中排除注释 api.jar选项.gradle 不会有所帮助,因为 annotations-api .jar 已经是 Tomcat lib 文件夹的一部分。我没有自己添加注释.jar api。
注意:相同的应用程序在Tomcat 9中运行文件,因为Tomcat 9中存在的annotations-api.jar不包含javax.persistence包。
尝试将javax.persistence-api-2.2.jar添加为项目中的依赖项,并将其从tomcat lib中删除,.jar原因是如果Web应用程序类加载器未配置delegate="true
正常订单:
- JVM 的引导类(核心 java 类(
- /WEB-INF/类的 Web 应用程序
- /WEB-INF/lib/*.jar 的 Web 应用程序
- 系统类装入器类(Tomcat/类路径特定类(
- 通用类装入器类(所有 Web 应用程序通用的类(
使用delegate="true" 则排序:
- JVM 的引导类(核心 java 类(
- 系统类装入器类(Tomcat/类路径特定类(
- 通用类装入器类(所有 Web 应用程序通用的类(
- /WEB-INF/类的 Web 应用程序
- /WEB-INF/lib/*.jar 的 Web 应用程序