2010-09-27 12 views
6

Estoy tratando de usar el mecanismo integrado de Grails para cargar archivos de configuración externos (* .groovy y * .properties) fuera del archivo WAR desplegado. La documentación implica que este es solo el caso de establecer grails.config.locations con las rutas classpath: o file: apropiadas.grails/configuración externa/grails.config.locations - archivo de ruta absoluta "No existe"?

He configurado con Config.groovy:

String externalConfigLocation = System.getProperty("SYSTEM_PROPERTY_KEY") 
if (!grails.config.locations || !(grails.config.locations instanceof List)) { 
    grails.config.locations = []  
} 
if (classpathExternalConfigLocation) { 
    String pathToResource = "\"file:${basedir}" + File.separator + externalConfigLocation+"\"" 

    print "Loading external configuration file: ${pathToResource}\n" 
    grails.config.locations << pathToResource 
} 

Sin embargo esto no ha funcionado, con mensajes de error que indican el archivo "no existe". Sin embargo, imprimir la ruta absoluta almacenada en grails.config.locations indica que sí. He probado algunas combinaciones:

  • classpath:configurationFile.properties
  • file:c:\path_to_file\configurationFile.properties
  • c:\path_to_file\configurationFile.properties

pero en todos estos casos, el archivo no se puede encontrar.

Muy extraño - asesorar apreciado. O sugerencias sobre cómo depurar.

Respuesta

13

Esto es lo que suele hacer:

grails.config.locations = ["classpath:${appName}-config.groovy", 
          "file:./${appName}-config.groovy"] 
if (System.properties["${appName}.config.location"]) { 
    grails.config.locations << "file:" + System.properties["${appName}.config.location"] 
} 

Esto me permite poner un archivo en el directorio raíz del proyecto de personalizar las propiedades de forma local en el desarrollo (usando el archivo: ubicación) y un archivo en el classpath del servidor cuando se despliega como una guerra. La carpeta de lib de Tomcat está en su ruta de clase, por lo que es un buen lugar para colocar archivos si está utilizando Tomcat. Al poner el nombre de la aplicación en el archivo, puede tener múltiples archivos de configuración sin que se pisen entre sí.

Asegúrese de agregar el archivo de configuración local a svn: ignore o .gitignore para que no lo compruebe en el control de código fuente. Cada desarrollador puede tener su propia configuración (o simplemente usar los valores predeterminados) sin afectar a los demás.

Esta es una gran manera de externalizar contraseñas de base de datos y otros valores de producción. El implementador de la aplicación (idealmente no un desarrollador) administra el archivo y su contenido, y esto evita el ingreso de contraseñas en el control de la fuente. Mucho mejor que usar JNDI IMO.

+0

Gracias por esto. – Alex

+0

El truco era usar grails.config.locations << "classpath:" + classpathExternalConfigLocation y asegurarse de que eclipse/STS classpath apuntaba a la carpeta, en .classpath archivo. Classpath: es potencialmente más difícil de depurar, pero vale la pena para las rutas relativas de archivos – Alex

2

no creo que se obtiene cuando se ejecuta base.dir la guerra

Cuestiones relacionadas