ERRO: java.lang.NoClassDefFoundError: br/com/caelum/jdbc/modelo/Contato [RESOLVIDO]

Pessoal, estou com um problema… Estava estudando a apostila da caelum FJ21 de desenvolvimento web… aí qdo eu cheguei nos servlets eu comecei a apanhar um pouco, mas acho que fiz tudo certinho aqui… segui todos os passos da apostila… Até aí estava tudo funcionando certo, porém agora surgiu este erro:

HTTP Status 500 -

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: Servlet execution threw an exception

root cause

java.lang.NoClassDefFoundError: br/com/caelum/jdbc/modelo/Contato
br.com.caelum.agenda.servlet.AdicionaContatoServlet.service(AdicionaContatoServlet.java:42)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

note The full stack trace of the root cause is available in the Apache Tomcat/7.0.0 logs.


eu tinha feito um projeto jdbc tudo certinho, funcionando legal, aih depois na parte dos servlets ele manda criar um projeto fj21-agenda, eu criei no mesmo workspace que o jdbc. E pra nao refazer todas as classes de contato, eu apenas fiz os imports do projeto jdbc… nao sei onde eu errei, vou colar os códigos aqui, pra quem puder me ajudar, dar uma olhada:

CÓDIGO da classe Contato do projeto jdbc:

[code]package br.com.caelum.jdbc.modelo;

import java.util.Calendar;

public class Contato {
private Long id;
private String nome;
private String email;
private String endereco;
private Calendar dataNascimento;

//métodos get e set
public Long getId() {
	return id;
}
public void setId(Long id) {
	this.id = id;
}
public String getNome() {
	return nome;
}
public void setNome(String nome) {
	this.nome = nome;
}
public String getEmail() {
	return email;
}
public void setEmail(String email) {
	this.email = email;
}
public String getEndereco() {
	return endereco;
}
public void setEndereco(String endereco) {
	this.endereco = endereco;
}
public Calendar getDataNascimento() {
	return dataNascimento;
}
public void setDataNascimento(Calendar dataNascimento) {
	this.dataNascimento = dataNascimento;
}

}
[/code]

CÓDIGO da classe ContatoDAO do projeto JDBC:

[code]package br.com.caelum.jdbc.dao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import br.com.caelum.jdbc.ConnectionFactory;
import br.com.caelum.jdbc.modelo.Contato;

public class ContatoDAO {
// a conexão com o banco de dados
private Connection connection;

public ContatoDAO() {
	this.connection = new ConnectionFactory().getConnection();
}

public void adiciona(Contato contato) {
	String sql = "insert into contatos (nome,email,endereco,dataNascimento) values (?,?,?,?)";
	try {
		// prepared statement para inserção
		PreparedStatement stmt = connection.prepareStatement(sql);
		// seta os valores
		stmt.setString(1, contato.getNome());
		stmt.setString(2, contato.getEmail());
		stmt.setString(3, contato.getEndereco());
		stmt.setDate(4, new Date(contato.getDataNascimento()
				.getTimeInMillis()));
		// executa
		stmt.execute();
		stmt.close();
	} catch (SQLException e) {
		throw new RuntimeException(e);
	}
}

public void altera(Contato contato) {
	String sql = "update contatos set nome=?, email=?, endereco=?, dataNascimento=? where id=?";

	try {
		PreparedStatement stmt = connection.prepareStatement(sql);
		stmt.setString(1, contato.getNome());
		stmt.setString(2, contato.getEmail());
		stmt.setString(3, contato.getEndereco());
		stmt.setDate(4, new Date(contato.getDataNascimento()
				.getTimeInMillis()));
		stmt.setLong(5, contato.getId());
		stmt.execute();
		stmt.close();
	} catch (SQLException e) {
		throw new RuntimeException(e);
	}
}

public void remove(Contato contato) {
	try {
		PreparedStatement stmt = connection
				.prepareStatement("delete from contatos where id=?");
		stmt.setLong(1, contato.getId());
		stmt.execute();
		stmt.close();
	} catch (SQLException e) {
		throw new RuntimeException(e);
	}
}

public List<Contato> getLista() {
	try {
		List<Contato> contatos = new ArrayList<Contato>();
		PreparedStatement stmt = this.connection
				.prepareStatement("select * from contatos");
		ResultSet rs = stmt.executeQuery();
		while (rs.next()) {
			// criando o objeto Contato
			Contato contato = new Contato();
			contato.setNome(rs.getString("nome"));
			contato.setEmail(rs.getString("email"));
			contato.setEndereco(rs.getString("endereco"));
			// montando a data através do Calendar
			Calendar data = Calendar.getInstance();
			data.setTime(rs.getDate("dataNascimento"));
			contato.setDataNascimento(data);
			// adicionando o objeto à lista
			contatos.add(contato);
		}
		rs.close();
		stmt.close();
		return contatos;
	} catch (SQLException e) {
		throw new RuntimeException(e);
	}
}

}
[/code]

adiciona-contato.html :

[code]


Adiciona Contato



Nome:

E-mail:

Endereço:

Data Nascimento:



[/code]

web.xml :

[code]<?xml version="1.0" encoding="UTF-8"?>

fj21-agenda

index.html
index.htm
index.jsp
default.html
default.htm
default.jsp

<servlet>
	<servlet-name>AdicionaContato</servlet-name>
	<servlet-class>br.com.caelum.agenda.servlet.AdicionaContatoServlet</servlet-class>
</servlet>

<servlet-mapping>
	<servlet-name>AdicionaContato</servlet-name>
	<url-pattern>/adicionaContato</url-pattern>
</servlet-mapping>

[/code]

e finalmente o arquivo que começou a dar pau no finalzinho, o último arquivo que eu fiz que nao deu certo:
AdicionaContatoServlet.java do projeto fj21-agenda:

[code]package br.com.caelum.agenda.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

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

import br.com.caelum.jdbc.modelo.Contato; //estes 2 import são do projeto jdbc que tava dando certo antes
import br.com.caelum.jdbc.dao.ContatoDAO;

public class AdicionaContatoServlet extends HttpServlet{

private static final long serialVersionUID = 1L;  [b]//essa linha eu nao sei porque tem que estar aqui, mas 
                                                                               //se eu tirar ela, o AdicionaContatoServler fica sublinhado e qdo clico nele ele, 
                                                                               //fala pra colocar esse serialVersion o que fez diminuir um erro também...[/b]

protected void service(HttpServletRequest request,
		HttpServletResponse response) throws IOException, ServletException {
	// busca o writer
	PrintWriter out = response.getWriter();
	// buscando os parâmetros no request
	String nome = request.getParameter("nome");
	String endereco = request.getParameter("endereco");
	String email = request.getParameter("email");
	String dataEmTexto = request.getParameter("dataNascimento");
	Calendar dataNascimento = null;
	// fazendo a conversão da data
	try {
		Date date = new SimpleDateFormat("dd/MM/yyyy").parse(dataEmTexto);
		dataNascimento = Calendar.getInstance();
		dataNascimento.setTime(date);
	} catch (ParseException e) {
		out.println("Erro de conversão da data");
		return; // para a execução do método
	}
	// monta um objeto contato
	Contato contato = new Contato();
	contato.setNome(nome);
	contato.setEndereco(endereco);
	contato.setEmail(email);
	contato.setDataNascimento(dataNascimento);
	// salva o contato
	ContatoDAO dao = new ContatoDAO();
	dao.adiciona(contato);
	// imprime o nome do contato que foi adicionado
	out.println("<html>");
	out.println("<body>");
	out.println("Contato " + contato.getNome() + " adicionado com sucesso");
	out.println("</body>");
	out.println("</html>");
}

}[/code]

Opa cara…blz ?
Se liga…
esse erro abaixo sempre ocorre quando a classe em questão não é encontrada em tempo de execução.

[quote]
java.lang.NoClassDefFoundError: br/com/caelum/jdbc/modelo/Contato [/quote]

Assegure-se de que suas classes estão certinhas.
Da um clean e faz o rebuild da tua aplicação.
Verifica o diretório do teu servidor e vê se os arquivos estão lá corretamente.

Bom, fiz o clean, dei rebuild, reiniciei o server e continua dando o mesmo erro…

Será q esse erro está acontecendo por causa dos imports do jdbc? verifiquei o diretório certinho e nada… :S tentei procurar esse erro em outros tópicos e nao achei nenhum com esse erro :S

o mapeamento eu fiz certinho, os diretórios estão certos, as conexoes com o banco de dados tbm estao certas. Aparace a página do adicionar contato certinho, mas aí qdo eu aperto Gravar ele da esse erro mesmo :S

tem outra alternativa? ja tentei refazer umas 5 vezes esse projeto, tinha feito no ubuntu, deu pau com algumas permissoes, aih eu refiz … e mudou o erro que dava, depois eu mudei de pc e fiz no Fedora e parou os pau de permissão mas esse erro foi o menor erro que deu até agora… não sei mais o que fazer… :S

tenso,
mas o erro que ta aparecendo não é da tua servlet.
é a sua classe de modelo “Contato” que não está sendo encontrada …
da uma olhada na pasta do teu server /WEB-INF/classes/ pra ver se essa tua classe está lá…no caso seria br.com.caelum.jdbc.modelo.Contato.class

Pelo oq eu entendi vc tem dois projetos. e a classe Contato esta em um projeto e vc esta executando outro projeto ?

Se for isso crie um pacote br.com.caelum.jdbc.modelo no projeto que vc esta executando e copie a classe Contato para esse pacote. Talvez isso resolva se for esse o caso.

Wow, desculpa minha ignorancia, mas é que to começando a aprender isso ainda, e estou com algumas dificuldades…

vc falou pra eu olhar aqui, mas eu vi que eu nao tenho uma pasta classes no WEB-INF, aí eu tentei copiar do outro projeto o aquivo Contato.java que seria a classe Contato e colar na pasta WEB-INF mas ai o br.com.caleum. jdbc.modelo.Contato.java nao muda nada :S aí como ele tinha o pacote modelo… eu tentei colar o pacote modelo com o Contato.java no fj21-agenda/src

aí eu reinicio o servidor e faço atualizo e vem outro problema, ele diz que nao encontra o ContadoDAO… aí eu copio o contatoDAO e ele diz que nao encontra o connectionFactory… aí eu copio o conection factory e ele diz que nao tem o driver jdbc pro mysql… aí eu copio o driver pra pasta fj21-agenda e adiciono no build-path… e aih aparece esses erros:

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

java.lang.RuntimeException: java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost/fj21
br.com.caelum.jdbc.ConnectionFactory.getConnection(ConnectionFactory.java:13)
br.com.caelum.jdbc.dao.ContatoDAO.(ContatoDAO.java:20)
br.com.caelum.agenda.servlet.AdicionaContatoServlet.service(AdicionaContatoServlet.java:48)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

root cause

java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost/fj21
java.sql.DriverManager.getConnection(DriverManager.java:602)
java.sql.DriverManager.getConnection(DriverManager.java:185)
br.com.caelum.jdbc.ConnectionFactory.getConnection(ConnectionFactory.java:11)
br.com.caelum.jdbc.dao.ContatoDAO.(ContatoDAO.java:20)
br.com.caelum.agenda.servlet.AdicionaContatoServlet.service(AdicionaContatoServlet.java:48)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

note The full stack trace of the root cause is available in the Apache Tomcat/7.0.0 logs.

A lib do mysql esta na pasta lib do seu WEB-INF ?

o mysql.jar? eu coloquei fora do WEB-INF tinha deixado no fj21-agenda… mas qdo eu coloco o arquivo no WEB-INF continua dando o mesmo ultimo erro

Cara, eu vi esse erro acontecer quando eu tinha declarado o CLASSPATH no meu pc.

Tenta tirar e manda rodar. Sabe onde que fica? Variáveis de ambiente?

C ya

Fiz uns testes aqui…

Com o CLASSPATH declarado certinho eu percebi que:

1º se eu colocar o mysql-connector-java-5.1.12.jar no WEB-INF ele nao muda nada ainda da o erro…
2º se eu colocar o mysql-connector-java-5.1.12.jar no WEB-INF E ADICIONAR NO BUILD PATH o Eclipse da um Warning falando:
"Classpath entry /fj21-agenda/WebContent/WEB-INF/mysql-connector-java-5.1.12.jar will not be exported or published. Runtime ClassNotFoundExceptions may result. "

Se eu remover do build path ele nao aparece mais o warning só que continua o erro…

E sem o CLASSPATH declaradao… pra variar, nao ocorre nenhuma diferença do que está escrito acima! como o .jar adicionado aparece o mesmo warning e sem ele no build path nao aparece o warning.

Porém de qualquer jeito aparece o erro :

java.lang.RuntimeException: java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost/fj21
br.com.caelum.jdbc.ConnectionFactory.getConnection(ConnectionFactory.java:13)
br.com.caelum.jdbc.dao.ContatoDAO.(ContatoDAO.java:20)
br.com.caelum.agenda.servlet.AdicionaContatoServlet.service(AdicionaContatoServlet.java:48)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

root cause

java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost/fj21
java.sql.DriverManager.getConnection(DriverManager.java:602)
java.sql.DriverManager.getConnection(DriverManager.java:185)
br.com.caelum.jdbc.ConnectionFactory.getConnection(ConnectionFactory.java:11)
br.com.caelum.jdbc.dao.ContatoDAO.(ContatoDAO.java:20)
br.com.caelum.agenda.servlet.AdicionaContatoServlet.service(AdicionaContatoServlet.java:48)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

note The full stack trace of the root cause is available in the Apache Tomcat/7.0.0 logs.

galera, tava fazendo errado, descobri como faz pra sair o warning que tava dando qdo eu mandava adicionar no build PATH…era só ter colocar o mysql-connector-java-5.1.12.jar dentro de lib na WEB-INF mesmo…

Porém… aih fiz o que ele tinha falado, deixei sem o classpath declarado mas depois voltei pra testar se dava algo diferente declarando ou nao o CLASSPATH e apareceu o seguinte erro agora, tanto com ou sem declarar esse CLASSPATH:

Exception

java.lang.RuntimeException: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
br.com.caelum.jdbc.ConnectionFactory.getConnection(ConnectionFactory.java:13)
br.com.caelum.jdbc.dao.ContatoDAO.(ContatoDAO.java:20)
br.com.caelum.agenda.servlet.AdicionaContatoServlet.service(AdicionaContatoServlet.java:48)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

root cause

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
java.lang.reflect.Constructor.newInstance(Constructor.java:513)
com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1122)
com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2260)
com.mysql.jdbc.ConnectionImpl.(ConnectionImpl.java:787)
com.mysql.jdbc.JDBC4Connection.(JDBC4Connection.java:49)
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
java.lang.reflect.Constructor.newInstance(Constructor.java:513)
com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:357)
com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285)
java.sql.DriverManager.getConnection(DriverManager.java:582)
java.sql.DriverManager.getConnection(DriverManager.java:185)
br.com.caelum.jdbc.ConnectionFactory.getConnection(ConnectionFactory.java:11)
br.com.caelum.jdbc.dao.ContatoDAO.(ContatoDAO.java:20)
br.com.caelum.agenda.servlet.AdicionaContatoServlet.service(AdicionaContatoServlet.java:48)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

root cause

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
java.lang.reflect.Constructor.newInstance(Constructor.java:513)
com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1122)
com.mysql.jdbc.MysqlIO.(MysqlIO.java:344)
com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2184)
com.mysql.jdbc.ConnectionImpl.(ConnectionImpl.java:787)
com.mysql.jdbc.JDBC4Connection.(JDBC4Connection.java:49)
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
java.lang.reflect.Constructor.newInstance(Constructor.java:513)
com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:357)
com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285)
java.sql.DriverManager.getConnection(DriverManager.java:582)
java.sql.DriverManager.getConnection(DriverManager.java:185)
br.com.caelum.jdbc.ConnectionFactory.getConnection(ConnectionFactory.java:11)
br.com.caelum.jdbc.dao.ContatoDAO.(ContatoDAO.java:20)
br.com.caelum.agenda.servlet.AdicionaContatoServlet.service(AdicionaContatoServlet.java:48)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

root cause

java.net.ConnectException: Connection refused
java.net.PlainSocketImpl.socketConnect(Native Method)
java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
java.net.Socket.connect(Socket.java:529)
java.net.Socket.connect(Socket.java:478)
java.net.Socket.(Socket.java:375)
java.net.Socket.(Socket.java:218)
com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:257)
com.mysql.jdbc.MysqlIO.(MysqlIO.java:294)
com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2184)
com.mysql.jdbc.ConnectionImpl.(ConnectionImpl.java:787)
com.mysql.jdbc.JDBC4Connection.(JDBC4Connection.java:49)
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
java.lang.reflect.Constructor.newInstance(Constructor.java:513)
com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:357)
com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285)
java.sql.DriverManager.getConnection(DriverManager.java:582)
java.sql.DriverManager.getConnection(DriverManager.java:185)
br.com.caelum.jdbc.ConnectionFactory.getConnection(ConnectionFactory.java:11)
br.com.caelum.jdbc.dao.ContatoDAO.(ContatoDAO.java:20)
br.com.caelum.agenda.servlet.AdicionaContatoServlet.service(AdicionaContatoServlet.java:48)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

Aew galera, valeu pela ajuda de todos xD

Eu tava fazendo o memos projeto seguindo todos os passos igualzinho aí agora que eu to tentando no outro pc… que tem ubuntu deu certo… =D tava dando o mesmo erro em todos, agora nao sei o que acontece que no Fedora nao deu certo, vou tentar baixar um novo driver de jdbc e colocar no lugar daquele, talvez seja isso…

Eu até queria falar o que eu fiz de diferente, mas eu realmente nao sei o que houve, só sei que deu certo aqui… uma das coisas que eu fiz foi mudar o mysql.jar pra lib do WEB-INF mesmo… E sobre o primeiro erro cujo era o nome do tópico, eu havia arrumei colocando os pacotes br.com.caelum.jdbc dentro do /src do projeto fj21-agenda…

vou tentar solucionar o problema do Fedora e se eu conseguir eu posto aqui como eu arrumei!

Agradeço à todos!

1 curtida

Salve galera!
Também passei por esse problema hoje.
Eu criei um .jar do projeto JDBC e o adicionei juntamente com o driver do MySQL ao buildpath do projeto.
Achei legal essa forma pois a estrutura do DAO fica encapsulada no .jar ai não fica aquela avalanche de nomes de pacotes na cara do
usuário. Para ele saber como usar a nossa lib basta ele ler a documentação da mesma.
=)