Pregunta

Quiero guardar la configuración de un proyecto web fuera del proyecto web (archivo del oído / guerra). La aplicación no debe saber en qué contenedor se está ejecutando (WebSphere / JBoss etc.).

¿Cuál es la mejor manera de manejar esto?

Es JNDI una manera limpia? Si JNDI puede resolver mis problemas, ¿cómo debería configurarlo? (Objetos personalizados?)

En mi caso son no sólo es simple llave => Los pares de valores (String, String) para los puntos finales SOAP / WS.

¿Fue útil?

Solución

pregunta para leer el archivo de propiedades fuera del archivo WAR.

pregunta para la lectura de valores de las variables de JNDI. Creo que esta es la mejor solución. Puede leer una variable de cadena con este código:

Context initialContext = new InitialContext();
String myvar = (String) initialContext.lookup("java:comp/env/myvar");

El código anterior funcionará en todos los contenedores. En Tomcat se declara lo siguiente en conf / server.xml:

<GlobalNamingResources ...>
  <Environment name="myvar" value="..."
         type="java.lang.String" override="false"/>
</GlobalNamingResources>

Lo anterior creará un recurso global. También es posible definir un recurso en el contexto de la aplicación. En la mayoría de los contenedores de recursos JNDI están disponibles a través de una consola de administración de MBeans. Algunos de ellos ofrecen una interfaz gráfica para editarlos. A lo sumo se necesita un reinicio de la aplicación, cuando se hace un cambio.

Como los recursos JNDI están definidos y editado es contenedor específico. Es el trabajo del configurador / administrador aplicar los ajustes adecuados.

Estos son los beneficios que ofrece JNDI:

  • Se pueden definir los valores por defecto de los parámetros en el archivo WAR / EAR.
  • Los parámetros son fácilmente configurable en el recipiente.
  • No es necesario reiniciar el contenedor cuando se modifica el valor de un parámetro.

Otros consejos

Hemos tenido un requisito configuración similar al desplegar una aplicación web para diferentes desarrolladores, y en EC2 de Amazon: ¿Cómo separamos de configuración desde el código binario? En mi experiencia, JNDI es demasiado complejo, y varía mucho entre los contenedores que se utilizarán. Además, la edición de XML-mano es muy susceptible a errores de sintaxis, por lo que era la idea fue rechazada. Se resolvieron con un diseño basado en unas pocas reglas:

1) nombre sólo es simple = entradas de valor deben utilizarse

2) nuevas configuraciones deben ser cargable cambiando sólo un parámetro

3) una distribución binaria de guerra deben ser reconfigurable w / o reenvasado que

4) parámetros sensibles (contraseñas), nunca será empaquetado en el binario

El uso de archivos .properties para toda la configuración y el uso de System.getProperty("domain"); para cargar los archivos de propiedades adecuadas, hemos sido capaces de cumplir con los requisitos. Sin embargo, la propiedad del sistema no apunta a una dirección de fichero, en lugar creamos un concepto que llamamos "dominio" para especificar la configuración de usar. La ubicación de la configuración es siempre:
$HOME/appName/config/$DOMAIN.properties.

Así que si quiero ejecutar mi aplicación con mi propia configuración, comienzo de la aplicación estableciendo el dominio a mi nombre:
-Ddomain=jason
en el arranque, y la aplicación carga el archivo:
/home/jason/appName/config/jason.properties
Esto permite a los desarrolladores compartir configuraciones para que podamos recrear el mismo estado de la aplicación para las pruebas y el despliegue sin recompilar o reenvasado. El valor de dominio se utiliza a continuación para cargar .properties desde una ubicación estándar, fuera de la WAR incluido.

puedo recrear completamente el entorno de producción en mi estación de trabajo mediante el uso de la configuración de producción como:
-Ddomain=ec2 que cargar:
/home/jason/appName/config/ec2.properties

Esta configuración permite que tienen ciclos dev / QA / liberación con exactamente -uno- conjunto de binarios compilados, utilizando diferentes configuraciones en cada entorno. No hay riesgo de que tienen contraseñas / etc agrupados en los binarios, y las personas pueden compartir sus configuraciones para recrear los problemas que estamos viendo.

Yo uso una variable de entorno para que apunte a una URL (que probablemente es una URL file: //) que tiene la configuración de mi en ella. Esto es muy simple de instalar y no requiere de la infraestructura JNDI.

A continuación, algunos ejemplos de código (a máquina de la memoria - No he compilado / probado este):

public void loadConfiguration() {
   String configUrlStr = System.getenv("CONFIG_URL"); // You'd want to use a more
                                                      // Specific variable name.
   if(configUrlStr == null || configUrlStr.equals("") {
       // You would probably want better exception handling, too.
       throw new RuntimeException("CONFIG_URL is not set in the environment."); 
   }


   try {
       URI uri = new URI(configUrlStr);
       File configFile = new File(uri);
       if(!configFile.exists()) {
          throw new RuntimeException("CONFIG_URL points to non-existant file");
       }
       if(!configFile.canRead()) {
          throw new RuntimeException("CONFIG_URL points to a file that cannot be read.");
       }
       this.readConfiguration(configFile);
   } catch (URISyntaxException e) {
       throw new RuntimeException("Malformed URL/URI in CONFIG_URL");
   }



}

sólo se puede almacenar a continuación es un archivo de propiedades Java normal que se encuentra en la ruta de clase y simplemente cargar las propiedades?

es sencillo y bastante simple .. a menos que me falta algo

Mis lugares favoritos son: Variables de entorno y Archivos de propiedades

(como se sugiere por Jared y kgiannakakis anteriormente).

Tabla de base de datos que almacenan propiedades de entorno

Sin embargo, una de otras soluciones más simples es tener la tabla de base de datos que almacenan propiedades de entorno.

Si la aplicación utiliza la base de datos

  • esto es relativamente fácil de configurar
  • da paso muy fácil de controlar los valores / cambio
  • Se puede integrar en el proceso, así por lo que es parte de los scripts de base de datos
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top