Solucionado (ver solução)
Solucionado
(ver solução)
26
respostas

java.lang.NoClassDefFoundError: org/hibernate/cfg/Configuration

Tenho uma aplicação desktop, onde utilizo sessões do hibernate. Quando eu executo pelo eclipse, roda normalmente, os mapeamentos que faço e tudo. Porém quando exporto para um arquivo .jar e vou executá-lo, exibe o seguinte erro:

java.lang.NoClassDefFoundError: org/hibernate/cfg/Configuration Exception in thread "main" java.lang.ExceptionInInitializerErro... e assim por diante.

Aqui segue o arquivo hibernate.cfg.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost/gincana?createDatabaseIfNotExist=true</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">123@456</property>

        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
        <property name="hbm2ddl.auto">update</property>
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.format_sql">true</property>

        <!-- Classes -->
        <mapping class="br.com.anelise.gincana.modelo.Cadastro"/>
        <mapping class="br.com.anelise.gincana.modelo.Equipe"/>
        <mapping class="br.com.anelise.gincana.modelo.Notas"/>
        <mapping class="br.com.anelise.gincana.modelo.Prova"/>
        <mapping class="br.com.anelise.gincana.modelo.PopulaCmb"/>

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

Aqui o HibernateUtil:

public class HibernateUtil {

    private static final SessionFactory sessionFactory;

    static {
        try {
            sessionFactory = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory();

        } catch (Throwable ex) {
            /*
             * Throwable é o pai de todas as excessões então qualquer excessão que ocorrer
             * será tratada
             */
            System.out.println("Erro ao iniciar o Hibernate " + ex);
            throw new ExceptionInInitializerError(ex);
        }

    }

    // se tudo der certo retorna a sessao aberta
    public static Session getSession() {
        return sessionFactory.openSession();
    }

}
26 respostas

Oi Anelise,

Como você exportou a aplicação como um jar, dentro dele estão apenas as classes do projeto.

Ou seja, as classes do Hibernate e outras bibliotecas que você utiliza no projeto não vão juntas dentro do jar.

Você precisa então informar ao java o diretório onde estão os jars que a aplicação depende.

Via linha de comando é possível fazer isso assim:

java -cp diretorio_dos_jar -jar seuJar.jar

O parâmetro -cp é justamente para informar o caminho de onde ele deve ler as classes dos jars das bibliotecas que o projeto precisa utilizar.

Veja se resolve.

Entendi Rodrigo, vou fazer o teste. Porém eu não vou conseguir usar a aplicação fora da minha máquina então? Vou ficar dependente dos arquivos do hibernate? Ou tem alguma forma de compila-los junto ao jar?

Oi Anelise,

O jeito é levar a pasta com os jar das bibliotecas junto.

Há também uma outra alternativa, mais recomendada, que é utilizar o Maven no projeto, pois ele tem um plugin chamado Maven Assembly Plugin que consegue gerar um único jar do projeto com as dependencias embutidas nele.

Fica muito mais simples assim.

Se o seu projeto estiver utilizando o Maven, basta declarar o plugin:

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <mainClass>br.com.SuaClasseMain</mainClass>
            </manifest>
        </archive>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
    </configuration>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Dá uma pesquisada a respeito.

Rodrigo, eu tentei fazer pela forma do comando via cmd, não deu certo e agora eu não consigo executar minha aplicação nem no Eclipse mais! Fala assim:

Erro: Não foi possível localizar nem carregar a classe principal br.com.anelise.gincana.Main

Pode me ajudar...?

Como que você fez para rodar no cmd? Qual comando utilizou e em qual diretório você executou esse comando?

java -cp H:\workspaces\gincana\gincana\lib -jar gincana.jar

Utilizei na raiz do meu HD, "H:\" pois o gincana.jar se encontrava lá.

Anelise,

Você consegue zipar o jar e a pasta lib e compartilhar via google drive ou dropbox ?

Está ai o link do google drive: https://drive.google.com/file/d/1bFWm2iyFrQ99h27hdctQRji1k_xDu9zY/view?usp=sharing

Alguém pode ajudar?

Anelise,

Tentei de várias maneiras aqui, mas a única que deu certo foi convertendo o projeto para o Maven.

Você pode fazer isso assim:

  • No Eclipse, botão direito em cima do projeto -> Configure -> Convert to Maven Project
  • Abra o pom.xml do projeto e deixe ele assim:
<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>br.com.anelise</groupId>
    <artifactId>gincana</artifactId>
    <version>1.0</version>

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

    <build>
        <sourceDirectory>src</sourceDirectory>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.7.0</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.4.1</version>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifest>
                            <mainClass>br.com.anelise.gincana.Main</mainClass>
                        </manifest>
                    </archive>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>
  • OBS: nesse pom.xml deixei apenas o hibernate como dependencia, mas você precisa adicionar as outras que você utiliza no seu projeto.
  • Exclua a pasta lib do projeto, pois agora os jar serão baixados pelo Maven.

Agora para gerar o jar do projeto você clica com o botão direito nele e vai em: Run As -> Maven Install

Quando terminar de executar, ele vai criar uma pasta no projeto chamada target e dentro dela vai ter 2 jars: gincana-1.0.jar e gincana-1.0-jar-with-dependencies.jar

O jar que você tem que executar é o with-dependencies. Para rodar no terminal:

java -jar gincana-1.0-jar-with-dependencies.jar

Agora vai executar normalmente.

Entendi Rodrigo. Porém eu não vou conseguir utilizar o projeto mais no eclipse? Queria ele rodando no eclipse também, caso eu precisa fazer mais alguns testes.

E em relação aos jars que eu utilizava na pasta lib, eu tenho que obrigatoriamente adicioná-los como dependência?

E o jar como exemplo do towel que eu já peguei de outro projeto?

Mas por enquanto vou fazer esse teste que me disse. Obrigada pela imensa atenção.

Utilizando o comando que mandou em cima, com aspas eu não consegui. Tirei a aspas e tentei no DOS do windows e não foi, tentei no git bash e ele me devolveu isso:

/c/Program Files (x86)/Common Files/Oracle/Java/javapath/java: /c/Program Files (x86)/Common Files/Oracle/Java/javapath/java: cannot execute binary file

Queria uma forma de executar no próprio DOS do windows mesmo... A pessoa que eu vou passar o projeto terá somente o windows puro, sem git, sem nada.

Utilizando a dependência do hibernate no pom.xml e jogando o hibernate.cfg.xml para o src, consegui rodar a aplicação novamente. Agora só falta a questão de rodar na máquina em si mesmo... Vamos lá!!

Você conseguiu rodar no eclipse ou o jar via prompt?

Consegui rodar no eclipse, via prompt ainda não.

Fez o esquema lá do pom.xml ?

Posta aqui como está o seu pom.xml

Foi isso que eu perguntei para você, se eu ia precisar colocar todas minhas dependências realmente, e sobre as que eu tenho jar de outros projetos que não são dependências. O meu pom.xml está igual ao que você postou ai.

Quero saber se esse comando que você colocou é no git ou no cmd normal? Pois o bash no prompt da comando inexistente.

Oi Anelise,

O comando que falei você roda no prompt mesmo:

java -jar gincana-1.0-jar-with-dependencies.jar

Quais bibliotecas tem no seu projeto, além do hibernate?

Ah sim, ai com esse comando ele roda, porém da um monte de outros erros, vários Caused By.. Assim que tiver um tempo posto os erros aqui, mas creio que seja por conta das dependências que não inclui né? As bibliotecas que eu utilizei no projeto estão todas naquela pasta lib que coloquei no link do Google Drive.

solução!

Entendi.

Você precisa adicionar então as outras dependencias no pom.xml:

<dependencies>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.3.1.Final</version>
    </dependency>
    <dependency>
        <groupId>com.jgoodies</groupId>
        <artifactId>jgoodies-forms</artifactId>
        <version>1.8.0</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.46</version>
    </dependency>
    <dependency>
        <groupId>com.miglayout</groupId>
        <artifactId>miglayout</artifactId>
        <version>3.7.4</version>
    </dependency>
    <dependency>
        <groupId>net.sf.jasperreports</groupId>
        <artifactId>jasperreports</artifactId>
        <version>6.5.1</version>
    </dependency>
</dependencies>

Olá novamente Rodrigo, já adicionei todas a bibliotecas que eu estava utilizando na minha pasta lib, mas continua dando erro ao executar no cmd:

Erro ao iniciar o Hibernate org.hibernate.MappingException: Could not get constr
uctor for org.hibernate.persister.entity.SingleTableEntityPersister
Exception in thread "main" java.lang.ExceptionInInitializerError
        at br.com.anelise.gincana.util.HibernateUtil.<clinit>(HibernateUtil.java
:28)
        at br.com.anelise.gincana.view.TelaLogin.initialize(TelaLogin.java:50)
        at br.com.anelise.gincana.view.TelaLogin.<init>(TelaLogin.java:45)
        at br.com.anelise.gincana.Main.main(Main.java:17)
Caused by: org.hibernate.MappingException: Could not get constructor for org.hib
ernate.persister.entity.SingleTableEntityPersister
        at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPer
sister(PersisterFactoryImpl.java:123)
        at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPer
sister(PersisterFactoryImpl.java:77)
        at org.hibernate.metamodel.internal.MetamodelImpl.initialize(MetamodelIm
pl.java:137)
        at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.j
ava:295)
        at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFa
ctoryBuilderImpl.java:467)
        at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.jav
a:708)
        at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.jav
a:724)
        at br.com.anelise.gincana.util.HibernateUtil.<clinit>(HibernateUtil.java
:20)
        ... 3 more
Caused by: org.hibernate.HibernateException: Unable to instantiate default tupli
zer [org.hibernate.tuple.entity.PojoEntityTuplizer]
        at org.hibernate.tuple.entity.EntityTuplizerFactory.constructTuplizer(En
tityTuplizerFactory.java:91)
        at org.hibernate.tuple.entity.EntityTuplizerFactory.constructDefaultTupl
izer(EntityTuplizerFactory.java:116)
        at org.hibernate.tuple.entity.EntityMetamodel.<init>(EntityMetamodel.jav
a:382)
        at org.hibernate.persister.entity.AbstractEntityPersister.<init>(Abstrac
tEntityPersister.java:551)
        at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(Sing
leTableEntityPersister.java:124)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

        at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)

        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Sou
rce)
        at java.lang.reflect.Constructor.newInstance(Unknown Source)
        at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPer
sister(PersisterFactoryImpl.java:96)
        ... 10 more
Caused by: java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

        at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)

        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Sou
rce)
        at java.lang.reflect.Constructor.newInstance(Unknown Source)
        at org.hibernate.tuple.entity.EntityTuplizerFactory.constructTuplizer(En
tityTuplizerFactory.java:88)
        ... 19 more
Caused by: java.lang.IllegalArgumentException: Could not create type
        at net.bytebuddy.TypeCache.findOrInsert(TypeCache.java:140)
        at net.bytebuddy.TypeCache$WithInlineExpunction.findOrInsert(TypeCache.j
ava:346)
        at net.bytebuddy.TypeCache.findOrInsert(TypeCache.java:161)
        at net.bytebuddy.TypeCache$WithInlineExpunction.findOrInsert(TypeCache.j
ava:355)
        at org.hibernate.proxy.pojo.bytebuddy.ByteBuddyProxyFactory.buildProxy(B
yteBuddyProxyFactory.java:100)
        at org.hibernate.proxy.pojo.bytebuddy.ByteBuddyProxyFactory.postInstanti
ate(ByteBuddyProxyFactory.java:78)
        at org.hibernate.tuple.entity.PojoEntityTuplizer.buildProxyFactory(PojoE
ntityTuplizer.java:162)
        at org.hibernate.tuple.entity.AbstractEntityTuplizer.<init>(AbstractEnti
tyTuplizer.java:156)
        at org.hibernate.tuple.entity.PojoEntityTuplizer.<init>(PojoEntityTupliz
er.java:58)
        ... 24 more
Caused by: java.lang.NoSuchMethodError: net.bytebuddy.dynamic.loading.ClassInjec
tor$UsingLookup.isAvailable()Z
        at org.hibernate.bytecode.internal.bytebuddy.ByteBuddyState.resolveClass
LoadingStrategy(ByteBuddyState.java:95)
        at org.hibernate.proxy.pojo.bytebuddy.ByteBuddyProxyFactory.lambda$build
Proxy$1(ByteBuddyProxyFactory.java:114)
        at net.bytebuddy.TypeCache.findOrInsert(TypeCache.java:138)
        ... 32 more

Consegui Rodrigo! Fui ajustando alguns detalhes nas dependências e deu certo! Muito obrigada pela atenção que me deu!!!

Porém agora está com problema no jar que eu falei que não tem no repositório maven... Será que pode me ajudar? A lib chama towel, ela é para utilização de tabelas...

Caused by: java.lang.ClassNotFoundException: com.towel.el.annotation.AnnotationResolver

Ele não encontra a classe, porém eu já adicionei tudo certinho como dependência do Maven:

<dependency>
            <groupId>anelise.towel</groupId>
            <artifactId>towel</artifactId>
            <version>1</version>
            <scope>system</scope>
            <systemPath>G:\towel.jar</systemPath>
        </dependency>

Consegui...

mvn install:install-file -Dfile=G:\towel.jar -DgroupId=org.towel -DartifactId=towel -Dversion=1.0.0 -Dpackaging=jar -DgeneratePom=true

Problema agora é que eu executava meus relatórios a partir de uma pasta fixa no eclipse... Como posso executar essa pasta no jar?

Caused by: java.io.FileNotFoundException: relatorios\resFinal.jrxml (O sistema não pode encontrar o caminho especificado)

Consegui, tudo nos conformes! Obrigada.

Oi Anelise,

Eita que bom que conseguiu!!!!! Parabéns por não desistir :D

Bons estudos e qualquer dúvida é só postar aqui no forúm.