2012-06-06 17 views
8

He visto algunas respuestas sobre cómo cargar un archivo en particular dentro de un contenedor a través de getResourceAsStream, y puedo gestionarlo. Sin embargo, estoy enfrentando algo muy específico y no pude encontrar una respuesta al respecto en el foro.Cargando con ResourceBundle desde el interior de un contenedor

Aquí es la configuración:

Tengo un archivo jar de tener un directorio conf que contiene 2 ficheros de propiedades messages_en_US.properties y messages_fr_FR.properties. La forma clásica para cargar dichos recursos es usar

ResourceBundle.getBundle("messages", java.util.Locale.getDefault()); 

Si los archivos estaban en el disco, en un directorio al que hace referencia la ruta de clase Programm, esto funciona bien. Pero no sé cómo puedo administrar el uso combinado de ResourceBundle.getBundle y el uso de los recursos de witin a jar. De hecho, como no puedo ver ningún puente a través de getResourceAsStream (o esto implicaría administrar la configuración regional por mi cuenta para especificar el nombre completo del archivo de recursos, que no es muy inteligente).

¿Alguien puede ayudar?

Gracias.

+0

¿Dónde tienes ese archivo ¿en la jarra? si permanece en un JAR significa que lo tienes en el classpath y no deberías tener problemas para cargarlo normalmente con ResourceBundle.getBundle – rascio

+0

Tengo el mismo problema, tengo un recurso de propiedad dentro de un archivo jar pero ese archivo jar es NO en los programas classpath.Leí el javadoc para PropertyResourceBundle y sé que podría hacerlo con inputstream, pero inputstream significa que leerá el archivo cada vez y perderé el almacenamiento en caché predeterminado de ResourceBundle. ¿Hay alguna manera de dirigir la clase ResourceBundle para obtener el paquete de un recurso que está fuera de su classpath? –

+0

También se puede implementar ResourceBundle.Control para la personalización, pero parece una exageración, es mejor encontrar formas de colocar los archivos de propiedades en la ruta de clases. –

Respuesta

1

¿Has probado esto?

ResourceBundle.getBundle("conf/messages", java.util.Locale.getDefault()); 
10

Si está en un directorio conf dentro del tarro, entonces el paquete del paquete que está tratando de cargar es conf, y se debe utilizar

ResourceBundle.getBundle("conf.messages", java.util.Locale.getDefault()); 

The javadoc dice:

baseName - the base name of the resource bundle, a fully qualified class name 
+0

3+ horas y, finalmente, esta respuesta salvó mi vida. +1 – xyz

+0

El archivo JAR no significa que debe estar en el classpath. Creo que el autor original está tratando de decir cómo acceder a un paquete de recursos cuando se encuentra fuera del classpath. Una forma es usar PropertyResourceBundle con InputStream, pero luego pierde el almacenamiento en caché y, en cualquier momento que lo haga, debe hacer un nuevo Bundle. Tengo el mismo problema, tengo un recurso que no está en el classpath. –

0

El ResourceBundle siempre busca un archivo de propiedades, por lo tanto, si ejecuta:

ResourceBundle.getBundle("messages", java.util.Locale.getDefault()); 

ResourceBundle buscará "messages.properties" en su classpath.

0

Suponiendo que el archivo messages.properties es parte de algún xyz.jar que ya se encuentra en el classpath del proyecto en el que desea utilizarlo. Un embalaje de este archivo en el tarro es la siguiente:

src 
    |main 
     |resources 
      |com 
       |xyz 
        ....|message.properties 

para leer este archivo:

import java.util.ResourceBundle; 

....

ResourceBundle.getBundle("com.xyz.resources.messages", Locale.getDefault()); 

Gracias

Cuestiones relacionadas