Qual é o melhor local para armazenar um arquivo de configuração em um aplicativo da Web Java (WAR)?

Eu crio um aplicativo da web (WAR) e implanto-o no Tomcat. No webapp existe uma página com um formulário onde um administrador pode inserir alguns dados de configuração. Eu não quero armazenar esses dados em um DBMS, mas apenas em um arquivo xml no sistema de arquivos. Onde colocar isso?

Eu gostaria de colocar o arquivo em algum lugar na árvore de diretórios onde o aplicativo em si é implantado. O meu arquivo de configuração deve estar no diretório WEB-INF ? Ou colocá-lo em outro lugar?

E qual é o código Java para usar em um servlet para encontrar o caminho absoluto do diretório? Ou pode ser acessado com um caminho relativo?

0
adicionado editado
Visualizações: 1
Observe que não há mecanismo padrão para mecanismos de servlet - você precisará fazer suposições específicas do fornecedor.
adicionado o autor Thorbjørn Ravn Andersen, fonte

6 Respostas

Se é a sua configuração personalizada, WEB-INF é um bom lugar para isso. Mas algumas bibliotecas podem requerer configurações para residir em WEB-INF/classes.

0
adicionado

Colocá-lo em WEB-INF irá esconder o arquivo xml de usuários que tentam acessá-lo diretamente através de um URL, então sim, eu diria colocá-lo em WEB-INF .

0
adicionado

Eu não iria armazená-lo na pasta do aplicativo, porque isso iria substituir a configuração com uma nova implantação do aplicativo.

Eu sugiro que você dê uma olhada na API de Preferências, ou escreva algo na pasta de usuários (o usuário que está executando o Tomcat).

0
adicionado

A resposta para isso depende de como você pretende ler e gravar esse arquivo de configuração.

Por exemplo, o framework Spring oferece a capacidade de use arquivos de configuração xml (ou arquivos de propriedades Java); estes podem ser armazenados em seu caminho de classe (por exemplo, no diretório WEB-INF), em qualquer outro lugar no sistema de arquivos, ou mesmo na memória. Se você fosse usar o Spring para isso, o local mais fácil para armazenar o arquivo de configuração estará no diretório WEB-INF e, em seguida, usar o Spring classe ClassPathXmlApplicationContext para acessar seu arquivo de configuração.

Mas, novamente, tudo depende de como você planeja acessar esse arquivo.

0
adicionado

O que fazemos é colocá-lo em um diretório separado no servidor (você pode usar algo como/config,/opt/config,/root/config,/home/nome do usuário/config, ou qualquer coisa que você quiser). Quando nossos servlets são iniciados, eles lêem o arquivo XML, obtêm algumas coisas dele (o mais importante, informações de conexão de banco de dados), e é isso.

Eu perguntei por que fizemos isso uma vez.

Seria bom armazenar tudo no banco de dados, mas obviamente você não pode armazenar informações de conexão de banco de dados no banco de dados.

Você pode codificar coisas no código, mas isso é feio por vários motivos. Se as informações precisarem ser alteradas, você precisará reconstruir o código e reimplantar. Se alguém obtiver uma cópia do seu código ou do seu arquivo WAR, eles obterão essa informação.

Colocar coisas no arquivo WAR parece legal, mas se você quiser mudar muito as coisas, pode ser uma má ideia. O problema é que, se você tiver que alterar as informações, na próxima vez que for reimplementá-las, o arquivo será sobrescrito para que qualquer coisa que você não tenha se lembrado de alterar na versão incorporada ao WAR seja esquecida.

O arquivo em um lugar especial no sistema de arquivos funciona bem para nós. Não tem grandes desvantagens. Você sabe onde está, é armazenado separadamente, facilita a implementação em várias máquinas se todos precisarem de diferentes valores de configuração (já que não faz parte do WAR).

A única outra solução que posso pensar que funcionaria bem seria manter tudo no banco de dados, exceto as informações de login do banco de dados. Isso viria das propriedades do sistema Java recuperadas por meio da JVM. Esta é a coisa da API Preferences mencionada por Hans Doggen acima. Eu não acho que estava por perto quando nosso aplicativo foi desenvolvido, se foi usado.

Quanto ao caminho para acessar o arquivo de configuração, é apenas um arquivo no sistema de arquivos. Você não precisa se preocupar com o caminho da web. Então, quando o seu servlet é iniciado, basta abrir o arquivo em "/config/myapp/config.xml" (ou qualquer outro) e ele encontrará a coisa certa. Apenas codificar o caminho para este parece bastante inofensivo para mim.

0
adicionado
Nós especificamos uma propriedade do sistema quando o tomcat é iniciado. Nosso aplicativo obtém nosso diretório config a partir desta propriedade do sistema, para que possamos usar um diretório de configuração diferente de servidor para servidor.
adicionado o autor ScArcher2, fonte
Como isso funcionaria se você tivesse vários ambientes (por exemplo, teste e teste) em execução no mesmo tomcat? Desde que você não pode especificar uma propriedade do sistema por ambiente quando você tem apenas um tomcat.
adicionado o autor AtliB, fonte
Obrigado por suas sugestões. Eles são muito úteis para mim.
adicionado o autor boes, fonte
Em vez de referenciar o caminho completo para o arquivo, você pode colocar o diretório "config" no caminho de classe para o servidor e apenas usar ClassLoader.getResource ().
adicionado o autor John Meagher, fonte
Isso também funciona para nós, mas pode ser difícil se você ocasionalmente implantar no Windows, onde não é natural adicionar/optar e assim por diante.
adicionado o autor Peter Hilton, fonte
apenas uma pequena observação: de acordo com o guia de hierarquia do sistema de arquivos tldp.org /LDP/Linux-Filesystem-Hierarchy/html/opt.html , todos os arquivos devem estar em/opt/'package'/config onde 'package' é o nome do seu programa.
adicionado o autor milan, fonte
@ Pedro: Minha configuração do desenvolvedor estava no Windows. Acabei de criar o diretório na minha caixa off C para que quando o aplicativo pedisse "/ config", ele pegasse o diretório correto. Funcionou muito bem.
adicionado o autor MBCook, fonte
@ John: Na verdade, é uma boa ideia, isso foi simplesmente a configuração quando cheguei lá.
adicionado o autor MBCook, fonte
No aplicativo em que estou trabalhando atualmente, estamos armazenando o arquivo de configuração fora do aplicativo em uma pasta localizada no diretório USER_HOME. E na inicialização, o aplicativo obtém o arquivo do local String absoluteConfigPath = System.getProperty ("user.home") + File.separator + ".myapp" + File.separator + "config.xml";
adicionado o autor Nikola, fonte
@MBCook Obrigado pelo seu comentário. Isso esclareceu minhas dúvidas.
adicionado o autor Vimal Panchal, fonte

WEB-INF é um bom lugar para colocar seu arquivo de configuração. Aqui está um código para obter o caminho absoluto do diretório de um servlet.

public void init(ServletConfig servletConfig) throws ServletException{
    super.init(servletConfig);
    String path = servletConfig.getServletContext().getRealPath("/WEB-INF")
0
adicionado
Essa não é uma abordagem compatível - não é garantido pela especificação de servlet que getRealPath() retornará um caminho válido (não nulo) ou mesmo que a guerra seja descompactada (IMHO, Weblogic não extrairá arquivos do .war para disco).
adicionado o autor MRalwasser, fonte
esta não é uma boa abordagem!
adicionado o autor Gewure, fonte
Isso não funcionará se você tiver um ambiente dev, test, pre-prod e prod, pois você precisaria de um .war individual para cada ambiente. Você deve ser capaz de implantar a configuração uma vez e depois propagar a mesma guerra através dos ambientes ...
adicionado o autor Tom Chamberlain, fonte