Como faço para ler um arquivo .properties em um .jar

26 respostas
A

Boa Tarde pessoal,

Estou com a seguinte dificuldade, eu possuo um arquivo de configuração do meu sistema com a extensão .properties. Enqto eu estava rodando o sistema pelos IDES ele funcionava normalmente, foi qdo resolvi gerar um arquivo .jar, gerei na boa, mas qdo eu tento rodar o meu sistema por esse arquivo, o sistema não roda, pois ele não acha o meu arquivo de consfiguração.properties. Já revirei a internet e não achei uma forma ainda, então resolvi escrever nesse Fórum para ver se vcs me ajudam. A parada é o seguinte, como que eu faço para ler um arquivo .properties de dentro do meu .jar???

26 Respostas

R

Faça o seguinte utilize a classe URL :

URL urlFile = SuaClasse.class.getResource("arquivo.properties");
System.out.println("Path "+urlFile.getFile());

O método urlFile.getFile() lhe retorna o caminho absoluto do arquivo;

A
Ok, mas a parada é o seguinte, qdo o meu sistema esta carregando, ele pega o meu arqivo.properties e joga em uma váriavel do tipo File, para que depois eu possa utiliza-la, mas nem colocando na mão não esta funcionando, o meu código esta assim:
public Properties getProperties(){
		
		if (properties != null)
			return properties;

		URL url = this.getClass().getClassLoader().getResource("/home/leandroromancini/workspace/VisitPortaria/dist/VisitPortaria.jar!/GIPConfiguration.properties");
		
		File fileConfig = new File(url.getFile().replaceAll("%20"," ").substring(0,url.getFile().replaceAll("%20"," ").length()));
		
        //Qdo rodo pelo arquivo jar ele entra nesse if
		if(!fileConfig.exists())
			throw new RuntimeException("Arquivo de configura��es n�o encontrado."); 
		
		properties=new Properties();
		
		try {
			properties.load(new FileInputStream(fileConfig));

		} catch(	Exception ioExc) {
			String strErr="Erro lendo arquivo de configura��o. Sistema encerrado.";
			throw new RuntimeException(strErr, ioExc);
		}
				
		return properties;
}
A

Fiz algumas modificações no meu código, mas continuo com problema qdo o meu arquivo .properties esta dentro de um jar, pois não estou conseguindo setar a minha váriavel File fileConfig com o meu properties que esta dentro do meu jar. Se eu rodo sem o meu jar funciona, vcs sabem o que eu posso esta fazendo de errado?
Segue abaixo o meu código:

public Properties getProperties(){
		
		if (properties != null)
			return properties;
		
                URL url = this.getClass().getClassLoader().getResource("GIPConfiguration.properties");
		
		System.out.println("URL Properties: " + url.getFile());
                                		
		File fileConfig = new File(url.getFile().replaceAll("%20"," ").substring(0,url.getFile().replaceAll("%20"," ").length()));
                                
		System.out.println("File Config Properties: " + fileConfig);
		// Ele esta sempre entrando nesse if SOCORRO!!!!!!!!!
		if(!fileConfig.exists())
			throw new RuntimeException("Arquivo de configuracao do Properties nao encontrado.");
		
		properties=new Properties();
		
		try {
			properties.load(new FileInputStream(fileConfig));

		} catch(	Exception ioExc) {
			String strErr="Erro lendo arquivo de configuracao. Sistema encerrado.";
			throw new RuntimeException(strErr, ioExc);
		}		
		
		return properties;
	}
R

Isso aqui está correto?

url.getFile().replaceAll("%20"," ").substring(0,url.getFile().replaceAll("%20"," ").length())
A

Cara, pode ignorar essa parte, isso dai serve para tirar espaço em branco se tiver, mas já coloquei apenas setando com a url e também não funcionou, vc sabe o que pode ser???

R

Tente assim:

ResourceBundle resources  = ResourceBundle.getBundle("arquivo.properties") ;

String property1=resources.getString("property1") ;
A

Bom dia Roger,

Cara, desculpe a minha ignorância, mas não entendi como fazer dessa sua forma. Tentei fazer, mas dá o seguinte erro já na primeira linha desse seu código:

java.util.MissingResourceException: Can't find bundle for base name GIPConfiguration.properties, locale pt_BR

E outra, eu não entendi a linha,

String property1=resources.getString("property1") ;

Socorro, preciso disso URGENTE no meu trabalho…

R

Este arquivo “GIPConfiguration.properties” está dentro do seu jar, logo na raiz, ou em algum diretório dentro do jar? Se estiver num diretório você tem que especificar o caminho todo.

A linha

String property1=resources.getString("property1") ;

é só um exemplo de como pegar o valor de uma propriedade que está no arquivo.

A

O meu arquivo “GIPConfiguration.properties” esta na raiz do meu jar. Eu acrescentei a seguinte linha:

1) Locale currentLocale = new Locale("pt","BR");
2) ResourceBundle messages = ResourceBundle.getBundle("GIPConfiguration.properties", currentLocale);
3) String property1 = messages.getString("GIPConfiguration.properties");

Mas na linha 2 apresenta o seguinte erro:

java.util.MissingResourceException: Can't find bundle for base name GIPConfiguration.properties, locale pt_BR

Esta certo o jeito que eu fiz na linha 3???

L

Utilizo esse código aqui e funciona ok:

public Properties getProperties(){
        File file;
        FileInputStream fis;
        Properties prop = new Properties();
        
        try {
            //  o arquivo
            file = new File(Thread.currentThread().getClass().getResource("/Access.properties").toURI());
            fis = new FileInputStream(file);
            prop.load(fis);
            
        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        } catch (URISyntaxException ex) {
            ex.printStackTrace();
        }
        
        return prop;
        
    }
A

Luiz, tentei dessa sua forma, mas dá java java.lang.NullPointerException quando tenta criar o arquivo.

Roger,

Será que para fazer dessa sua forma eu não teria que setar nos Properties do meu projeto na aba Source onde diz Default output folder, o src do meu projeto???

L

Porque provavelmente ele não encontra o arquivo.

vc alterou apenas o nome do arquivo ali na chamada correto? deixou com a barra?

A

Luiz,

Estava dando erro na execução, pois eu achava que teria q ir sem a barra. Bom, rodando pela IDE funcionou, agora vou gerar o meu jar e ver se funciona tbm…

Mando noticias…

A

Luiz,

Tentei executar o meu jar buscando o meu arquivo properties daquela forma que vc falou e apresentou o seguinte erro:

java.lang.IllegalArgumentException: URI is not hierarchical

Vc sabe o que pode estar ocasionando esse erro???
OBS: Continuo com o problema que o meu sistema só funciona rodando pela IDE, pelo jar não tem jeito.

A

Luiz (ou para quem estiver afim de me ajudar),

Coloquei vários println no meu método getProperties e descobri o seguinte, o caminho ele até esta achando, pois ele imprimiu para mim o seguinte na minha váriavel urlDebug: file:/D:/Temp/Sistema/Sistema.jar!/GIPConfiguration.properties, mas qdo eu vou criar o meu fileDebug ele me dá o seguinte erro:

java.lang.IllegalArgumentException: URI is not hierarchical

Alguém sabe como que eu faço para resolver isso??? Pessoal, por favor me ajudem, eu preciso disso URGENTE!!!

O código do meu getProperties é o seguinte:

public Properties getProperties(){
        File file;
		File fileDebug;
        FileInputStream fis;
        Properties prop = new Properties();
        URL urlDebug = this.getClass().getResource("/GIPConfiguration.properties");
        
        try {
            // lê o arquivo
        	System.out.println(urlDebug.getFile());
        	fileDebug = new File(urlDebug.toURI());
        	System.out.println(fileDebug.toString());
            file = new File(Thread.currentThread().getClass().getResource("/GIPConfiguration.properties").toURI());
            System.out.println(file.toString());
            fis = new FileInputStream(file);
            prop.load(fis);
            
        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        } catch (URISyntaxException ex) {
            ex.printStackTrace();
        }
        return prop;
}

VAMOS LÁ GALERA, ME AJUDEM…

L

Eu estava recebendo esse mesmo erro… e com aquele código acima eu consegui resolver, mas vou ver se lembro de mais algum detalhe e já posto aqui.

A

Dae Luiz, lembrou de alguma coisa??? Desculpa ficar enchendo, mas é que eu estou com a corda no pescoço e só falta isso para eu entregar o projeto…

L

Conseguiu alguma coisa ai cara?

A

Não velho, já fiz de várias formas e continuo com o mesmo problema, roda na IDE mas qdo tento executar o meu .jar ele não acha, será que não teria que configurar algo no meu windows, sei lá… Tá batendo o desespero já, pois tenho até amanhã para entregar essa bulufa e estou apanhando para criar isso… Vc por acaso não lembrou de nada diferente???

L

cara olha um plugin pro eclipse que chama fatjar.

A

Vou dar uma olhada. Vc acha que o problema pode esta sendo na geração do meu .jar pelo NetBeans 5.5???

L

Cara já sei… o problema é que vc não pode/deve usar File quando acessa algo que esta dentro do JAR.

Use esse código:

public Properties getProperties(){
        InputStream is;
        Properties prop = new Properties();
        
        try {
            // le o arquivo
            is = Thread.currentThread().getClass().getResourceAsStream("/Access.properties");
            prop.load(is);
            
        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        
        return prop;
        
    }

Testa ai que esse vai funcionar! :slight_smile:

A

AAAAAAAAAAAAAAAAAEEEEEEEEEEEEEEEEEEEEEEEEEE… LUIZ AGUIAR, ESSE É O CARA, FUNCIONOU MESMO CARA, VALEU PELA AJUDA, DEVO O MEU TRAMPO PARA VC… VALEU VELHO PELA AJUDA E PELA ATENÇÃO… AGORA DOS 3 PROBLEMAS FALTAM APENAS DOIS HEHEHEHEHEHEHE, OS TRES ERAM:

  1. Rodar o sistema pelo arquivo .jar - RESOLVIDO PELO MESTRE LUIZ :lol: AGUILAR
  2. Vc sabe como que eu faço para não precisar copiar os libs e o meu .jar, ou seja, gostaria de colocar apenas o .jar e rodar o sistema, sem precisar copiar a pasta dos libs juntos.
  3. Vc sabe como que eu faço para salvar o meu properties dentro do meu jar, ou seja, eu teria uma tela de instalação onde eu configuraria o meu properties para depois rodar o sistema…

OBS: Vc acha que eu devo abrir um tópico para cada dúvida minha (2 e 3)…

MAS MESMO ASSIM VALEU PELA DEDICAÇÃO CARA, FUNCIONOU BLZ. VC SABE COMO QUE EU RESOLVO OS 2 PROBLEMAS RESTANTES???

L

Que isso, estamos aqui pra ajudar mesmo.

Olha só, quando eu resolvi esse primeiro problema seu, logo em seguida eu teve esses exatos outros 2 problemas tbm hehe :smiley:

O que eu fiz foi o seguinte:
1 - Com algum plugin, como o FatJar do eclipse, vc gera um .jar com as libs descompactadas dentro, eu fiz isso com um pligin com do IntelliJ IDEA, mas pro eclipse vc consegue tbm.
2 - Cara vc não pode (até consegue com muuuuuita gambiarra) gravar nada dentro do .jar que esta rodando, o que eu fiz como alternativa foi grava esse properties, no direório do usuário que esta rodando o aplicativo:

public Object[] getConfiguracoes(){
        Object[] o = new Object[2];
        
        try {
            
            File file;
            FileInputStream fis;
            Properties config = new Properties();
            
            // le o arquivo
            String home = System.getProperty("user.home") + "\\";
            file = new File(home + ".arquivos.config");
            if (!file.exists()){
                FileWriter fw = new FileWriter(file);
                fw.flush();
                fw.close();
                file = new File(home + ".arquivos.config");
            }
            fis = new FileInputStream(file);
            config.load(fis);
            
            o[0] = config;
            o[1] = file;
            
        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        
        return o;
    }

Veja que esse Object[] ai é algo específico que eu precisei utilizar aqui pro meu aplicativo, o demais vc consegue usar ai no seu caso, sem nem alterar nada, só o nome do arquivo é claro… hehe
Ai vc pode colocar o retorno do metodo como um Propertie se quiser, e altera como no outro exemplo (problema 1) pra ele converter num propertie.

:smiley:

qualquer coisa é só gritar!

A
Valeu Cara pelas dicas, todas por enqto estão dando certo, valeu mesmo pela preocupação e dedicação....

:thumbup: :thumbup:

A

Luiz olha eu denovo aqui hehehehehehe,

Cara, a parada é o seguinte, dos meus 3 problemas vc conseguiu resolver 2 hehehehehehehehe. Agora só estou com o probleminha para gerar o meu .jar com as minhas libs. Porque a parada é o seguinte, quando eu gero pelo NetBeans 5.5 ele vai blz, mas ele cria tbm uma pasta lib, a qual eu sempre tenho que por junto, foi ai q eu comentei com vc como eu faria para por tudo dentro do meu .jar e vc comentou comigo para eu utilizar o Fatjar. Ai abaixei ele para o eclipse e seguindo o tutorial fiz igual, Peguei o meu jar criado por ele e ele me apresentou o seguinte erro ao executar:

30/03/2007 11:18:48 java.until.jar.Attributes read
WARNING: Duplicate name in Manifest: SHA1-Digest
30/03/2007 11:18:48 java.until.jar.Attributes read
WARNING: Duplicate name in Manifest: Digest-Algorithms
30/03/2007 11:18:48 java.until.jar.Attributes read
WARNING: Duplicate name in Manifest: MD5-Digest
Duplicate name is Manifest: SHA1-Digest
Failed to load Main-Class manifest attribute from Sistema_fat.jar

Vc sabe o que pode estar acarretando esse erro??? :frowning:

Criado 22 de março de 2007
Ultima resposta 30 de mar. de 2007
Respostas 26
Participantes 4