O executavel .jar de uma aplicação não funciona com Hibernate

7 respostas
D

Boa noite a todos. Primeiramente apesar do assunto ser Hibernate, entendo que essa minha duvida é de java básico, portanto, acredito que a sessao ideal é aqui mesmo.

Bom galera, já vasculhei todo o forum mas não encontrei uma solucão para o meu problema. Tenho um projeto java desktop bem simples que fará uma inserção a um banco com JPA/Hibernate, porém, usando o eclipse ele funciona certinho, gera tabela, insere no banco e tal agora quando gera o arquivo .jar ele não funciona. Ciclo no icone gerado, no caso, olaMundo.jar ele nao carrega ... vasculhando na net vi que podia ser executado pelo cmd para verificar qual seria o erro, e o erro é aquele velho Exception in thread "main" java.lang.NOClassDefFoundError: javax/persistence/Persistence

Ai voces vão dizer que o problema é que não está encontrando ou faltando algum jar do hibernate, certo, mas fiz essa mesma aplicação num servlet e rodei no tomcat e funcionou que é uma beleza e outra, ele roda no eclipse pela classe main também, por que não está rodando nesse jar sendo que tem a pasta lib apontando para a classpath ?

Obs.: Já fiz um teste em um jar sem o hibernate, apenas com um um joptionPane ola mundo e funciona também.

[img]http://img850.imageshack.us/img850/2940/73843258.jpg[/img]

[img]http://img687.imageshack.us/img687/8525/65748537.jpg[/img]

package modelo;

import java.math.BigDecimal;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.swing.JOptionPane;



public class MainTeste {


	public static void main (String args[]) throws ClassNotFoundException{


		Produto p = new Produto();
		p.setCategoria("Frutas");
		p.setNome("Manga");
		p.setPreco(new BigDecimal(3.45));
		p.setQuantidade(500);

		EntityManagerFactory emf = Persistence.createEntityManagerFactory("Hibernatea");
		EntityManager em = emf.createEntityManager();
		em.getTransaction().begin();
		em.persist(p);
		em.getTransaction().commit();
		em.close();
		emf.close();
		JOptionPane.showMessageDialog(null,"Ola mundo");

	}

}
package modelo;

import java.io.Serializable;
import java.math.BigDecimal;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="Produto")
public class Produto implements Serializable {

	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(unique=true, nullable=false)
	private int codigo;

	@Column(length=45)
	private String categoria;

	@Column(length=45)
	private String nome;

	@Column(precision=10, scale=2)
	private BigDecimal preco;

	private int quantidade;


	public int getCodigo() {
		return codigo;
	}
	public void setCodigo(int codigo) {
		this.codigo = codigo;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getCategoria() {
		return categoria;
	}
	public void setCategoria(String categoria) {
		this.categoria = categoria;
	}
	public BigDecimal getPreco() {
		return preco;
	}
	public void setPreco(BigDecimal preco) {
		this.preco = preco;
	}
	public int getQuantidade() {
		return quantidade;
	}
	public void setQuantidade(int quantidade) {
		this.quantidade = quantidade;
	}

}
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
	xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
	<persistence-unit name="Hibernatea">
		<class>modelo.Produto</class>
		<properties>
			<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
			<property name="hibernate.hbm2ddl.auto" value="update" />
			<property name="hibernate.hbm2ddl.auto" value="create"/>
			<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
			<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/estoque" />
			<property name="hibernate.connection.username" value="root" />
			<property name="hibernate.connection.password" value="1234" />
		</properties>
	</persistence-unit>
</persistence>

7 Respostas

D

Pô gente, serio que ninguém poderia me ajudar ? Putz to desesperado !

R

Como voce gera o .jar ?

viniciusjssouza

Provavelmente as libs não estão no seu classpath. O fato de você colocar as libs na pasta “lib” não garante que as classes dos jars sejam carregadas. Uma das formas de fazer isso é adicionar uma pasta “META-INF” na raiz do jar contendo o arquivo MANIFEST.MF. Neste arquivo você define as libs no classpath. Abaixo segue um exemplo de um arquivo MANIFEST.MF. Observe a seção “Class-Path”.

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.7.1
Created-By: 1.6.0_01-b06 (Sun Microsystems Inc.)
Main-Class: jretaguarda.JRetaguardaApp
Class-Path: lib/appframework-1.0.3.jar lib/swing-worker-1.1.jar lib/my
 sql-connector-java-5.1.6-bin.jar lib/antlr-2.7.6.jar lib/asm.jar lib/
 asm-attrs.jar lib/cglib-2.1.3.jar lib/commons-collections-2.1.1.jar l
 ib/commons-logging-1.1.jar lib/dom4j-1.6.1.jar lib/ehcache-1.2.3.jar 
 lib/jdbc2_0-stdext.jar lib/jta.jar lib/hibernate3.jar lib/hibernate-t
 ools.jar lib/hibernate-annotations.jar lib/hibernate-commons-annotati
 ons.jar lib/hibernate-entitymanager.jar lib/javassist.jar lib/ejb3-pe
 rsistence.jar lib/commons-beanutils-1.7.jar lib/commons-collections-2
 .1.jar lib/commons-digester-1.7.jar lib/commons-logging-1.0.2.jar lib
 /itext-1.3.1.jar lib/jasperreports-2.0.5-javaflow.jar lib/jasperrepor
 ts-2.0.5.jar lib/jcommon-1.0.13.jar lib/jfreechart-1.0.0.jar lib/jna.
 jar
X-COMMENT: Main-Class will be added automatically by build
SplashScreen-Image: splash.jpg
D

Pelo eclipse … export e JAR.

R

Descompacte o seu .war , e navegue pelas pastas verificando se ele inseriu os .class e demais arquivos necessários.

Ataxexe

Arrume o classpath do seu jar. Você pode fazer como o viniciusjssouza mostrou ou incluir os jars na chamada “java -jar” usando o parâmetro “-cp”.

D

Então, até tentei seguir essa maneira do Vinicius, mas não consegui. Gerei o .jar pelo eclipse , descompactei, alterei o arquivo MANIFEST mas ao compactar novamente para jar e executar dá erro no arquivo.

Tentei também outra maneira, gerei o .jar pelo eclipse e peguei um MANIFEST externo feito por mim com o caminho das bibliotecas, também sem sucesso. Parece que ele não acha as bibliotecas …

Enfim, como estava com pressa, acabei usando o plugin do eclipse Fat jar para gerar o .jar. Ele acaba bagunçando tudo o pacote com as classes, mas pelo menos ficou executável. Agora não sei se a performance piora.

Mas valeu todos ai pela ajuda !

Criado 17 de fevereiro de 2013
Ultima resposta 25 de fev. de 2013
Respostas 7
Participantes 4