Problema ao exportar o .JAR

Olá. Esse é o primeiro tópico aqui no Fórum. Me cadastrei ontem, e tenho uma dúvida.

Estou com problemas para exportar meu código JAVA para arquivo. JAR executável. Tenho arquivos de propriedades, que ao exportar para o .JAR ele simplesmente não consegue ler os arquivos. Vejam como faço para ler os arquivos .properties que ficam no caminho D:\Programação\Workspace-TestesTCC\TestesTCC\config\config.properties.

package testestcc.executavel;  
  
import java.io.File;  
import java.io.FileInputStream;  
import java.io.IOException;  
import java.util.Properties;  
import javax.swing.UIManager;  
  
import testestcc.views.Start;  
  
public class Executavel {  
  
   private static Properties prop;  
  
   private static FileInputStream entradaProp;  
  
   public static void main(String[] args) throws IOException {  
      // TODO Auto-generated method stub  
  
      // PROPRIEDADES  
      prop = new Properties();  
      entradaProp = new FileInputStream(new File(  
            System.getProperty("user.dir") + "/config/config.properties"));  
      prop.load(entradaProp);  
  
      // LOOK AND FEEL  
      try {  
         UIManager.setLookAndFeel(prop.getProperty("lookandfeel"));  
      } catch (Exception e) {  
         e.printStackTrace();  
      }  
  
      // EXECUTA START  
      new Start();  
   }  
}

Quero fazer traduções para meu sistema. Em cada arquivo, ficam todos os textos, labels, titles de cada idioma. Os arquivos ficam no caminho:
D:\Programação\Workspace-TestesTCC\TestesTCC\config\lang\pt-BR (nome do arquivo conforme o idioma selecionado.lang.

O código do Start() é o seguinte:

package testestcc.views;  
  
import java.awt.Color;  
import java.awt.Component;  
import java.awt.Font;  
import java.awt.event.ActionEvent;  
import java.awt.event.ActionListener;  
import java.awt.event.MouseEvent;  
import java.awt.event.MouseListener;  
import java.io.File;  
import java.io.FileInputStream;  
import java.io.IOException;  
import java.util.Properties;  
import javax.swing.BorderFactory;  
import javax.swing.JButton;  
import javax.swing.JFrame;  
import javax.swing.JLabel;  
import javax.swing.SwingConstants;  
import javax.swing.SwingUtilities;  
  
import testestcc.daos.UsuarioDAO;  
  
public class Start extends JFrame {  
  
   private static final long serialVersionUID = 1L;  
  
   private static Properties prop;  
   private static Properties lang;  
  
   private static FileInputStream entradaProp;  
   private static FileInputStream entradaLang;  
  
   private static JLabel lblLogoStart;  
   private static JLabel lblPreferenciasStart;  
  
   private static Font fntPreferenciasStart;  
  
   private static JButton btnAbrirStart;  
   private static JButton btnInstalarStart;  
   private static JButton btnDesinstalarStart;  
   private static JButton btnFecharStart;  
  
   public Start() throws IOException {  
  
      // PROPRIEDADES  
      prop = new Properties();  
      entradaProp = new FileInputStream(new File(  
            System.getProperty("user.dir") + "/config/config.properties"));  
      prop.load(entradaProp);  
  
      lang = new Properties();  
      entradaLang = new FileInputStream(new File(  
            System.getProperty("user.dir") + "/config/lang/"  
                  + prop.getProperty("lang") + ".lang"));  
      lang.load(entradaLang);  
  
      // FRAME  
      setTitle(lang.getProperty("titSistema"));  
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

O problema é que quando gero o .JAR ele não consegue ler os arquivos .properties e .lang. Alguém pode me ajudar?

Obrigado.

Quando executo pelo Eclipse, tudo certo, sem erro nenhum. Mas quando crio o .jar, ele não executa. Então, vou no cmd faço o java -jar Teste.jar, e então apresenta o erro (IMAGEM):

Alguém pode me ajudar?


Se o arquivo de configuração for fixo e ficar dentro do jar, então pode ser lido com getClass().getResourceAsStream() em vez de FileInputStream :slight_smile:

(Pode ficar fora do jar, se você o puser no classpath )

A propósito, não sei por que é que você meteu um monte de variáveis estáticas no seu código.
Normalmente presença de variáveis estáticas em código simples indicam problemas de conceito :slight_smile:

É pq o arquivo não existe em C:\Users\Brian\Desktop\config\config.properties.
É só vc copiar a pasta "config"que está dentro do seu projeto no Eclipse no Desktop junto com seu JAR.

Se o arquivo for fixo faz o que o entanglement falou. Se for “alterável” não coloque o

System.getProperty("user.dir")

coloque só:

new File("config/config.properties")

Assim ele busca na pasta onde esta o JAR os arquivos de configuração. (nesse caso a pasta config e dentro dela os arquivos)

Sim, mas na verdade o que eu queria gerar o .Jar sem precisar alterar nada nele, copiando pastas e tals.

meu código um pouco, mas ainda não ta funcionando, da uma olhada:

Classe Executavel:

package testestcc.executavel;

import java.io.IOException;

import testestcc.views.Start;

public class Executavel {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		new Start();
	}
}

Classe Start:

package testestcc.views;

import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

import testestcc.daos.UsuarioDAO;

public class Start extends JFrame {

	private static final long serialVersionUID = 1L;

	private Properties prop;
	private Properties lang;

	private InputStream entradaProp;
	private InputStream entradaLang;

	private JLabel lblLogoStart;
	private JLabel lblPreferenciasStart;

	private Font fntPreferenciasStart;

	private JButton btnAbrirStart;
	private JButton btnInstalarStart;
	private JButton btnDesinstalarStart;
	private JButton btnFecharStart;

	public Start() throws IOException {
		// PROPRIEDADES
		prop = new Properties();
		entradaProp = getClass().getResourceAsStream(
				"/config/config.properties");
		prop.load(entradaProp);

		lang = new Properties();
		entradaLang = getClass().getResourceAsStream(
				"/config/lang/" + prop.getProperty("lang") + ".lang");
		lang.load(entradaLang);

		// LOOK AND FEEL
		try {
			UIManager.setLookAndFeel(prop.getProperty("lookandfeel"));
		} catch (Exception e) {
			e.printStackTrace();
		}

		// FRAME
		setLayout(null);
		setTitle(lang.getProperty("titSistema"));
		setSize(450, 240);
		setLocationRelativeTo(null);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setResizable(false);

		// INSTANCIANDO COMPONENTES
		lblLogoStart = new JLabel("Logo");
		lblPreferenciasStart = new JLabel("<html><u>"
				+ lang.getProperty("lblPreferenciasStart") + "</u></html>",
				SwingConstants.RIGHT);
		fntPreferenciasStart = new Font("Arial", Font.BOLD, 12);
		btnAbrirStart = new JButton(lang.getProperty("btnAbrirStart"));
		btnInstalarStart = new JButton(lang.getProperty("btnInstalarStart"));
		btnDesinstalarStart = new JButton(
				lang.getProperty("btnDesinstalarStart"));
		btnFecharStart = new JButton(lang.getProperty("btnFecharStart"));

		// POSIÇÃO COMPONENTES
		lblLogoStart.setBounds(30, 30, 260, 151);
		lblPreferenciasStart.setBounds(300, 188, 140, 20);
		btnAbrirStart.setBounds(300, 30, 100, 25);
		btnInstalarStart.setBounds(300, 71, 100, 25);
		btnDesinstalarStart.setBounds(300, 112, 100, 25);
		btnFecharStart.setBounds(300, 153, 100, 25);

		lblLogoStart.setBorder(BorderFactory.createEtchedBorder());
		lblPreferenciasStart.setFont(fntPreferenciasStart);

		// ADICIONANDO COMPONENTES NO FRAME
		add(lblLogoStart);
		add(lblPreferenciasStart);
		add(btnAbrirStart);
		add(btnInstalarStart);
		add(btnDesinstalarStart);
		add(btnFecharStart);

		// VERIFICA INSTALAÇÃO
		if (prop.getProperty("instalado").equalsIgnoreCase("sim")) {
			btnAbrirStart.setEnabled(true);
			btnInstalarStart.setEnabled(false);
			btnDesinstalarStart.setEnabled(true);
		} else {
			btnAbrirStart.setEnabled(false);
			btnInstalarStart.setEnabled(true);
			btnDesinstalarStart.setEnabled(false);
		}

		// LABEL PREFERÊNCIAS
		lblPreferenciasStart.addMouseListener(new MouseListener() {

			@Override
			public void mouseReleased(MouseEvent arg0) {
				// TODO Auto-generated method stub

			}

			@Override
			public void mousePressed(MouseEvent arg0) {
				// TODO Auto-generated method stub

			}

			@Override
			public void mouseExited(MouseEvent arg0) {
				// TODO Auto-generated method stub
				lblPreferenciasStart.setForeground(Color.BLACK);
			}

			@Override
			public void mouseEntered(MouseEvent arg0) {
				// TODO Auto-generated method stub
				lblPreferenciasStart.setForeground(Color.BLUE);
			}

			@Override
			public void mouseClicked(MouseEvent arg0) {
				// TODO Auto-generated method stub
				try {
					new Preferencias();
					Component[] componentes = getComponents();
					for (Component c : componentes) {
						SwingUtilities.updateComponentTreeUI(c);
					}
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		});

		// BUTTON ABRIR
		btnAbrirStart.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				dispose();
				try {
					new Login();
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
		});

		// BUTTON INSTALAR
		btnInstalarStart.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent arg0) {
				// TODO Auto-generated method stub
				UsuarioDAO.criaTabela();
			}
		});

		// BUTTON DESINSTALAR
		btnDesinstalarStart.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				dispose();
				try {
					new Desinstalar();
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
		});

		// BUTTON FECHAR
		btnFecharStart.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent arg0) {
				// TODO Auto-generated method stub
				System.exit(0);
			}
		});

		// SETVISIBLE FRAME
		setVisible(true);
	}
}

AGORA ESTÁ FUNCIONANDO NO ECLIPSE E QUANDO EU GERO O .JAR TAMBÉM FUNCIONA. COLOQUEI OS ARQUIVOS .PROPERTIES NO SRC E FUNCIONA. PORÉM, COMO FAÇO PARA FUNCIONAR ISSO EM UM MÉTODO AO INVES DE UMA CLASSE?

VEJA O CÓDIGO DA CLASSE CONEXÃO:

[code]
package testestcc.conexao;

import java.io.File;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;

import javax.swing.JOptionPane;

public class Conexao {

private static Connection conn = null;
private static Properties prop;
private static Properties lang;
private static FileInputStream entradaProp;
private static FileInputStream entradaLang;

public static Connection getConexao() {
	try {
		Class.forName("com.mysql.jdbc.Driver");
		prop = new Properties();
		entradaProp = new FileInputStream(new File(
				System.getProperty("user.dir")
						+ "/config/config.properties"));
		prop.load(entradaProp);

		lang = new Properties();
		entradaLang = new FileInputStream(new File(
				System.getProperty("user.dir") + "/config/lang/"
						+ prop.getProperty("lang") + ".lang"));
		lang.load(entradaLang);

		conn = DriverManager.getConnection(
				"jdbc:mysql://" + prop.getProperty("ip") + ":"
						+ prop.getProperty("porta") + "/"
						+ prop.getProperty("database"),
				prop.getProperty("usuario"), prop.getProperty("senha"));
		return conn;
	} catch (Exception e) {
		// TODO: handle exception
		JOptionPane.showMessageDialog(
				null,
				lang.getProperty("erroConexaoDatabase") + ":\n"
						+ e.getMessage(), lang.getProperty("erro"),
				JOptionPane.ERROR_MESSAGE);
	}
	return null;
}

public static void closeConexao() {
	try {
		if (conn != null) {
			conn.close();
			conn = null;
		}
	} catch (Exception e) {
		JOptionPane.showMessageDialog(
				null,
				lang.getProperty("erroFecharConexaoDatabase") + ":\n"
						+ e.getMessage(), lang.getProperty("erro"),
				JOptionPane.ERROR_MESSAGE);
	}
}

}