【问题标题】:java.lang.NoClassDefFoundError Exception : Hibernate Classes During Initializationjava.lang.NoClassDefFoundError 异常:初始化期间的休眠类
【发布时间】:2022-01-06 07:54:20
【问题描述】:

我有一个我无法解决的问题。我需要你的帮助来解决问题。 我有两个项目,“sampleZkProject”和“institutiongeography”。两者都是 Maven 项目。它们在 Java 8 上运行。

“sampleZkProject”是一个从 web 层负责的示例 zk 项目。它需要与制度地理学相互作用。机构地理是一个pom类型的maven项目。 Institutionalgeography 使用hibernate 作为ORM 框架。机构地理学已经通过了测试,因此我们可以通过置信区间知道它运行良好。

“sampleZkProject”的pom结构如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>experimental.tahasozgen.zk</groupId>
    <artifactId>ornek1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <properties>
        <zk.version>9.6.0</zk.version>
        <commons-io>2.6</commons-io>
        <maven.build.timestamp.format>yyyy-MM-dd</maven.build.timestamp.format>
        <packname>-${project.version}-FL-${maven.build.timestamp}</packname>
    </properties>
    <packaging>war</packaging>
    <name>The ornek1 Project</name>
    <description>The ornek1 Project</description>
    
    <licenses>
        <license>
            <name>GNU LESSER GENERAL PUBLIC LICENSE, Version 3</name>
            <url>https://www.gnu.org/licenses/lgpl.html</url>
            <distribution>repo</distribution>
        </license>
    </licenses>
    
    <repositories>
        <repository>
            <id>ZK CE</id>
            <name>ZK CE Repository</name>
            <url>https://mavensync.zkoss.org/maven2</url>
        </repository>
        <repository>
            <id>ZK EVAL</id>
            <name>ZK Evaluation Repository</name>
            <url>https://mavensync.zkoss.org/eval</url>
        </repository>
    </repositories>
    <pluginRepositories>
        <pluginRepository>
            <id>zkmaven</id>
            <name>ZK Maven Plugin Repository</name>
            <url>https://mavensync.zkoss.org/maven2/</url>
        </pluginRepository>
    </pluginRepositories>

    <dependencies>
        <dependency>
            <groupId>org.zkoss.zk</groupId>
            <artifactId>zkbind</artifactId>
            <version>${zk.version}</version>
        </dependency>
        <dependency>
            <groupId>org.zkoss.zk</groupId>
            <artifactId>zul</artifactId>
            <version>${zk.version}</version>
        </dependency>
        <dependency>
            <groupId>org.zkoss.zk</groupId>
            <artifactId>zkplus</artifactId>
            <version>${zk.version}</version>
        </dependency>
        <dependency>
            <groupId>org.zkoss.zk</groupId>
            <artifactId>zhtml</artifactId>
            <version>${zk.version}</version>
        </dependency>
        
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>${commons-io}</version>
        </dependency>

        <!--other dependencies-->
        
        <dependency>
            <groupId>com.tahasozgen.institutiongeography</groupId>
            <artifactId>institutiongeography-core</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        
        <dependency>
            <groupId>com.tahasozgen.institutiongeography</groupId>
            <artifactId>institutiongeography-entities</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        
        <dependency>
            <groupId>com.tahasozgen.institutiongeography</groupId>
            <artifactId>institutiongeography-repository</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        
        <dependency>
            <groupId>com.tahasozgen.institutiongeography</groupId>
            <artifactId>institutiongeography-businesslayer</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        
        <dependency>
            <groupId>com.tahasozgen.institutiongeography</groupId>
            <artifactId>institutiongeography-contracts</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        
        <dependency>
            <groupId>com.tahasozgen.institutiongeography</groupId>
            <artifactId>institutiongeography-service</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.4.27.Final</version>
        </dependency>
         
    </dependencies>


    <build>
        <finalName>${project.artifactId}</finalName>
        <plugins>
            <!-- Run with Jetty -->
            <plugin>
                <groupId>org.eclipse.jetty</groupId>
                <artifactId>jetty-maven-plugin</artifactId>
                <version>10.0.5</version>
                <configuration>
                    <webApp>
                        <contextPath>/${project.artifactId}</contextPath>
                        <allowDuplicateFragmentNames>true</allowDuplicateFragmentNames>
                    </webApp>
                    <scanIntervalSeconds>5</scanIntervalSeconds>
                </configuration>
            </plugin>
            <!-- Compile java -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>8</source>
                    <target>8</target>
                </configuration>
            </plugin>
            <!-- Build war -->
            <plugin>
                <artifactId>maven-war-plugin</artifactId>
                <groupId>org.apache.maven.plugins</groupId>
                <version>3.3.1</version>
            </plugin>
            <!-- Pack zips -->
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.2</version>
                <executions>
                    <execution>
                        <id>webapp</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                        <configuration>
                            <finalName>ornek1${packname}</finalName>
                            <appendAssemblyId>false</appendAssemblyId>
                            <descriptors>
                                <descriptor>src/main/assembly/webapp.xml</descriptor>
                            </descriptors>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

sampleZkProject 有一个类负责与机构地理进行交互。该类的结构如下:

package experimental.tahasozgen.zk.ornek1;

import java.util.HashMap;

import org.zkoss.bind.annotation.Command;
import org.zkoss.bind.annotation.Destroy;
import org.zkoss.bind.annotation.Init;
import org.zkoss.bind.annotation.NotifyChange;
  
import experimental.tahasozgen.institutiongeography.contracts.abstracts.institutionmanagement.InstitutionService;

public class MyViewModel {
    
    private InstitutionService institutionService;

    private int count;

    @Init
    public void init() {

        count = 100;

        institutionService = experimental.tahasozgen.institutiongeography.service.dependencymanagement.DependencyResolver.getSample().resolve(InstitutionService.class);

        System.out.println(String.format("is institutionService empty? %b", institutionService ==null));        


    }

    /*other functions*/

}

experimental.tahasozgen.institutiongeography.service.dependencymanagement.DependencyResolver.getSample().resolve(Class 类实例)

是一个在运行时解析机构服务的 java 函数。当它尝试解决它时,它会运行以下内容:

private EntityManagerFactory createEntityManagerFactory() {

    return new EntityManagerFactory();

}

EntityManagerFactory的定义如下:

package experimental.tahasozgen.institutiongeography.businesslayer.dependencyresolvers;
    
package experimental.tahasozgen.institutiongeography.businesslayer.dependencyresolvers;

//import java.util.concurrent.BlockingQueue;
//import java.util.concurrent.LinkedBlockingQueue;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory; 

import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set; 
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
import org.hibernate.jpa.HibernatePersistenceProvider;
     
import experimental.tahasozgen.institutiongeography.core.crosscuttingconcern.exceptions.ExceptionAffairs;
import experimental.tahasozgen.institutiongeography.core.dataccess.entityframework.IEntityManagerFactory;

class EntityManagerFactory implements IEntityManagerFactory {
    
    private static EntityManagerFactory factory;
    
    private List<EntityManager> activeEntityManagerList;
    
    private List<EntityManager> closedEntityManagerList;
    
    static {

        try {

            if (factory == null) {
                factory = createEntityManagerFactory();
            }

        } catch (ExceptionInInitializerError hata) {
            throw hata;
        }

    }
    
    public EntityManagerFabrikasi() {
    
        activeEntityManagerList = new ArrayList <EntityManager>();
        closedEntityManagerList = new ArrayList <EntityManager>();
    }
    
    @Override
    public EntityManager createEntityManagerFactory () throws Exception {

        try {

            EntityManager entityManager = factory.createEntityManager();
            
            this.activeEntityManagerList.add(entityManager);
            
            return entityManager;
            
        } catch (Exception hata ) {

            throw hata;
            
        }
        
    }

    @Override
    public void close() throws Exception {
        
        if(this.activeEntityManagerList!= null) {
            
            for(EntityManager entityManager : this.activeEntityManagerList) {
                
                if(entityManager == null )
                    continue;
                
                entityManager.close();
                
            }
            
        }
        
        
    }

    @Override
    public void close ( EntityManager entityManager ) {
        
        if(entityManager == null)
            return;
        
        entityManager.clear();
        entityManager.close();  
    
        this.activeEntityManagerList.remove(entityManager);
        this.closedEntityManagerList.add(entityManager);
        
    }
    
    private static synchronized EntityManagerFactory createEntityManagerFactory() {

        EntityManagerFactory entityManagerFactory = new HibernatePersistenceProvider()
                .createContainerEntityManagerFactory(PersistenceUnitInfoIsleri.olusturPersistenceUnitInfo(),
                        getProperties());

        return entityManagerFactory;

    }

    private static Map<String, String> getProperties() {

        try {

            Map<String, String> result = new HashMap<String, String>();

            Properties properties = new Properties();

            String databasaConnectionDetailsFile = "details.txt";

            try (InputStream inputStream = EntityManagerFabrikasi.class.getClassLoader()
                    .getResourceAsStream(databasaConnectionDetailsFile)) {

                if (inputStream != null)
                    properties.load(inputStream);
                else
                    throw new Exception("Even if nothing happened, something definitely happened.");

            }

            Set<String> keys = properties.stringPropertyNames();

            for (String key : keys)
                result.put(key, properties.getProperty(key));

            return result;

        } catch (Exception hata) {

            ExceptionAffairs exceptionAffairs = new ExceptionAffairs();

            exceptionAffairs.report(hata);

        }

        return new HashMap<String, String>();
    }   
    
}

这里是带有EntityManagerFactory的maven模块的pom结构:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>experimental.tahasozgen</groupId>
    <artifactId>institutiongeography</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>institutiongeography-businesslayer</artifactId>
  <name>institutiongeography-businesslayer</name>
  
  <dependencies>
   
        <dependency>
            <groupId>experimental.tahasozgen</groupId>
            <artifactId>institutiongeography-core</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>experimental.tahasozgen</groupId>
            <artifactId>institutiongeography-contracts</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>experimental.tahasozgen</groupId>
            <artifactId>institutiongeography-repository</artifactId>
            <version>0.0.1-SNAPSHOT</version> 
        </dependency>
        <dependency>
            <groupId>experimental.tahasozgen</groupId>
            <artifactId>institutiongeography-entities</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        
        <!-- umumi bağımlılıklar -->
        <dependency>
            <groupId>com.baidu.unbiz</groupId>
            <artifactId>fluent-validator</artifactId>
            <version>1.0.9</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.4.27.Final</version>
        </dependency>
    </dependencies>
    
</project>

所有 maven 模块的作用域都是“编译”。 当我调试程序时,它会在不同的调试会话中引发不同的异常。抛出的异常如下:

java.lang.NoClassDefFoundError: org/hibernate/service/ServiceRegistry

java.lang.NoClassDefFoundError: org.hibernate.jpa.HibernatePersistenceProvider

我认为休眠不会在运行时加载。我该如何解决这个问题? 提前致谢。

【问题讨论】:

  • 找到丢失的类(e)所在的 maven artefact,执行 mvn dependency:tree 并确保您拥有带有 scope compile 或 runtime 的 artefact。
  • 还要确保在调试程序时,调试器中运行的定义与每个 pom 中的定义相同。有时例如诸如 Eclipse 之类的 IDE 不会自动正确。
  • 嗨,Michal,感谢您的留言。 “在调试器中运行的定义与每个 pom 中运行的定义相同”是什么意思?依赖项的定义(例如休眠)或 java 方法的定义?
  • 我的意思是,例如Eclipse 在调试时不会在运行时环境中按照 pom 包含所有 jar。也就是说,根据您的措辞,根据依赖项的定义。

标签: hibernate maven dependency-management


【解决方案1】:

问题是 pom.xml 中两个不同依赖的冲突。依赖

<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-core</artifactId>
  <version>5.4.27.Final</version>
</dependency>

institutiongeography-core 的 pom 文件和 sampleZkProject 的 pom 文件中都有定义。当我从 sampleZkProject 的 pom 文件中删除依赖项时,问题已经解决。您可以在eclipse的依赖层次部分观察依赖关系。

maven clean 命令建议在 pom 安排后发出。

【讨论】:

    猜你喜欢
    • 2012-11-01
    • 2019-08-31
    • 2019-07-24
    • 2023-01-19
    • 1970-01-01
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多