É a sua escolha. Existem basicamente três maneiras em um archive de aplicativo da web Java (WAR):
1. Coloque no caminho de classe
Para que você possa carregá-lo ClassLoader#getResourceAsStream()
com um caminho relativo ao caminho de classe:
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("foo.properties");
// ...
Properties properties = new Properties();
properties.load(input);
Aqui foo.properties
deve-se colocar uma das raízes que são cobertas pelo caminho de classe padrão de um aplicativo da web, por exemplo , aplicativos da web /WEB-INF/lib
e /WEB-INF/classes
servidores /lib
, ou JDK / JRE /lib
. Se o arquivo de propriedades for específico do aplicativo da web, o melhor é colocá-lo /WEB-INF/classes
. Se você estiver desenvolvendo um projeto WAR padrão em um IDE, solte-o na src
pasta (a pasta de origem do projeto). Se você estiver usando um projeto Maven, solte-o na /main/resources
pasta
Como alternativa, você também pode colocá-lo em algum lugar fora do caminho de classe padrão e adicionar seu caminho ao caminho de classe do appserver. Por exemplo, no Tomcat, você pode configurá-lo como shared.loader
propriedade deTomcat/conf/catalina.properties
.
Se você o colocou foo.properties
em uma estrutura de pacote Java como com.example
, precisará carregá-lo como abaixo
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("com/example/foo.properties");
// ...
Observe que esse caminho de um carregador de classes de contexto não deve começar com a /
. Somente quando você estiver usando um carregador de classes "relativo", como SomeClass.class.getClassLoader()
, então você realmente precisará iniciá-lo com um /
.
ClassLoader classLoader = getClass().getClassLoader();
InputStream input = classLoader.getResourceAsStream("/com/example/foo.properties");
// ...
No entanto, a visibilidade do arquivo de propriedades depende então do carregador de classes em questão. É visível apenas para o mesmo carregador de classes que carregou a classe. Portanto, se a classe for carregada, por exemplo, por um carregador de classes comum do servidor, em vez do carregador de classes webapp, e o arquivo de propriedades estiver dentro do próprio webapp, ficará invisível. O carregador de classes de contexto é a sua aposta mais segura para que você possa colocar o arquivo de propriedades "em qualquer lugar" no caminho de classe e / ou pretende substituir um fornecido pelo servidor a partir do aplicativo da web.
2. Coloque-o no conteúdo da web
Para que você possa carregá-lo ServletContext#getResourceAsStream()
com um caminho relativo ao conteúdo da web:
InputStream input = getServletContext().getResourceAsStream("/WEB-INF/foo.properties");
// ...
Observe que eu demonstrei colocar o arquivo na /WEB-INF
pasta, caso contrário, ele seria acessível ao público por qualquer navegador da web. Observe também que o ServletContext
está em qualquer HttpServlet
classe apenas acessível pelo herdado GenericServlet#getServletContext()
e Filter
pelo por FilterConfig#getServletContext()
. Caso você não esteja em uma classe de servlet, geralmente é apenas via injetável @Inject
.
3. Coloque-o no sistema de arquivos do disco local
Para que você possa carregá-lo da java.io
maneira usual com um caminho absoluto do sistema de arquivos em disco local:
InputStream input = new FileInputStream("/absolute/path/to/foo.properties");
// ...
Observe a importância de usar um caminho absoluto. Os caminhos relativos do sistema de arquivos em disco local são um impedimento absoluto em um aplicativo da web Java EE. Veja também o primeiro link "Consulte também" abaixo.
Qual escolher?
Basta considerar as vantagens / desvantagens em sua própria opinião sobre manutenção.
Se os arquivos de propriedades forem "estáticos" e nunca precisarem ser alterados durante o tempo de execução, você poderá mantê-los no WAR.
Se você preferir editar arquivos de propriedades fora do aplicativo da Web sem a necessidade de reconstruir e reimplementar o WAR todas as vezes, coloque-o no caminho de classe fora do projeto (se necessário, inclua o diretório no caminho de classe).
Se você preferir editar arquivos de propriedades programaticamente de dentro do aplicativo da Web usando o Properties#store()
método, coloque-o fora do aplicativo da Web. Conforme o Properties#store()
requerido Writer
, você não pode usar o caminho do sistema de arquivos em disco. Por sua vez, esse caminho pode ser passado para o aplicativo Web como um argumento da VM ou propriedade do sistema. Como precaução, nunca usegetRealPath()
. Todas as alterações na pasta de implantação serão perdidas em uma reimplementação pelo simples motivo de que as alterações não são refletidas no arquivo WAR original.
Veja também: