Java e PostgreSQL - No eclipse vai, mas no shell não vai

6 respostas
R

Olá pessoal,

Nem vou falar que sou novato em Java pois essa deve ser uma das dúvidas mais básicas.

Bem, quero fazer um programa que insere e lê dados em um tabela no postgresql. Bem eu até consigui ler, mas ele so funciona se eu rodar pelo Eclipse.

Se rodar pelo shell, aparece a seguinte mensagem:

Meu código:

import java.sql.*;
import java.util.*;
public class teste {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		boolean controle = true;
		int op = 0;
		Scanner scan = new Scanner (System.in);
		while(controle){
			System.out.println("Teste conexão Java e PostgreSQL\n-------------------------------");
			System.out.println("Escolha uma opção:");
			System.out.println("1 - Visualizar dados");
			System.out.println("2 - Inserir dados");
			System.out.println("9 - Sair");
			System.out.print("Opção: "); 
			op = scan.nextInt(); scan.nextLine();
			if(op==1){
				leTabela();
			}else if(op==2){
				System.out.println("Tô fazendo...");
			}else if((op>2)&&(op!=9)){
				System.out.println("Opção inválida!!");
			}else if(op==9){
				controle=false;
				System.out.println("Tchau...");
			}
		}
	}
	
	public static void leTabela(){
		Connection con = null;
		//Class.forName("org.postgresql.Driver");
		Scanner scan = new Scanner (System.in);
		try{
			con = DriverManager.getConnection("jdbc:postgresql://localhost:5432/dbtese","postgres","abdsys");
			Statement stm =  con.createStatement();
			String sql = "SELECT cod_pv, marca, nserie, instalada_em " +
			             "FROM tbmaquinas";
			ResultSet rs = stm.executeQuery(sql);
			System.out.println("Cod Pv, Marca, Nro de Serie, Instalada em");
			while(rs.next()){
				System.out.println(rs.getString("cod_pv") + ", " + rs.getString("marca") + ", " + 
						", " + rs.getString("nserie") + ", " + rs.getString("instalada_em") );
			}
			scan.nextLine();
		} 
		catch (SQLException e){
			e.printStackTrace();
		}
		finally{
			try{
				con.close();
			}
			catch(SQLException onConClose){
				System.out.println("Erro no fechamento da conexão");
				onConClose.printStackTrace();
			}
		}
	}
}

Bem se ajudar eu to usando Ubuntu 9.

Obrigado pela ajuda!!

rock.it

6 Respostas

MarcioTavares

Mostra o comando que você está rodando no Terminal. Você indicou o caminho do driver do banco no comando?

Dieval_Guizelini

Provavelmente deve ser um problema de classpath como indicado pelo Marcio,

você pode configurar no arquivo MANIFEST para fazer isso:

Exemplo:

Manifest-Version: 1.0 Ant-Version: Apache Ant 1.7.1 Created-By: 14.3-b01 (Sun Microsystems Inc.) Main-Class: genbank2db.Main Class-Path: lib/toplink-essentials.jar lib/toplink-essentials-agent.ja r lib/mysql-connector-java-5.1.10-bin.jar

Se você utilizar o netbeans, quando se inclui um jar no projeto ele faz a referência automática na construção do projeto e cria o jar da sua aplicação e copia os jars de dependência para a pasta lib dentro da pasta dist.

Para iniciantes, eu acho mais fácil que ficar configurando os pluggins do eclipse.

att

R

Márcio e Dieval, primeiro obrigado pela atenção!!

Tô usando o seguinte comando:

java teste

Acho que a resposta é sim, mas usando o arquivo MANIFEST para salvar a configuração eu teria que ter esse arquivo em todas as maquinas que executem o programa?

Utilizando o netbeans eu eliminaria a necessidade de configurar o manisfest e, também de copiar o jar do postgresql para as outras máquinas executando a aplicação??

Valeu pela paciência!!

rock.it

Dieval_Guizelini

Ou Rock.it,

o arquivo MANIFEST fica dentro do arquivo JAR da sua aplicação. Se quiser conferir, renomeia o arquivo teste.jar para teste.zip e abra com qualquer descompactador.
A configuração do classpath no MANIFEST evita ter que criar um arquivo bat ou (.sh shell script) com os parametros de classpath e referenciando as dependências.

A recomendação do uso do NETBEANS é que essas configurações são realizadas automaticamente… no Eclipse, você tem que configurar o projeto e o build…

Com relação aos drivers do postgresql ou de qualquer banco, normalmente deve-se copiar junto com a aplicação, você pode incluí-los no jar (existe uma configuração do ant para isso, mas não me lembro direito…).
De qualquer forma, existe boas razões para o jar do driver ficar na pasta lib da aplicação e não dentro do jar, entre elas, destaco:

  1. tamanho do jar da sua aplicação
  2. atualização dos drivers sem a necessidade de rebuild da aplicação

Por outro lado, como você está executando:

java teste

Devemos considerar que não está utilizando um jar, apenas o bytecode compilado (extensão .class). Quando o seu projeto crescer, certamente terá mais de uma classe e ai fica bastante chato copiar os arquivo .class para rodar a sua aplicação. Neste ponto você certamente irá utilizar o jar que encapsula todos os class dentro de um formato jar (zip). E para executá-lo (quando o MANIFEST estiver adequado), você irá utilizar:

java -jar teste

Tutoriais para jar no eclipse:
http://www.fsl.cs.sunysb.edu/~dquigley/cse219/index.php?it=eclipse&tt=jar&pf=y

Nesse você pode ver o item 6.1
http://www.vogella.de/articles/Eclipse/article.html

fw

MarcioTavares

Sei lá, mas acho que todo o procedimento de criação de um JAR, apenas para realizar um pequeno teste, pra uma pessoa que está começando com Java, creio que acaba tirando um pouco o foco do que essa pessoa realmente quer, que é só ver seu pequeno teste funcionando corretamente.

Claro que é uma opção pra projetos maiores, mas é muita informação ao mesmo tempo e isso com certeza acaba confundindo e no final das contas acaba causando uma certa frustração ao ver que para fazer algo tão simples é preciso tanta configuração, tanto conhecimento secundário/externo etc.

Acho que isso pode ser resolvido de forma bem mais simples e rápida, com o comando no terminal do Linux, apenas acrescentando o parâmetro com o caminho do Jar do driver do banco, que creio que seja sua única dependência externa no momento.

java -classpath .:/usr/share/java/postgresql-jdbc3.jar Teste

R

Pessoal,

Muito obrigado mesmo!!
As duas respostas foram ótimas e resolveram meu problema!!

Abraços!!
keep rocking

Criado 20 de dezembro de 2009
Ultima resposta 24 de dez. de 2009
Respostas 6
Participantes 3