2011-09-29 11 views
6

Estoy tratando de usar Class.getResource("rsc/my_resource_file.txt") para cargar un archivo en una aplicación de Eclipse. Sin embargo, no importa lo que hago en la ruta de clase Eclipse siempre contiene una sola entrada al lanzador Eclipse:Class.getResource() devuelve nulo en mi aplicación Eclipse? No se puede configurar classpath?

.../eclipse/plugins/org.eclipse.equinox.launcher_1.2.0.v20110502.pkc

¿Cómo puedo configurar el classpath?

Nota: En tiempo de ejecución estoy determinar la ruta de clase con el siguiente código:

URLClassLoader cl = (URLClassLoader) ClassLoader.getSystemClassLoader(); 
for (URL classpathURL : cl.getURLs()) { 
    System.out.println(classpathURL); 
} 

EDIT: Para más información.

La raíz del problema es que Class.getResource("rsc/my_resource_file.txt") devuelve nulo. Después de hacer algunos pequeños experimentos en una simple "aplicación Java" de 5 líneas, pensé que lo había descubierto y que el problema estaba relacionado con el classpath. Aparentemente el classpath se comporta un poco diferente con una "Aplicación de Eclipse". Resolví el problema haciendo Class.getResource("/rsc/my_resource_file.txt") Gracias BalusC.

+1

¿Puede dar un paso atrás? Su problema concreto es que el recurso devuelve 'null', ¿verdad? ¿Estás seguro de que su camino es el correcto? Como lo has hecho, es relativo al paquete de la clase actual. ¿No debería la ruta comenzar con '/' para ser relativa a la raíz del paquete? Al menos, el iniciador de Eclipse no tiene la culpa aquí. – BalusC

+0

@ BalusC - tiene razón, yo había pensado/sería una ruta absoluta en el sistema de archivos. Si das esto como respuesta, lo aceptaré. – Buttons840

+0

He publicado una respuesta. Classpath no debe confundirse con el sistema de archivos del disco local. – BalusC

Respuesta

8

Por favor, retroceda un paso. Su problema concreto es que el recurso devuelve null, ¿verdad? ¿Estás seguro de que su camino es el correcto? Como lo has hecho, es relativo al paquete de la clase actual. ¿No debería la ruta comenzar con / en relación con la raíz del paquete?

URL resource = getClass().getResource("/rsc/my_resource_file.txt"); 
// ... 

Alternativamente, también puede utilizar el cargador de clases de contexto, que siempre es relativa a la ruta de clase (paquete) de la raíz:

ClassLoader loader = Thread.currentThread().getContextClassLoader(); 
URL resource = loader.getResource("rsc/my_resource_file.txt"); 
// ... 

Al menos, el lanzador Eclipse no tiene la culpa aquí.

3

Haga clic derecho en el proyecto y siga las propiedades.

+0

Tuve el mismo problema y fue porque incluí el directorio raíz que estaba en el classpath. –

3

Coloque el archivo en el directorio de nivel superior en su árbol de fuentes. Esto a menudo se llama "src". Luego, cuando construya su proyecto, el archivo se copiará en su directorio de clase (el nombre varía). Finalmente, la creación posterior del archivo estará en su classpath (dentro del entorno de eclipse).

Class someClassObject = BlammyClassName.class; 
someClassObject.getResource("my_resource_file.txt"); 

devolverá una URL a su recurso.

someClassObject.getResourceAsStream("my_resource_file.txt"); 

devolverá una secuencia.

Edición: modificado de forma que no hace referencia a los métodos de clase estáticamente.

+0

Esos métodos no son' static'. Incluso entonces, no lo hará resolver el problema concreto de OP de usar rutas relativas dependientes del contexto. – BalusC

+0

Encontré esto como una solución válida en las primeras pruebas, pero no debería tener que poner un archivo de recursos en mi carpeta src. En su lugar, agregué la carpeta de recursos/archivo a la ruta de compilación. – Buttons840

Cuestiones relacionadas