2010-07-20 18 views
24

Tengo una sencilla aplicación Java que carga un archivo de propiedades del paquete actual.recurso de carga desde cualquier punto de la ruta de clase

this.getClass().getResourceAsStream("props.properties"); 

Esto funciona bien cuando el archivo de propiedad que quiero está en el paquete actual. Sin embargo, quiero empaquetar esta aplicación como un JAR y definir y anular con un nuevo archivo de propiedades donde lo uso. ¿Hay alguna forma de cargar el primer recurso llamado "props.properties" que está en el classpath?

Quiero que sea tan fácil de reemplazar el archivo de propiedades a través de línea de comandos:

java.exe -classpath props.properties;myJar.jar com.test.MyApp 

yo no quiero tener que descomprimir el archivo JAR y modificar el archivo de propiedades para cambiar algo. Siento que estoy perdiendo algo obvio ...

Respuesta

4

Si todo lo demás falla, podría usar dos nombres de archivo diferentes, por ejemplo props-default.properties dentro de myJar.jar y props.properties para sobrescribir en la línea de comandos. En su código, que iba a tratar de cargar el archivo props.properties primero y repliegue a props-default.properties si no se ha encontrado.

0

No estoy seguro, pero tal vez: ClassLoader.getResourceAsStream()

EDIT:

No creo que esto es muy diferente a this.getClass () .getResourceAsStream() de la pregunta, ya que como se mencionó, aún debe obtener el ClassLoader que desea usar para cargar el recurso.

Dado que usted proporciona el recurso en el classpath en su ejemplo, debería estar disponible desde el mismo cargador de clase que su clase "principal" (en SunMV de Sun, es sun.misc.Launcher $ AppClassLoader, no estoy seguro si esto puede/varía para otras implementaciones de JVM).

+0

Sonidos sobre derecho: desea preguntar a un ClassLoader que es el "jefe" del que cargó su clase, por lo que puede tener acceso a más paquetes. Otra posibilidad es probar 'ClassLoader.getSystemClassLoader()' - como su nombre lo indica, es el "jefe" de los demás. –

+0

no hay un método estático 'getResourceAsStream()' en la clase 'ClassLoader'. –

+0

y el cargador de clases del sistema probablemente cargará recursos desde fuera del classpath de su aplicación, es decir, buscando en los directorios bootstrap en la ruta de instalación de JRE –

26

El javadoc for Class.getResourceAsStream() documenta la lógica de búsqueda:

Si el nombre comienza con un '/' ('\u002f'), entonces el nombre absoluto del recurso es la parte del nombre de raíz de la '/'.

De lo contrario, el nombre absoluta es de la siguiente forma:
modified_package_name/name

Cuando el modified_package_name es el nombre del paquete de este objeto con '/' sustituido por '.' ('\u002e').

En otras palabras, el nombre del recurso se pasa al método debe ser similar /com/package/p2/props.properties si el props.properties se almacena en el paquete com.package.p2 lugar de la clase actual.

13

Estoy seguro de que es demasiado tarde para la respuesta, pero podría ser interesante para los googlers este pequeño fragmento de código ayuda a cargar un archivo de propiedades desde cualquier lugar en el Classpath.

+2

¿Existe alguna razón específica por la que no utilice getResourceAsStream? –

+0

Uso este tipo de inicialización mientras desarrollo una aplicación EE. Durante el desarrollo, mi aplicación es consciente de que ese archivo arroja Eclipse Classpath. Pero en la creación del EAR, la aplicación es consciente de que el archivo arroja la configuración ClassPath throw WebSphere. Apreciaré otra solución elegante también. –

+0

Ya veo. No esperaba que arrojara diferentes excepciones (o al menos esperaría que ambos tuvieran un padre común, como IOException). Enfoque interesante sin embargo. –

Cuestiones relacionadas