java.lang.NoSuchMethodError ,因为 Tomcat 的 lib 文件夹中有重复的类



我正面临

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

正常订单:

  1. JVM 的引导类(核心 java 类(
  2. /WEB-INF/类的 Web 应用程序
  3. /WEB-INF/lib/*.jar 的 Web 应用程序
  4. 系统类装入器类(Tomcat/类路径特定类(
  5. 通用类装入器类(所有 Web 应用程序通用的类(

使用delegate="true" 则排序:

  1. JVM 的引导类(核心 java 类(
  2. 系统类装入器类(Tomcat/类路径特定类(
  3. 通用类装入器类(所有 Web 应用程序通用的类(
  4. /WEB-INF/类的 Web 应用程序
  5. /WEB-INF/lib/*.jar 的 Web 应用程序

相关内容

  • 没有找到相关文章

最新更新