Eu tenho um arquivo JAR no qual todo o meu código está arquivado para execução. Eu tenho que acessar um arquivo de propriedades que precisa ser alterado / editado antes de cada execução. Eu quero manter o arquivo de propriedades no mesmo diretório em que o arquivo JAR está. Existe alguma maneira de dizer ao Java para pegar o arquivo de propriedades desse diretório?
Nota: Não quero manter o arquivo de propriedades no diretório inicial nem passar o caminho do arquivo de propriedades no argumento da linha de comandos.
java
properties
Neil
fonte
fonte
user.home
. Ao verificar o arquivo, verifique primeiro a existência de um arquivo alterado no sistema de arquivos e, se não existir, carregue o arquivo padrão ". BTW "Eu não quero .." O que você quer é menos importante do que aquilo que funciona e é prático. Armazenando aplicativo. as configurações no diretório do aplicativo são fortemente desencorajadas pelo Oracle e pelo MS (e provavelmente por outros).Respostas:
Portanto, você deseja tratar seu
.properties
arquivo na mesma pasta que o jar principal / executável como um arquivo, e não como um recurso do jar principal / executável. Nesse caso, minha própria solução é a seguinte:Primeiro, a arquitetura do arquivo do programa deve ser assim (assumindo que o programa principal seja main.jar e seu arquivo de propriedades principal seja main.properties):
Com essa arquitetura, você pode modificar qualquer propriedade no arquivo main.properties usando qualquer editor de texto antes ou enquanto o main.jar estiver em execução (dependendo do estado atual do programa), pois é apenas um arquivo baseado em texto. Por exemplo, seu arquivo main.properties pode conter:
Portanto, quando você executa o programa principal a partir da pasta raiz / base, normalmente o executa da seguinte maneira:
ou imediatamente:
No seu main.jar, você precisa criar alguns métodos utilitários para todas as propriedades encontradas no seu arquivo main.properties; vamos dizer que a
app.version
propriedade terá ogetAppVersion()
método da seguinte maneira:Em qualquer parte do programa principal que precise do
app.version
valor, chamamos seu método da seguinte maneira:fonte
./
pasta raiz (no mesmo nível de diretório) do que descrevi na arquitetura da organização do arquivo. (conforme o requisito definido pelo pôster original)java -jar build/main.jar
, também precisa colocar o arquivo de propriedades nabuild
pasta, para que fique no mesmo nível de diretório que o jar.java -jar path/to/jar/file
. Mas eu encontrei a solução em outra pergunta:String path = ClassLoader.getSystemClassLoader().getResource(".").getPath() + "/main.properties";
Eu fiz de outra maneira.
fonte
Sempre há um problema ao acessar arquivos no diretório de arquivos a partir de um arquivo jar. Fornecer o caminho de classe em um arquivo jar é muito limitado. Em vez disso, tente usar um arquivo bat ou um arquivo sh para iniciar seu programa. Dessa forma, você pode especificar seu caminho de classe da maneira que desejar, fazendo referência a qualquer pasta em qualquer lugar do sistema.
Verifique também minha resposta sobre esta pergunta:
criando arquivo .exe para projeto java contendo sqlite
fonte
Eu tenho um caso semelhante: querer que meu
*.jar
arquivo acesse um arquivo em um diretório próximo ao*.jar
arquivo. Consulte ESTA RESPOSTA também.Minha estrutura de arquivos é:
Consigo carregar um arquivo (digamos
some.txt
) para um InputStream dentro do*.jar
arquivo com o seguinte:Então faça o que quiser com o
stream
fonte
Eu tenho um exemplo de fazer tanto por caminho de classe ou de configuração externa com log4j2.properties
fonte
Isso funciona para mim. Carregue seu arquivo de propriedades de
current directory
Certifique-se de que
java.properties
está nocurrent directory
. Você pode escrever um pequeno script de inicialização que muda para o diretório certo antes, comoNo seu projeto, basta colocar o
java.properties
arquivo na raiz do projeto, para que esse código funcione também no seu IDE.fonte
Aqui, se você mencionar
.getPath()
, isso retornará o caminho do Jar e acho que você precisará do pai para se referir a todos os outros arquivos de configuração colocados no jar. Este código funciona no Windows. Adicione o código na classe principal.fonte