Java.lang.NoClassDefFoundError: org/hibernate/cfg/AnnotationConfiguration (RESOLVIDO!)

5 respostas
W

Pessoal, estou aprendendo hibernate e segui alguns exemplos da apostila fj21 da caelum.
Eu tenho uma pág. jsp que chama um servlet e nesse servlet é chamada a classe HibernateFactory que retorna uma sessão.

Mas ocorre o erro abaixo.
25/07/2008 21:36:15 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet ServletIncluirProdutoApostilaCaelum threw exception
java.lang.NoClassDefFoundError: org/hibernate/cfg/AnnotationConfiguration
	at br.com.wincomp.loja.HibernateFactory.<clinit>(HibernateFactory.java:11)
	at br.com.wincomp.loja.ServletIncluirProdutoApostilaCaelum.doGet(ServletIncluirProdutoApostilaCaelum.java:29)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
	at java.lang.Thread.run(Unknown Source)
E dá o erro na seguinte linha do HibernateFactory
AnnotationConfiguration cfg = new AnnotationConfiguration();

[color=red]Eu criei uma classe para testar e funcionou normalmente[/color], mas ao tentar com a HibernateFactory, dá o erro acima.

Classe de teste onde funciona normalmente
package br.com.wincomp.loja

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;

public class TesteDeConfiguracao {

	public static void main(String[] args) {

		// Cria uma configuração para a classe Produto
		AnnotationConfiguration cfg = new AnnotationConfiguration();
		System.out.println("***Instanciou AnnotationConfiguration***");
		cfg.addAnnotatedClass(Produtos.class);
		System.out.println("***Adicionou a classe produtos***");
		SessionFactory factory = cfg.buildSessionFactory();
		System.out.println("***Criou a SessionFactory***");
		// cria a sessão
		Session session = factory.openSession();
		System.out.println("***Criou a Session***");
		// fecha a sessão
		session.close();
		System.out.println("***Fechou a sessão***");
		factory.close();
		System.out.println("***Fechou a factory***");
	}
}

Seguem as saídas do console ao executar o código acima.

***Instanciou AnnotationConfiguration***
***Adicionou a classe produtos***
***Criou a SessionFactory***
***Criou a Session***
***Fechou a sessão***
***Fechou a factory***

Não deve ser problema de lib, caso contrário, não funcionaria a classe de teste, ou estou errado? Eu adicionei todas as libs referentes ao hibernate

Abaixo estão os códigos: O jsp chama o servlet abaixo que está mapeado no web.xml
br.com.wincomp.loja;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.hibernate.Session;

public class ServletIncluirProdutoApostilaCaelum extends HttpServlet{
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		
		Double codigo = Double.parseDouble(request.getParameter("codigo"));
		String descricao = request.getParameter("descricao");
		String preco = request.getParameter("preco");
		String status = request.getParameter("status");
		
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out = response.getWriter();
		
		out.print("<html>");
		out.print("<body>");
		
		try{
			Session session = new HibernateFactory().getSession();
			Produtos p = new Produtos();
			p.setCodigo(codigo);
			p.setDescricao(descricao);
			p.setPreco(preco);
			p.setStatus(status);
			session.save(p);
			System.out.println("Código do produto: " + p.getCodigo());
			out.println("<h2>Operação efetuada com sucesso!!!</h2>");
			session.close();
		}catch(Exception e){
			out.println("<h2>"+e.getMessage()+"</h2>");	
		}
		out.println("<body>");
		out.println("<html>");
		out.close();
	}	
}
O HibernateFactory
package br.com.wincomp.loja;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;

public class HibernateFactory {
	
	private static SessionFactory factory;
		static {
			AnnotationConfiguration cfg = new AnnotationConfiguration();
			cfg.addAnnotatedClass(Produtos.class);
			factory = cfg.buildSessionFactory();
		}
	public Session getSession() {
		return factory.openSession();
	}
}

O hibernate.properties está no src do projeto

hibernate.dialect org.hibernate.dialect.OracleDialect
hibernate.connection.driver_class oracle.jdbc.OracleDriver
hibernate.connection.url jdbc:oracle:thin:@localhost:1521:dba1
hibernate.connection.username user
hibernate.connection.password xxxx

Se puderam dar uma ajuda, eu agradeço.

5 Respostas

R

nao esta achando a classe:

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

veja se vc adicionou os jars do hibernate-annotations na pasta lib da sua aplicacao.

[]s.

J

Além do hibernate-core (que como você disse você adicionou as libs), você precisa também adicionar do hibernate-annotation (no site deles tem esse projeto para download).

W

Então pessoal,
estava sim adicionado a lib do annotations, aliás, eu coloquei todas as libs possíveis(annotations, entitymanager, hibernate).
Reparem no import das classes que usam annotations.

E observem também que quando executo a classe de teste, conforme mencionei acima, não ocorre o erro.
O erro ocorre quando a partir do servlet é chamada a classe HibernateFactory.
Realmente a exception lançada é como se não encontrasse a classe Annotations, mas ela está lá, senão não daria pra importar.
Não sei mais onde procurar. :frowning:

J

Perguntinha besta, mas que vale a pena falar…

1 - Você adicionou as libs dentro do diretório WEB-INF/lib né? Pois em aplicações desktop (como sua classe TesteDeConfiguracao) as libs devem estar dentro do classpath, agora em uma aplicação WEB, elas devem ficar dentro do WEB-INF/lib.

W
:mrgreen: Valeu ManchesteR, não existe pergunta besta, era realmente isso que estava faltando. Mas é isso aí, mais uma que aprendi, afinal, tem muitos conceitos que ainda estou aprendendo, eu estava pensando em refazer toda a aplicação e colocar todas as libs no WEB-INF\lib, no final funcionaria, mas eu não iria sabe essa diferença com relação à desktop que vc mencionou. Executei novamente a pág. e não gravou no banco de dados, então descobri que estava faltando os seguintes trechos no código:
Transaction tr = session.beginTransaction();
tr.commit();
segue o código completo
package br.com.wincomp.loja;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.hibernate.Session;
import org.hibernate.Transaction;

public class ServletIncluirProdutoApostilaCaelum extends HttpServlet{
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		
		Double codigo = Double.parseDouble(request.getParameter("codigo"));
		String descricao = request.getParameter("descricao");
		String preco = request.getParameter("preco");
		String status = request.getParameter("status");
		
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out = response.getWriter();
		
		out.print("<html>");
		out.print("<body>");
		
		try{
			Session session = new HibernateFactory().getSession();
			Transaction tr = session.beginTransaction();
			Produtos p = new Produtos();
			p.setCodigo(codigo);
			p.setDescricao(descricao);
			p.setPreco(preco);
			p.setStatus(status);
			session.save(p);
			tr.commit();
			out.println("Código do produto: " + p.getCodigo());
			out.println("<h2>Operação efetuada com sucesso!!!</h2>");
			session.close();
		}catch(Exception e){
			out.println("<h2>"+e.getMessage()+"</h2>");	
		}
		out.println("<h4 align=center><li><a href=ApostilaCaelum\\incluirproduto.jsp>Voltar</a></li></h4>");
		out.println("<body>");
		out.println("<html>");
		out.close();
	}	
}
[size=18][color=red]Gravou no banco de dados, mas no console, continua dando a seguinte mensagem:[/color][/size]
INFO SessionFactoryObjectFactory:82 - Not binding factory to JNDI, no JNDI name configured

[size=18][color=red]O que significa isso? Pode causar algum problema na aplicação?

De qualquer maneira, obrigado pela ajuda ManchesteR e a todos.[/color][/size]

Criado 25 de julho de 2008
Ultima resposta 26 de jul. de 2008
Respostas 5
Participantes 3