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

ramilani12

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;
	}
ramilani12

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???

Roger75

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…

Roger75

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???

Luiz_Aguiar

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???

Luiz_Aguiar

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…

Luiz_Aguiar

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…

Luiz_Aguiar

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???

Luiz_Aguiar

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???

Luiz_Aguiar

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???

Luiz_Aguiar

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