Armazenando e editando a configuração para aplicativos Java EE

ATUALIZAÇÃO : Veja minha postagem no blog sobre esse tópico cerca de um ano depois de ter sido escrito: http://blog.ringerc.id.au/2012/07/java-ee-7-needs-improvements-in-app.html

… para referências à discussão de planejamento do Java EE 7 sobre este tópico.


Em geral, terminei de escrever um pequeno aplicativo Java EE 6 e estou no processo de replace as preferências codificadas por uma interface de configuração dinâmica adequada.

Não tenho certeza de como – ou, mais especificamente, onde – armazenar configurações. Deve haver alguma maneira óbvia, “padrão”, de fazer isso com o que se espera que “simplesmente funcione” em vários frameworks e contêineres, mas, para minha vida, não consigo encontrá-lo.

O que eu quero é uma maneira simples de carregar e armazenar configurações, uma que funcione em diferentes servidores de aplicativos e sistemas operacionais, não requer qualquer configuração pelo usuário e realmente funciona corretamente . A API Java Preferences seria ideal – mas parece quebrada no Glassfish 3.1.

Opções para armazenar configuração teoricamente includeiam:

  1. Usando parâmetros de contexto do ambiente de contêiner
  2. Armazenando-os usando a API Java Preferences
  3. Lendo / escrevendo um arquivo de propriedades … em algum lugar
  4. Usando o JPA para armazená-los em um JavaDB fornecido pelo contêiner
  5. Colocando-o em um arquivo de propriedades que é carregado fora do caminho de class
  6. Usando as propriedades do sistema para configurar opções de configuração ou caminho para um arquivo .properties

Isso parece ser um requisito básico que seria bem tratado em um ambiente onde o contêiner supostamente fornece todos os serviços principais que você pode precisar – mas todas essas abordagens têm problemas.

Um bug no glassfish renderiza (1) inviável, e em qualquer caso a interface com o usuário admin da web Glassfish não tem como configurar parâmetros de contexto, então você tem que usar `asadmin ‘e algumas menos que lindas syntaxs de linha de comando para fazê-lo. Os parâmetros de contexto só podem ser acessados ​​por meio do ServletContext – que não é acessível de forma consistente entre estruturas como JSF2, JAX-RS e servlets brutos – mas pelo menos o Seam Servlet trata disso.

O que parece ser outro bug no glassfish foi um conflito de versões da biblioteca entre o aplicativo implantado e as quebras do Glassfish (2). O back-end de preferências não libera as preferências para o disco, portanto, os dados de preferências armazenados são perdidos quando o servidor de aplicativos é reiniciado. A API Java Preferences também parece ser considerada uma coisa J2SE / desktop, apesar de sua inclusão nas especificações do Java EE 6.

(3) pode funcionar – mas não há como saber onde o seu aplicativo tem access de leitura / gravação no sistema de arquivos e onde ele deve ficar. Você não pode fazer isso configurável, pois se torna um problema de galinha e ovo. Vários palpites específicos da plataforma poderiam ser aplicados, mas quebrariam na presença de um SecurityManager.

(4) funcionaria, mas está bombardeando uma mosca. Ele requer que um serviço JavaDB esteja em execução e força o usuário a certificar-se de que os resources JDBC e pool no servidor de aplicativos estejam configurados corretamente. É grande e complicado para um trabalho simples, e a modelagem de entidades não é um ajuste perfeito para o armazenamento de preferências de qualquer maneira, já que a maioria delas é estruturada em chave / valor.

(5) funcionaria, mas requer que os usuários saibam onde colocar o arquivo de configuração onde ele será encontrado em vários servidores de aplicativos diferentes. Também torna difícil para o aplicativo fornecer qualquer tipo de configuração da interface do usuário porque não pode necessariamente encontrar o caminho local para o arquivo de configuração ou abri-lo para gravação, especialmente na presença de um SecurityManager.

(6) também funcionaria, mas força o usuário a configurar o sistema de configuração antes que ele possa configurar o aplicativo. Escusado será dizer que isso não me excita, dada a relativamente complicada implantação do aplicativo e a criação dos resources já é para usuários que ainda não conhecem o Glassfish / EE.

Então … como você está lidando com configuração e armazenamento de opções? Você encontrou uma maneira de permitir que você “apenas faça” sem que o usuário tenha que configurar nada para permitir que seu aplicativo armazene sua configuração?

O problema com a API de preferências foi causado pela inclusão de jaxb e jars de implementação de stax na guerra da aplicação, puxada por jersey-json. Com esses excluídos (como são fornecidos pelo servidor de aplicativos, de qualquer maneira), a API de preferências voltou a funcionar corretamente.

Parece que a API do prefs com interface do usuário personalizada para configuração parece ser o melhor caminho a percorrer.

Embora não seja o ambiente sobre o qual você falou: http://www.osgi.org/javadoc/r4v42/org/osgi/service/cm/ConfigurationAdmin.html