Pergunta

Estou no processo de eliminar todos os valores codificados em uma biblioteca Java e queria saber qual estrutura seria a melhor (em termos de configuração zero ou próxima de zero) para lidar com a configuração em tempo de execução?Eu preferiria arquivos de configuração baseados em XML, mas não é essencial.

Por favor, responda apenas se você tiver experiência prática com um framework.Não procuro exemplos, mas experiência...

Foi útil?

Solução

Se seus valores codificados são apenas pares simples de valores-chave, você deve olhar para java.util.Properties.É muito mais simples que xml, mais fácil de usar e extremamente trivial de implementar.

Se você está trabalhando com Java e os dados que você está armazenando ou recuperando do disco são modelados como um par de valores-chave (o que parece ser o seu caso), então realmente não consigo imaginar uma solução melhor.

Usei arquivos de propriedades para configuração simples de pacotes pequenos em um projeto maior e como uma configuração mais global para um projeto inteiro, e nunca tive problemas com isso.

É claro que isso tem o enorme benefício de não exigir a utilização de bibliotecas de terceiros.

Outras dicas

Configuração do Apache Commons funciona bem.Ele suporta o armazenamento da configuração em uma ampla variedade de formatos no back-end, incluindo propriedades, XML, JNDI e muito mais.É fácil de usar e estender.Para obter o máximo de flexibilidade, use um fábrica para obter a configuração e basta usar o Interface de configuração depois disso.

Dois recursos da configuração Commons que o diferenciam de um arquivo de propriedades direto é que ele suporta conversão automática para tipos comuns (int, float, arrays String) e suporta substituição de propriedades:

server.host=myHost
server.url=http://${server.host}/somePath

Aqui estão várias opções:

Você pode querer ler Comparação da configuração Commons com JFig e JConfig e Configurando seus aplicativos usando JFig para obter algum feedback de vários usuários.

Pessoalmente, usei o jConfig e foi uma boa experiência.

Configuração comum

Estamos usando isso.Os arquivos de propriedades por si só são muito mais fáceis de manusear, mas se você precisar representar uma configuração comum de dados mais complexa, poderá fazer isso e ler seus arquivos de propriedades também.

Se você não estiver fazendo nada complicado, eu me limitaria aos arquivos de propriedade.

Se você quiser fazer algo avançado (e seguro), você pode dar uma olhada nisso: http://www.ibm.com/developerworks/java/library/j-configint/index.html

a ferramenta de utilização inteligente de parâmetros (Entrada, página) permite externalizar quase qualquer decisão (codificada) como parâmetro em um arquivo de configuração baseado em XML. Foi iniciado no início de 2012 como uma resposta às deficiências percebidas nas ferramentas de configuração existentes no que diz respeito à generalidade e à separação de preocupações.

InPUT é provavelmente mais poderoso do que a maioria dos casos de uso exige, pois permite o formulação independente de linguagem de programação de dados experimentais (entrada - saída), com características como a definição de descritor complexo para mapeamentos de classe, ou geração e validação de configuração aleatória com base em intervalos de valores predefinidos (para teste e pesquisa, por exemploSimulações de Monte Carlo).Você pode definir parâmetros com subparâmetros, restrições relativas nos valores dos parâmetros (parâmetro numérico a > parâmetro b) etc..

Ainda está em beta, mas bastante estável, eu uso para minhas pesquisas, para o configuração e documentação de experimentos e para fins de ensino.Uma vez disponível para outras linguagens (adaptador C++ no pipe), outros pesquisadores/praticantes podem reutilizar os descritores executando suas implementações dos mesmos algoritmos em C++ (usando o conceito de mapeamento de código).Dessa maneira, resultados experimentais podem ser validados/programas podem ser migrados mais facilmente.A documentação ainda está em andamento, mas algumas exemplos estão disponíveis na página.Entrada é Código aberto Programas.

Para os interessados, o Artigo de pesquisa conceitual.

Eu costumo usar java.util.Properties (ou classes semelhantes em outras linguagens e frameworks) envolto em uma classe de configuração específica do aplicativo na maioria das vezes, mas estou muito interessado em alternativas ou variações disso.Especialmente porque as coisas podem se tornar um pouco complicadas se estiverem envolvidas caixas de diálogo de configuração gráfica ou múltiplas visualizações dos dados de configuração.

Infelizmente não tenho nenhuma experiência com bibliotecas específicas para Java (exceto aquelas que eu mesmo escrevi), mas qualquer indicação seria apreciada.

Atualizar

OK.Isso não era inteiramente verdade, três é o Projeto de configuração Spring Java.

EU escreveu sobre isso há algumas semanas e cheguei à conclusão de que XML é uma das notações mais utilizadas.

É o melhor?Acho que não, gosto muito de JSON, mas as ferramentas ainda não estão à altura do XML, então acho que temos que esperar para ver.

Podes tentar YamlBeans.Dessa forma, você escreve quaisquer classes que deseja manter seus dados de configuração e, em seguida, pode escrevê-las e lê-las automaticamente de e para YAML.

YAML é um formato de dados legível por humanos.Tem um poder mais expressivo que java.util.Properties.Você pode ter listas, mapas, âncoras, dados digitados, etc.

Por favor, dê uma olhada neste URL: http://issues.apache.org/jira/browse/CONFIGURATION-394

A estrutura de configuração que procuramos é algo superior à configuração do Apache Commons e deve suportar problemas de simultaneidade, problemas de JMX e a maioria dos armazenamentos (por exemplo, arquivo .properties, arquivos .xml ou PreferencesAPI).

O que a equipe do weblogic fornece no 'Console de Administração' é interessante, pois através dele você pode ter atualizações transacionais (atômicas) nas configurações para que os ouvintes registrados sejam notificados.

O pessoal do Apache insiste que este projeto está fora do escopo do Commons Configuration, talvez!

Anexei uma estrutura de configuração simples, dê uma olhada, por favor.

Acabei de postar um breve trecho código sobre como usar o ClassPathResource do Spring como uma alternativa ao IoC.ClassPathResource permite colocar arquivos de propriedades em qualquer lugar do caminho de classe (por exemplo, todos em um só lugar ou como pares do código que eles configuram).Meu exemplo usa apenas java.util.Properties, então você pode usar o estilo "name=value" de texto simples ou seu formato XML.

Arquivos de propriedades são muito simples, se você precisar de algo mais funcional, você pode formatar alguns de seus arquivos de configuração como classes Java.Eles podem ser colocados em um pacote/módulo diferente e podem ser pré-compilados ou carregados em tempo de execução com uma biblioteca como BeanShell.

Observação:No caso mais simples (pré-compilado) você não precisa de nenhuma biblioteca adicional.

Com relação às sugestões para usar java.util.Properties - a partir do jdk 1.5, a API de Preferências (java.util.prefs) parece ser a alternativa preferida ao uso da API de Propriedades.

Razões:maior escalabilidade, neutralidade de back-end, etc.

Você poderia dar uma olhada no recém-anunciado ferramentas4j-config cuja missão é permitir que você lide facilmente com a configuração em tempo de execução.

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