当前位置: 首页 > 知识库问答 >
问题:

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

鞠凌龙
2023-03-14

java.lang.nosuchmethoderror:javax.persistence.persistenceContext.synchronization()

在Tomcat 8中部署我的应用程序时,由于Tomcat类加载器正在从Annotations加载PersistenceContext类-位于tomcat_home\lib文件夹的api.jar文件和从Annotations加载PersistenceContext类-api.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文件夹中,而不是注释,但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。

如何在Tomcat8中提供首选项,以便Tomcat8将从javax.persistence-api-2.2.jar而不是批注-api.jar加载PersistenceContext类?

编辑:Tomcat8 lib文件夹已经包含注释-api.jar,我已经在Tomcat的lib文件夹中复制了javax.persistence-api-2.2.jar,以便在Tomcat8中支持eclipselink,所以在我的依赖项中排除注释-api.jar选项。gradle将不会作为注释-api.jar已经是Tomcat lib文件夹的一部分。我没有自己添加注释-api.jar。

注意:由于Tomcat9中存在的注释-api.jar不包含javax.persistence包,Tomcat9中运行的是相同的应用程序文件。

共有1个答案

彭博厚
2023-03-14

尝试在项目中添加javax.persistence-api-2.2.jar作为一个依赖项,并将其从tomcat lib中移除,原因是如果web应用程序类加载器没有配置为delegate=“true”,那么web应用程序的/web-inf/lib/*.jar将首先被加载

正常顺序:

  1. JVM的引导类(核心java类)
  2. /WEB-INF/web应用程序的类
  3. web应用程序
  4. /web-inf/lib/*.jar
  5. 系统类加载器类(Tomcat/Classpath特定类)
  6. 通用类加载器类(所有web应用程序通用的类)
    null
 类似资料:
  • 问题内容: 我如何返回一个包含该文件夹中的所有文件以及子文件夹的文件数组,我的方法仅适用于该文件夹,并且不包括子文件夹。 问题答案: 使用您当前的代码,进行以下调整:

  • 我正在从事Java EE项目,而不是任何框架。当我开始工作时,只有3个jar文件。目前,该特定文件夹有10个jar文件,将来可能会超过25个。这就是为什么我要对所有lib文件进行排序。 我谷歌了一下,我得到了这个链接,他们说可以这样做,但他们没有具体说明在进行更改后需要什么样的更改。所以有人知道在lib文件夹中添加文件夹后需要做什么更改吗?

  • 问题内容: 尽管我们已部署了最新的类,但我们正在使用的是旧版本的类。要扫描应用程序服务器所有子文件夹中的所有JAR文件,我们如何编写一个小的Shell脚本来打印出找到该特定类的JARS文件的文件名? 问题答案: 就像是: 您可以这样包装: 然后将在当前目录下找到的所有jar文件中搜索该类

  • 我尝试搜索一个命令,该命令可以使用命令提示符命令列出目录中的所有文件以及子文件夹。我已经阅读了“dir”命令的帮助,但找不到我要查找的内容。请帮助我什么命令可以得到这个。

  • 有关删除数据的Firebase文档中说: 删除数据 删除数据的最简单方法是对数据位置的引用调用remove()。 还可以通过将null指定为另一个写入操作(如set()或update())的值来删除。您可以将此技术与update()结合使用,在单个API调用中删除多个子项。 有谁能解释一下,我认为最后一行可以帮助我删除firebase文件夹中的所有文件是什么意思?