Pergunta

Por exemplo:

MyApp é um aplicativo web que contém um arquivo de propriedades (server.properties) que descreve dados de configuração (por exemplo, nomes de servidor) para o aplicativo. Na fase de desenvolvimento, server.properties está localizado em sua própria pasta projeto IDE (um ponto lógico para ele).

Agora é hora de implantar MyApp. O IDE torna bastante trivial para jar-se os arquivos de classe, bem como os arquivos de configuração de apoio. Agora só soltar o frasco no recipiente web apropriado e vamos embora ....

Uma semana depois ... os dados de configuração do servidor que MyApp usa precisa mudar. O que faz mais sentido?

A. Modificar a volta arquivo server.properties em terra IDE e gerar um novo arquivo jar. Reimplantar. (O que significa que saltam o aplicativo para uma mudança de configuração simples).

B. Crack abrir o frasco já implantado e modificar o arquivo server.properties? (Pode ter que chamar uma função de atualização em MyApp se server.properties é armazenada em cache ... mas não deve exigir um salto aplicativo completo. Também precisa se lembrar de modificar server.properties de origem, bem assim futuros implanta não faça server.properties Reverter aos antigos nomes de servidor).

C. Faça server.properties externo para o arquivo jar em primeiro lugar. Muito semelhante ao processo do B, com a pequena diferença de manter os dados de configuração externa para o frasco (introduz diferentes caminhos entre o desenvolvimento e produção implanta)

D. Outros:

Obrigado!

Foi útil?

Solução

Eu iria com D.

Tente carregar os arquivos de propriedades de fora da .jar então, se isso falhar, carregar as propriedades construídas dentro do frasco.

Isso permite que você empurrar para fora um "preparado" configuração com cada compilação (também reduz a complexidade de uma implementação, se por apenas um arquivo), ao mesmo tempo, tornando substituindo configurações possíveis e razoavelmente simples.

Outras dicas

Se você estiver usando Primavera, em seguida, você pode fazer uso do espaço reservado propriedade para fazer o trabalho.

<!-- try and resolve the config from the filesystem first and then fallback to the classpath -->
<context:property-placeholder location="file:config.properties, classpath:config.properties"
                              ignore-resource-not-found="true"/>

Você pode especificar um recurso no sistema de arquivos e também sobre o classpath, Primavera vai primeiro tentar resolver todas as propriedades do sistema de arquivos e, em seguida, fallback para o classpath. Especificando o atributo "ignorar-resource-não-encontrado" como "verdade" que irá impedir Primavera de lançar uma exceção se o arquivo não está presente no sistema de arquivos e permitir que ele para resolver as propriedades do classpath vez.

Usando esta combinação também permite dividir as propriedades ao longo de dois arquivos, por exemplo, você nunca pode querer especificar senhas no arquivo no classpath e esperar que eles sejam especificados externamente no sistema de arquivos. Todas as propriedades que faltam no sistema de arquivos será resolvido a partir do classpath.

Em uma pasta contendo:

application.jar
config.properties

Você deve ser capaz de usar:

java -jar application.jar

Esta é uma amostra config.properties para referência:

# This file contains properties that are used to configure the application
database.url=127.0.0.1
database.port=3306
database.user=root
database.pass=p4ssw0rd

Depende. Se o arquivo de propriedades contém dados que se destina a ser alterado pelo usuário de sua aplicação ou biblioteca, do que deveria residem fora.

Se ele contém dados que é estático e que criou os arquivos de propriedades apenas para evitar codificação os valores no código fonte ou se os arquivos são localizados cordas, eu deixá-los na jarra. Pelo menos, porque um arquivo de propriedades convida as pessoas a mudar os valores;)

D.

Coloque as propriedades no frasco. Em seguida, crie uma nova propriedades usando as propriedades ed-jar como os padrões. Em seguida, carregar a partir do exterior do frasco. Isso permite que selecione personalização de propriedades.

Lembre-se, que em J2EE, você não está garantido para ser capaz de acessar arquivos de fora do ambiente J2EE (sem acesso direto aos arquivos).

Você teria que usar JNDI para apontar para uma fonte de dados que contém seus dados, ou um arquivo de propriedades em seus artefatos de implantação.

Websphere, por exemplo, não permite acesso direto aos arquivos por padrão.

Opção D. Em ambientes diferentes que você pode precisar especificar deseja especificar propriedades ambientais, tais como a conexão com o banco de dados ou proxy etc.

Outra coisa a notar é que na produção você pode querer mudar rapidamente uma propriedade sem ter que pré-embalagem de um frasco ou substituir o arquivo de propriedades na jarra.

por exemplo. O servidor de banco de dados está caído e você precisa apontar para um servidor diferente (se não estiver usando um balanceador de carga dos bancos de dados). Então tudo que você precisa fazer é substituir as propriedades do banco de dados e reinicie. Você economiza muito tempo lá.

Muitas vezes é um critério que o código deve ser migradas INALTERADA de teste para a produção. Isto implica que você não pode editar arquivos configuation incorporado. Além disso, você pode acabar em uma situação onde você precisa mudar uma configuração implantado - que muitas vezes é muito complicado. Assim, deixamos o configuraiton fora dos frascos.

Para aplicativos Java EE considerar JNDI ou um arquivo de propriedades no classpath.

Eu tenho um aplicativo da web onde a configuração é recuperada a partir de uma aplicação web vizinho simplesmente para separar os dois. Que acabou por ser muito mais fácil.

Eu uso arquivos de propriedade em webapps (Guerras), mas principalmente para valores padrão e material que é mais ou menos imutável (desde webapps não deve estar atualizando suas guerras, mesmo quando eles podem).

Para coisas como o que você está falando, no entanto, eu uso JNDI. Você pode definir as propriedades como recursos em seu arquivo web.xml. Dessa forma, na pior das hipóteses, você atualizar web.xml e não o aplicativo em si.

Para alguns servidores existem maneiras de substituir estes valores de recursos sem tocar no WAR em tudo. Por exemplo, no Tomcat.

Eu normalmente fazer um WAR para teste, Q / A e produção e substituir os recursos sensíveis ao ambiente exatamente isso era, usando arquivos Contexto XML do Tomcat. Eu considero isso muito melhor do que ter que construir múltiplas guerras ou para modificar WARS, uma vez que o app que eu estou testando é quase idêntico ao do aplicativo que está em produção.

Eu acho que a resposta depende se você acha que precisa de controle de versão para as configurações. (Eles poderiam ser configurações de produção ou configurações para testes de regressão ...)

  • Se você não precisa de controle de versão, em seguida, a opção D com um arquivo de propriedades externo que substitui um arquivo de propriedades é uma boa. Opções B e C são mais abertos a coisas-ups, mas se você realmente se importasse você estaria usando o controle de versão: -)
  • Se você precisar de controle de versão, a opção A lhe dá mais controle, mas se você tem a possibilidade de várias implantações você também pode querer / necessidade de controle de versão as configurações para cada implantação. Um exemplo é implantações separadas para plataformas de teste e produção.

Veja como fazer isso usando módulos Maven e Maven arquivo WAR "sobreposições".

  1. Nós temos vários módulos para os componentes de código Java. Estes são módulos JAR.
  2. Nós temos módulo "base webapp" para o conteúdo estático, JSPs e dados básicos de configuração (fiação Primavera, propriedades padrão). Este é um módulo WAR, de modo que o resultado do edifício é uma guerra que contém a acima de + todos os arquivos JAR.
  3. Cada "configuração do site" distinta é um módulo WAR que contém substituições específicas do local para propriedades, arquivos de fiação e conteúdo. O primordial é descrita usando o mecanismo Maven WAR "overlay", e os resultados de uma nova guerra sendo montados a partir de a "base" WAR e as sobreposições.

Tudo isso é verificado no controle de versão, e você precisa fazer uma compilação Maven e implantação WAR para fazer alterações na configuração.

Eu tenho uma pergunta semelhante. Nós não ter figurado tudo para fora ainda. Mas nós estamos olhando para Recursos de URL. Onde o arquivo de propriedade é lido diretamente do SVN. Sem atualização necessidade outra coisa senão o arquivo de propriedade.

I desenvolver aplicações J2EE usando Primavera. Eu estava correndo em torno do mesmo problema bastante tempo e, em seguida, encontrou uma solução. Meu problema era para especificar as propriedades de banco de dados em um arquivo de propriedades fora do arquivo de guerra que eu implantar. A solução que eu encontrei para isso é usar o PropertyPlaceholderConfigurer e especificar a propriedade local para localizar o local do sistema como este,

Este foi bastante simples e funcionou muito bem!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top