2009-04-17 7 views
7

Esto es alucinante ... Puedo hacer que getResource() y getResourceAsStream() funcionen correctamente cuando ejecuto Java en mi archivo JAR empaquetado que incluye un archivo de texto. (para referencia, consulte los documentos de Sun en accessing resources) Parece que no puedo hacer que el mismo programa funcione correctamente cuando lo ejecuto dentro de Eclipse, aunque coloque mi archivo de texto en el mismo árbol que mis archivos compilados .class¿Cómo se hace funcionar getResourceAsStream mientras se depura Java en Eclipse?

¿Puede uno de ustedes señalarme cualquier sutileza para asegurarse de que las funciones getResource() y getResourceAsStream() funcionen correctamente?

Tengo una corazonada que tiene que ver con CLASSPATH y/o donde Eclipse coloca los archivos .class que autocompila. (He notado que cuando ejecuto Ant, compila todos los archivos Java que han cambiado desde mi última compilación Ant, aunque Eclipse ya compiló esos archivos Java).

+0

consulte la respuesta de eugener http://stackoverflow.com/questions/5490547/problem-loading-resources-while-running-in-eclipse –

Respuesta

10

Si coloca el archivo de texto junto con su fuente archivos, Eclipse lo copiará en donde esté colocando sus archivos compilados .class, y así verá su archivo de texto cuando ejecute su aplicación desde Eclipse (y también podrá editar el archivo desde Eclipse).

+1

También asegúrese de que Eclipse conozca los archivos: "Refresque" el árbol fuente si se agregaron fuera de Eclipse. (Como señaló Jason S en otra respuesta.) –

1

Tengo una corazonada que tiene que ver con CLASSPATH y/o donde Eclipse coloca los archivos .class que autocompila.

En la configuración de Ejecución, sin embargo, está iniciando su aplicación, vaya a la pestaña Classpath y agregue la carpeta raíz de la ruta que está utilizando para acceder al archivo.

Entonces, por ejemplo, si está intentando cargar "blah/file.txt" y el archivo reside en "folder/blah/file.txt", agregue "folder" al classpath. Si intenta cargar el recurso con solo "file.txt", agregue "folder/blah".

0

¿A qué te refieres exactamente con "funciona correctamente"? ¿Cuál es el error/comportamiento?

sugiere emplear getResource para encontrar la URL de uno de sus .class archivos (o más o menos de forma equivalente getClass().getProtectionDomain().getCodeSource() Es posible que esté apuntando en algún lugar inesperado

16

Unas pocas notas:

primero - como.. Chocos dice, póngalo en los directorios de origen del eclipse, no en los directorios binarios. Eclipse borrará los directorios binarios cuando "limpia", así como también limpiará los archivos no coincidentes. Copiará los archivos fuente que no sean de Java en el directorio binario

Esto significa que, aunque haya soltado el archivo en el archivo binario d ir, puede ser eliminado por eclipse ...

Tenga en cuenta que getResourceAsStream y getResource operan en relación con el paquete del código que los llama. Por ejemplo:

package a.b.c; 
public class Foo { 
    ... 
    getClass().getClassLoader().getResourceAsStream("fee.txt"); 
    ... 
} 

Esto realmente buscará a/b/c/fee.txt; el paquete está pre-agregado. Esto funciona bien si tiene fee.txt en el mismo directorio de origen como el archivo Foo.java, o si tiene un conjunto separado de directorios de recursos en el classpath con la misma estructura de directorio.

Si utiliza

...getResourceAsStream("/fee.txt"); 

buscará fee.txt directamente en la ruta de clase.

Cuando se ejecuta desde la línea de comandos, donde en el JAR es el archivo de recursos? - Scott

2

¡Encontró el problema!

I hice tengo mis archivos de imagen en el árbol de fuentes. (en mi compilación Ant, los copié en el directorio de compilación)

El problema era que no había realizado una actualización reciente del árbol de código fuente en Eclipse. Entonces los archivos estaban allí, pero Eclipse no les prestaba atención.

Gracias por darme a conocer el hecho de que Eclipse debería tenerlos en mi árbol fuente.

+1

Si va a Ventana-> Preferencias-> General-> Espacio de trabajo, active la casilla "Actualizar automáticamente", eso evitará ese problema en el futuro. De lo contrario, asegúrese de agregar cosas al proyecto a través de eclipse (puede Archivo-> Importar y en algunas plataformas simplemente arrastrar/soltar elementos en el proyecto) –

1

Tuve el mismo problema con IntelliJ, la solución para eso era, en la configuración del proyecto, agregar la carpeta con los archivos de recursos, en mi caso, los archivos de sonido, como fuente. Agregue? *. Wav (o su tipo de archivo pref) en Configuración-> Patrones de recursos del compilador.

Cuestiones relacionadas