Solucionado (ver solução)
Solucionado
(ver solução)
11
respostas

Programa não Funciona fora da IDE

Meu programa funciona perfeitamente dentro do eclipse. Mas quando eu exporto ele não funciona. Se eu exporto apenas JAR ele nem roda. Se eu exporto como runnableJar ele perde algumas coisas. Por exemplo, ele não carrega um arquivo CSV que alimenta parâmetros do programa. Lembrando que eu estou referenciando todos os arquivos acessórios com nomedaclasse.class.getResource("nomedo arquivo.csv").getFile()

11 respostas

O que pode ser?

este é o método que está falhando:

public static void remontacenario (Map lista) {

String arquivoCSV = ImageButton.class.getResource("MUNDO6.csv").getFile();

BufferedReader br = null; String linha = ""; String csvDivisor = ";";

try {

br = new BufferedReader(new FileReader(arquivoCSV)); while ((linha = br.readLine()) != null) {

String[] pais = linha.split(csvDivisor);

lista.get(pais[0]).ImageButtonCenarioReset(pais[1], pais[2]);

}

} catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally {

if (br != null) { try { br.close(); System.out.println("br close tentado "); } catch (IOException e) { e.printStackTrace(); } } }

}

Oi Gilson,

tente descrever melhor o que falha. É essencial que vc coloque o Stacktrace aqui para podermos ajudar melhor.

Ok?

abs

Eu tenho um Jframe que é populado com ImageButton (ImageButton extends JButton ) dinamicamente.

"lista" é uma lista de ImabeButtons e para cada linha do CSV o método ImageButtonCenarioReset define seu icone, actionlisteners, tooltiptext e outras coisas a depender dos campos desta linha.

Não há Stacktrace pois o problema ocorre apenas quando rodo o RunnableJAR que já foi exportado. O programa não está redefinindo os ícones dos botões ImageButton. No entanto quando eu faço ele rodar pela IDE ele executa o método dentro do que eu espero.

Há alguma forma de pegar o Stacktrace fora da IDE?

Joga um Try / Catch na aplicação dentro da IDE e debuga o código e tenta ver se o código tá funcionando normalmente.

O método já possui um Try/Catch. Seria em algum local específico do código?

Outra coisa que ocorre, talves tenha a ver com o problema, quando vou exportar o Eclipse dá uma mensagem do tipo "this operation repacks referenced libraries". Creio que isso tenha a ver com a licença de uso das bibliotecas, mas se for o caso entendo que deveria inviabilizar o programa todo, não apenas uma parte.

Oi Gilson,

o Stacktrace deve aparecer na linha de comando ao rodar o jar (como qq outra saida):

java -jar oseujar.jar

Muito provável que o carregamento do arquivo csv falhou. vc está exportando o csv tbm?

abs

Vamos lá. Dei uma olhada aqui e acho que o erro está na forma como eu estou tentando carregar o csv dentro do runnablejar. Quando eu rodo dentro da IDE Eclipse a forma de carregar o arquivo é adequada pois o csv não está dentro do runnablejar, logo não dá nenhum erro. É como se eu estivesse procurando um arquivo na máquina e não no JAR.

Quando eu exportei, o bloco try/catch impede que o programa pare mas não mostrava nada no catch, até pq estava rodando fora da IDE. Assim eu coloquei dentro dos catchs um JOptionPane.showMessageDialog para exibir a descrição do erro. O erro que retornou foi java.io.fileNotFoundException.

Então eu preciso saber como usar o getClass().getResource e ou o classLoader para passar o csv para o método.

solução!

Descobri. Estava buscando o arquivo de forma errada mesmo. o certo é usar "class.getResourceAsStream" e "InputStreamReader" .

Segue versão final:public static void remontacenario (Map lista) {

InputStream is = Mundo.class.getResourceAsStream("MUNDO6.csv"); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); String linha = ""; String csvDivisor = ";";

try { while ((linha = br.readLine()) != null) {

String[] pais = linha.split(csvDivisor);

lista.get(pais[0]).ImageButtonCenarioReset(pais[1], pais[2]); }

} catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (br != null) { try { br.close(); } catch (IOException e) { e.printStackTrace(); } } }

}

'''public static void remontacenario (Map lista) {

InputStream is = Mundo.class.getResourceAsStream("MUNDO6.csv"); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); String linha = ""; String csvDivisor = ";";

try { while ((linha = br.readLine()) != null) {

String[] pais = linha.split(csvDivisor);

lista.get(pais[0]).ImageButtonCenarioReset(pais[1], pais[2]); }

} catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (br != null) { try { br.close(); } catch (IOException e) { e.printStackTrace(); } } }

} '''

Desculpem ficar postando diversas vezes a mesma coisa. É que eu não estou acostumado com este forum. Não tem um botão de editar post e quando eu colo meu código ele fica todo desformatado...

Se algum moderador quiser apagar fique à vontade.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software