首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简单应用中的Hibernate NoClassDefFoundError

简单应用中的Hibernate NoClassDefFoundError
EN

Stack Overflow用户
提问于 2015-09-23 14:00:52
回答 1查看 4.4K关注 0票数 0

我读过多篇关于NoClassDefFoundError的文章,但没有找到令人满意的答案。

我已经开始学习冬眠了。我编写了简单的应用程序来将Movie对象持久化到我的数据库中。

我成功地编译了我的代码

代码语言:javascript
复制
javac -classpath ~/cp/hibernate-release-5.0.1.Final/lib/required/hibernate-core-5.0.1.Final.jar -d classes justhibernate/BasicMovieManager.java  justhibernate/Movie.java

但是,当我试图运行我的代码时

代码语言:javascript
复制
java -classpath ./:~/cp/hibernate-release-5.0.1.Final/lib/required/hibernate-core-5.0.1.Final.jar:./classes/ justhibernate.BasicMovieManager

我遇到了错误

代码语言:javascript
复制
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.NoClassDefFoundError: org/hibernate/service/ServiceRegistry
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
    at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
    at java.lang.Class.getMethod0(Class.java:3018)
    at java.lang.Class.getMethod(Class.java:1784)
    at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544)
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526)
Caused by: java.lang.ClassNotFoundException: org.hibernate.service.ServiceRegistry
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 7 more

我有hibernate.cfg.xmlMovie.hbm.xml文件在./目录中。这是我的密码:

BasicMovieManager.java

代码语言:javascript
复制
package justhibernate;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.MetadataSources;

public class BasicMovieManager 
{
    private SessionFactory sessionFactory = null;

    private void setUp() throws Exception
    {
        final StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
                .configure() 
                .build();
        try 
        {
            sessionFactory = new MetadataSources( registry )
                .buildMetadata().buildSessionFactory();
        }
        catch (Exception e) 
        {
            StandardServiceRegistryBuilder.destroy( registry );
        }
    }

    private void persistMovie(Movie movie) 
    {
        if(sessionFactory == null) 
        {
            try {setUp();}
            catch(Exception e){e.printStackTrace();}
        }   
        Session session = sessionFactory.openSession();
        session.beginTransaction();
        session.save(movie);
        session.getTransaction().commit();
        session.close();
    }

    public static void main(String[] args)
    {
        BasicMovieManager bmm = new BasicMovieManager();
        Movie m = new Movie();
        m.setId(2);
        m.setTitle("Harry Potter and the Chamber of Secrets");
        m.setDirector("Steve Kloves");
        m.setSynopsis("2nd part od thunder-face magician");
        bmm.persistMovie(m);
    }
}

Movie.java

代码语言:javascript
复制
package justhibernate;

public class Movie
{
    private int id = 0;
    private String title = null;
    private String synopsis = null;
    private String director = null;

    public void setId(int id)
    {
        this.id = id;
    }

    public int getId()
    {
        return id;
    }

    public void setTitle(String title)
    {
        this.title = title;
    }

    public String getTitle()
    {
        return title;
    }

    public void setSynopsis(String synopsis)
    {
        this.synopsis = synopsis;
    }

    public String getSynopsis()
    {
        return synopsis;
    }

    public void setDirector(String director)
    {
        this.director = director;
    }

    public String getDirector()
    {
        return director;
    }
}

hibernate.cfg.xml

代码语言:javascript
复制
<hibernate-configuration>
    <session-factory>

        <property name="connection.url">
            jdbc:mysql://localhost:3306/test
        </property>
        <property name="connection.driver_class">
            com.mysql.jdbc.Driver
        </property>
        <property name="connection.username">
            user
        </property>
        <property name="connection.password">
            password
        </property>
        <property name="dialect">
            org.hibernate.dialect.MySQL5Dialect
        </property>

        <mapping resource="Movie.hbm.xml" />

    </session-factory>
</hibernate-configuration>

Movie.hbm.xml

代码语言:javascript
复制
<hibernate-mapping>
    <class name="justhibernate.Movie" table="MOVIES">
        <id name="id" column="ID">
            <generator class="native" />
        </id>
        <property name="title" column="TITLE" />
        <property name="director" column="DIRECTOR" />
        <property name="synopsis" column="SYNOPSIS" />
    </class>
</hibernate-mapping>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-23 14:38:38

看起来它是由Hibernate库的相对路径(以home符号~开头)引起的。我尝试用绝对路径运行您的代码,它成功地找到了Hibernate。但是请注意,如果不指定MySQL JDBC、JBoss日志记录和其他必需库的路径,您的代码就无法运行,完整列表是这里

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32741729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档