【问题标题】:can not implement org.eclipse.persistence.internal.libraries.asm.ClassVisitor无法实现 org.eclipse.persistence.internal.libraries.asm.ClassVisitor
【发布时间】:2021-12-11 17:02:56
【问题描述】:

我正在尝试启动一个使用 eclipselink 和本地 H2 数据库的 javafx 应用程序,但出现以下错误:

 Exception in thread "main" java.lang.ExceptionInInitializerError
    at com.salesinvoicetools.salesinvoicetools/com.salesinvoicetools.AppWindow.subMain(AppWindow.java:62)
    at com.salesinvoicetools.salesinvoicetools/com.salesinvoicetools.Starter.main(Starter.java:13)
Caused by: Exception [EclipseLink-30005] (Eclipse Persistence Services - 2.7.8.v20201217-ecdf3c32c4): org.eclipse.persistence.exceptions.PersistenceUnitLoadingException
Exception Description: An exception was thrown while searching for persistence archives with ClassLoader: jdk.internal.loader.ClassLoaders$AppClassLoader@233c0b17
Internal Exception: javax.persistence.PersistenceException: Exception [EclipseLink-28018] (Eclipse Persistence Services - 2.7.8.v20201217-ecdf3c32c4): org.eclipse.persistence.exceptions.EntityManagerSetupException
Exception Description: Predeployment of PersistenceUnit [h2-localdb] failed.
Internal Exception: java.lang.IncompatibleClassChangeError: class org.eclipse.persistence.internal.jpa.metadata.accessors.objects.MetadataAsmFactory$ClassMetadataVisitor can not implement org.eclipse.persistence.internal.libraries.asm.ClassVisitor, because it is not an interface (org.eclipse.persistence.internal.l
    at org.eclipse.persistence.exceptions.PersistenceUnitLoadingException.exceptionSearchingForPersistenceResources(PersistenceUnitLoadingException.java:129)
    at org.eclipse.persistence.jpa@2.5.0/org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactoryImpl(PersistenceProvider.java:107)
    at org.eclipse.persistence.jpa@2.5.0/org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactory(PersistenceProvider.java:177)
    at javax.persistence@2.1.0/javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:79)
    at javax.persistence@2.1.0/javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54)
    at com.salesinvoicetools.salesinvoicetools/com.salesinvoicetools.dataaccess.DataAccessBase.setEntityManager(DataAccessBase.java:23)
    at com.salesinvoicetools.salesinvoicetools/com.salesinvoicetools.dataaccess.DataAccessBase.<clinit>(DataAccessBase.java:19)
    ... 2 more
Caused by: javax.persistence.PersistenceException: Exception [EclipseLink-28018] (Eclipse Persistence Services - 2.7.8.v20201217-ecdf3c32c4): org.eclipse.persistence.exceptions.EntityManagerSetupException
Exception Description: Predeployment of PersistenceUnit [h2-localdb] failed.
Internal Exception: java.lang.IncompatibleClassChangeError: class org.eclipse.persistence.internal.jpa.metadata.accessors.objects.MetadataAsmFactory$ClassMetadataVisitor can not implement org.eclipse.persistence.internal.libraries.asm.ClassVisitor, because it is not an interface (org.eclipse.persistence.internal.l
    at org.eclipse.persistence.jpa@2.5.0/org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.createPredeployFailedPersistenceException(EntityManagerSetupImpl.java:1950)
    at org.eclipse.persistence.jpa@2.5.0/org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.predeploy(EntityManagerSetupImpl.java:1941)
    at org.eclipse.persistence.jpa@2.5.0/org.eclipse.persistence.internal.jpa.deployment.JPAInitializer.callPredeploy(JPAInitializer.java:98)
    at org.eclipse.persistence.jpa@2.5.0/org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactoryImpl(PersistenceProvider.java:96)
    ... 7 more
Caused by: Exception [EclipseLink-28018] (Eclipse Persistence Services - 2.7.8.v20201217-ecdf3c32c4): org.eclipse.persistence.exceptions.EntityManagerSetupException
Exception Description: Predeployment of PersistenceUnit [h2-localdb] failed.
Internal Exception: java.lang.IncompatibleClassChangeError: class org.eclipse.persistence.internal.jpa.metadata.accessors.objects.MetadataAsmFactory$ClassMetadataVisitor can not implement org.eclipse.persistence.internal.libraries.asm.ClassVisitor, because it is not an interface (org.eclipse.persistence.internal.l
    at org.eclipse.persistence.exceptions.EntityManagerSetupException.predeployFailed(EntityManagerSetupException.java:233)
    ... 11 more
Caused by: java.lang.IncompatibleClassChangeError: class org.eclipse.persistence.internal.jpa.metadata.accessors.objects.MetadataAsmFactory$ClassMetadataVisitor can not implement org.eclipse.persistence.internal.libraries.asm.ClassVisitor, because it is not an interface (org.eclipse.persistence.internal.l
    at java.base/java.lang.ClassLoader.defineClass1(Native Method)
    at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1010)
    at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1088)
    at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:182)
    at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:814)
    at java.base/jdk.internal.loader.BuiltinClassLoader.findClassInModuleOrNull(BuiltinClassLoader.java:735)
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:660)
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:634)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:182)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:519)
    at org.eclipse.persistence.jpa@2.5.0/org.eclipse.persistence.internal.jpa.metadata.MetadataProcessor.processEntityMappings(MetadataProcessor.java:538)
    at org.eclipse.persistence.jpa@2.5.0/org.eclipse.persistence.internal.jpa.deployment.PersistenceUnitProcessor.processORMetadata(PersistenceUnitProcessor.java:581)
    at org.eclipse.persistence.jpa@2.5.0/org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.predeploy(EntityManagerSetupImpl.java:1865)
    ... 9 more

我从一个也使用 h2 和 eclipselink 的旧 eclipse 项目中复制了持久性代码,但现在它没有启动。 我尝试在 module-info.java 中添加几个 requires 语句,但仍然没有变化。

以下是 pom.xml 文件中的条目:

<dependency>
        <groupId>org.eclipse.persistence</groupId>
        <artifactId>eclipselink</artifactId>
        <version>2.7.8</version>
    </dependency>

    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>1.4.200</version>
    </dependency>

有什么想法吗?

【问题讨论】:

    标签: java jpa eclipselink h2


    【解决方案1】:

    您的依赖项中可能有两个版本的 eclipselink。

    旧版本 2.5.0 有接口 ClassVisitor

    package org.eclipse.persistence.internal.libraries.asm;
    
    /**
     * A visitor to visit a Java class. The methods of this interface must be called
     * in the following order: <tt>visit</tt> [ <tt>visitSource</tt> ] [
     * <tt>visitOuterClass</tt> ] ( <tt>visitAnnotation</tt> |
     * <tt>visitAttribute</tt> )* (<tt>visitInnerClass</tt> |
     * <tt>visitField</tt> | <tt>visitMethod</tt> )* <tt>visitEnd</tt>.
     * 
     * @author Eric Bruneton
     */
    public interface ClassVisitor {...
    

    新版本 2.7.8 有一个抽象类 ClassVisitor:

    package org.eclipse.persistence.internal.libraries.asm;
    
    /**
     * A visitor to visit a Java class. The methods of this class must be called in the following order:
     * {@code visit} [ {@code visitSource} ] [ {@code visitModule} ][ {@code visitNestHost} ][ {@code
     * visitPermittedSubclass} ][ {@code visitOuterClass} ] ( {@code visitAnnotation} | {@code
     * visitTypeAnnotation} | {@code visitAttribute} )* ( {@code visitNestMember} | {@code
     * visitInnerClass} | {@code visitRecordComponent} | {@code visitField} | {@code visitMethod} )*
     * {@code visitEnd}.
     *
     * @author Eric Bruneton
     */
    public abstract class ClassVisitor {
    

    您必须删除两个依赖项之一

    【讨论】:

      猜你喜欢
      • 2017-02-14
      • 2016-11-16
      • 2015-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-15
      • 1970-01-01
      相关资源
      最近更新 更多