2010-07-20 24 views
8

Ya busqué StackOverflow para "propiedades dentro de la guerra", pero ninguno de los resultados funcionó para mi caso.Java: Acceso al archivo de propiedades dentro de una guerra

Estoy usando Eclipse Galileo y GlassFish v3 para desarrollar un conjunto de servicios web. Estoy usando un "proyecto web dinámico" con la siguiente estructura

Src 
-java_code_pkg_1 
-java_code_pkg_2 
-com.company.config 
--configfile.properties WebContent 
-META-INF 
-WEB-INF 
--log4jProperties 
--web.xml 
--applicationContext.xml 
--app-servlet.xml 

Quiero tener acceso a los "configfile.properties" dentro de uno de los archivos de origen en "java_code_pkg1". Estoy usando Spring Framework y este archivo se creará una instancia una vez que la aplicación se inicie en el servidor.

he intentado lo siguiente sin suerte

getResourceAsStream("/com.company.config/configfile.properties"); 
getResourceAsStream("/com/company/config/configfile.properties"); 
getResourceAsStream("com/company/config/configfile.properties"); 
getResourceAsStream("/configfile.properties"); 
getResourceAsStream("configfile.properties"); 

getResourceBundle(..) didn't work either. 

¿Es posible acceder a un archivo cuando no está en la ruta de WEB-INF/classes? si es así, ¿cómo?

Gracias

Respuesta

7
Properties props = new Properties(); 
props.load(this.getClass().getResourceAsStream("/com/company/config/file.properties")); 

funciona cuando estoy en modo de depuración. Puedo ver los valores en el depurador, pero obtengo una NullPointerException justo después de ejecutar la línea "props.load" y antes de pasar a la luz debajo de ella.

Eso es un problema diferente. Al menos ahora sé que esta es la forma de acceder al archivo de configuración.

Gracias por su ayuda.

1

¿Está seguro de que el archivo está siendo incluido en el archivo de la guerra? Muchas veces, el proceso de compilación de guerra filtrará los archivos que no son de clase.

+0

Si el archivo está allí. Puedo verlo si navego por la estructura de directorios de Glassfish. –

6

Si está en una guerra, su classpath "directorio actual" es "WEB-INF/classes". Simplemente suba dos niveles.

getResourceAsStream("../../com/company/config/configfile.properties"); 

Es horrible pero funciona. Al menos, funciona bajo tomcat, jboss y geronimo y funciona hoy.

P.S. Su estructura de directorio no es muy clara. Quizás es:

getResourceAsStream("../../com.company.config/configfile.properties"); 
+0

Gracias por el truco. Funcionó bien para tener un archivo war cargar un archivo de propiedades ubicado en el oído que lo contiene. ¿Alguna sugerencia para cargar archivos de propiedades ubicados en un archivo hermano de guerra con un nombre completo indeterminado? – Snekse

+0

Mumble, supongo que no puedes. El servidor de aplicaciones debería aislar las guerras entre sí y no debería permitirle acceder a un archivo en una guerra entre hermanos. Obviamente, existen formas de eludir o relajar las políticas de seguridad AS, pero son AS dependientes. – andcoz

0

¿Cuál es la ruta una vez que se implementa en el servidor? Es posible usar Scanner para leer de forma manual en el recurso. Desde un archivo java dentro de un paquete, al crear un nuevo archivo ("../ applications /") obtendrá un archivo que apunta a {glassfish install} \ domains \ {domain name} \ applications. ¿Tal vez podría modificar esa ruta de archivo para dirigirlo a donde necesita ir?

2

Compruebe la ubicación del archivo de propiedades en el archivo WAR. Si es en WEB-INF/classes en el directorio com/empresa/config getResourceAsStream("com/company/config/configfile.properties") deben trabajar o getResourceAsStream (" Esto debería funcionar si el archivo de configuración no está bajo WEB-INF/classes directoy

También trate de usar getClass(). getClassLoader(). getResourceAsStream.

0

Dado que está utilizando Spring, utilice el soporte de recursos en Spring para inyectar directamente los archivos de propiedades.

ver http://static.springsource.org/spring/docs/3.0.x/reference/resources.html

Incluso si la clase que requiere el archivo de propiedades no se gestionados Spring, todavía se puede obtener acceso al Application Context y lo utilizan para cargar el recurso

recursos sería algo así como, ruta de clases : settings.properties, suponiendo que su compilación ha sido recogido por su compilación y se ha eliminado en el archivo war.

También puede inyectarse directamente, a partir de los documentos:

<property name="template" value="classpath:some/resource/path/myTemplate.txt"> 
Cuestiones relacionadas