gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 22:07:23 24 4
gpt4 key购买 nike

我在面对

java.lang.NoSuchMethodError:javax.persistence.PersistenceContext.synchronization()Ljavax/persistence/SynchronizationType

在 Tomcat 8 中部署我的应用程序时,因为 tomcat 类加载器正在从位于 TOMCAT_HOME\lib 文件夹的 annotations-api.jar 文件加载 PersistenceContext 类,而来自 annotations-api.jar 的 PersistenceContext 类不包含如下同步方法

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 从我已复制到 TOMCAT_HOME\lib 文件夹的 javax.persitence-api-2.2 jar 加载 PersistenceContext 类,而不是 TOMCAT_HOME\lib 文件夹中的 annotations-api.jar,因为 PersistenceContext 类来自 javax.persitence- api-2.2 jar包含同步方法如下

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.jar 而不是 annotations-api.jar 加载 PersistenceContext 类?

编辑:Tomcat 8 lib 文件夹已经包含 annotations-api.jar 并且我在 Tomcat 的 lib 文件夹中复制了 javax.persistence-api-2.2.jar 以支持 Tomcat 8 中的 eclipselink,因此在我的文件中排除 annotations-api.jar 选项dependencies.gradle 不会有帮助,因为 annotations-api.jar 已经是 Tomcat 的 lib 文件夹的一部分。我没有自己添加annotations-api.jar。

注意:相同的应用程序在 Tomcat 9 中运行文件,因为 Tomcat 9 中存在的 annotations-api.jar 不包含 javax.persistence 包。

最佳答案

尝试将 javax.persistence-api-2.2.jar 作为依赖添加到您的项目中,并将其从 tomcat 库中删除,原因是您的 Web 应用程序的/WEB-INF/lib/*.jar 将被加载首先,如果 Web 应用程序类加载器没有配置 delegate="true

正常顺序:

  1. JVM 的引导类(核心 java 类)
  2. /WEB-INF/web 应用程序的类
  3. /WEB-INF/lib/*.jar 你的网络应用程序
  4. 系统类加载器类(Tomcat/类路径特定类)
  5. 通用类加载器类(所有网络应用程序通用的类)

使用 delegate="true"然后命令:

  1. JVM 的引导类(核心 java 类)
  2. 系统类加载器类(Tomcat/类路径特定类)
  3. 通用类加载器类(所有网络应用程序通用的类)
  4. /WEB-INF/web 应用程序的类
  5. /WEB-INF/lib/*.jar 你的网络应用程序

关于java.lang.NoSuchMethodError 因为 Tomcat 的 lib 文件夹中有重复的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57851764/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com