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

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

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

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

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

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

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

Pessoal,

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

Abraços!!
keep rocking