views:

1328

answers:

1

I'm trying to get started with Hibernate, and when executing my program I get an error during initialization. The exception is thrown by this class, copied from here:

package net.always_data.bastien_leonard;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {

    private static final SessionFactory sessionFactory = buildSessionFactory();

    private static SessionFactory buildSessionFactory() {
        try {
            // Create the SessionFactory from hibernate.cfg.xml
            return new Configuration().configure().buildSessionFactory();
        }
        catch (Throwable ex) {
            // Make sure you log the exception, as it might be swallowed
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }

}

Here is the stacktrace:

> java net/always_data/bastien_leonard/Main
Initial SessionFactory creation failed.java.lang.NoClassDefFoundError: org/hibernate/cfg/Configuration
Exception in thread "main" java.lang.ExceptionInInitializerError
    at net.always_data.bastien_leonard.HibernateUtil.buildSessionFactory(HibernateUtil.java:18)
    at net.always_data.bastien_leonard.HibernateUtil.<clinit>(HibernateUtil.java:8)
    at net.always_data.bastien_leonard.Main.main(Main.java:17)
Caused by: java.lang.NoClassDefFoundError: org/hibernate/cfg/Configuration
    at net.always_data.bastien_leonard.HibernateUtil.buildSessionFactory(HibernateUtil.java:13)
    ... 2 more
Caused by: java.lang.ClassNotFoundException: org.hibernate.cfg.Configuration
    at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:323)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:268)
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:336)
    ... 3 more

I don't know where the problem comes from, so I don't really know where to look:

  • Problem of installation? This was handled by Maven, so I guess it's correct.
  • Hibernate can't find the configuration file?
  • Problem of classpath?

I'm invoking the program from the root of the classpath, which contains my hibernate.cfg.xml file. Here is how it looks like in practice:

> pwd
/home/bastien/info/java/hibernate/test/Test/target/classes
> echo $CLASSPATH
/home/bastien/info/java/hibernate/test/Test/target/classes
> ls -F
hibernate.cfg.xml  net/
> ls -FR
.:
hibernate.cfg.xml  net/

./net:
always_data/

./net/always_data:
bastien_leonard/

./net/always_data/bastien_leonard:
Event.class  Event.hbm.xml  HibernateUtil.class  Main.class

I've tried looking into the tutorial examples provided with Hibernate, but Maven can't compile them; it complains about missing artifacts.

By the way, Maven only lets me use Hibernate 3.3.1. Is it possible to use 3.3.2 and still let Maven handle the installation?

+1  A: 

"java.lang.NoClassDefFoundError", indicating that the class loader can't find org.hibernate.cfg.Configuration says you've got a CLASSPATH problem.

echo $CLASSPATH /home/bastien/info/java/hibernate/test/Test/target/classes

You've got to add all the Hibernate JARs and dependencies into the CLASSPATH as well. I don't see them in this echo.

duffymo
Duh, I was thinking that Maven handled that automagically. Is there some easy way to automate this?
Bastien Léonard
Tell Maven that you want the dependencies in the CLASSPATH: http://maven.apache.org/shared/maven-archiver/examples/classpath.html
duffymo
Thanks. Now I'm trying to put all the dependent jars into the same directory as my jar's, but I always have a NoClassDefFoundError with org/slf4j/impl/StaticLoggerBinder, although I have put all the slf4j jars downloaded by Maven into the current directory. Any idea?
Bastien Léonard
Why not forget about Maven and see if you can build without it? Just write a script, use Ant, or your IDE without Maven. Building should not be that difficult. If the tool isn't helping, and I would argue that Maven is NOT, don't use it.
duffymo
That's what I do normally, but I'd like to avoid copying the dependent JARs in every projects -- ideally I'd install them once in a standard place, and reference them in every project. Anyway, I've started from scratch with Ant and now the example works (it was painful though). Thanks for the help!
Bastien Léonard