open - java resource folder location
Junit+getResourceAsStream Returning Null (11)
Agregue la carpeta que tiene sus archivos de recursos en las carpetas de origen de eclipse. Entonces el archivo debería colocarse automáticamente en el directorio bin.
No estoy seguro de cómo es esto posible. Volví a leer en getResourceAsStream y siempre vuelve nulo.
InputStream source = this.getClass().getResourceAsStream("test.xml");
Justo al lado de test.java en el Finder (usando OS X y Eclipse) está test.xml
Puedo abrirlo en TextWrangler y verlo como existente con datos dentro.
Esta es una prueba de Junit si hace alguna diferencia. Fui y analicé las pruebas de Junit existentes en nuestro sistema y las estoy usando exactamente de la misma manera que un ejemplo de trabajo (como en dónde se encuentra el archivo y el código en sí).
¿Qué pequeña diferencia podría estar impidiendo que asuma que getClass () devuelva la ruta correcta?
¡Gracias!
Debe colocar la copia de su archivo de recursos en los recursos de prueba, en mi ejemplo es un archivo de fuente:
Luego llame a continuación de su prueba jUnit:
public static InputStream getFontAsStream() throws IOException {
return Thread.currentThread().getContextClassLoader()
.getResourceAsStream("fonts/" + "FreeSans.ttf");
}
Desde la API de Java:
Encuentre un recurso del nombre especificado de la ruta de búsqueda utilizada para cargar clases. Este método ubica el recurso a través del cargador de clases del sistema
Entonces, la sintaxis será, por ejemplo: ClassLoader.getSystemResource ("test.xml"). ToString ();
¡Funciona de maravilla!
En caso de que esté utilizando Maven, agregue esta parte a su pom.xml
<build>
<testResources>
<testResource>
<directory>${project.basedir}/src/test/resources</directory>
</testResource>
</testResources>
</build>
Su test.xml
y otros archivos de recursos deben estar ubicados en src/test/resources
No está encontrando el recurso en el classpath. Si está utilizando junit y maven, asegúrese de que los recursos se copien en el objetivo / clases de prueba agregando la directiva <include>
file on <testResource>
También puede averiguar la ubicación de su clase en el sistema de archivos mediante el uso de
this.getClass().getResource(".")
y comprobando si el recurso está ahí.
Pasé mucho tiempo en este problema y me faltaba la siguiente configuración: haga clic con el botón derecho en un proyecto de eclipse y seleccione Propiedades -> Ruta de compilación de Java -> Fuente y edite la fila Incluida y agregue * .properties (* .fileExtension)
Pruebe MyClass.getResourceAsStream ().
También intenta poner el test.xml en tu classpath. Por ejemplo, en un proyecto web de Eclipse, coloque text.xml en webcontent / WEB-INF / classes
Siempre tengo problemas con este método. Aquí hay 2 enlaces, que pueden ser útiles:
- Describe la diferencia entre getClass (). GetResource (); y getClass (). getClassLoader (). getResource ();
- Utilidad simple que simplifica estos 2 enfoques.
Siempre experimento con la adición de "/" al principio o "./".
Según mi experiencia, el mejor método es usar FileInputStream. Solo hay una cosa para recordar (al usar FileInputStream con Eclipse), con las configuraciones predeterminadas, su directorio de trabajo está configurado para proyectos raíz. Siempre puede verificar dónde está su directorio actual (y qué rutas relativas necesita) usando este fragmento de código .
Suponiendo que test.xml
se encuentra justo debajo de la carpeta de origen de la raíz de test
, haga esto: -
InputStream source = this.getClass().getClassLoader().getResourceAsStream("test.xml");
Tuve este problema con una clase de primavera. System.class.getResourceAsStream(...)
funcionó en pruebas unitarias, pero no en Tomcat, Thread.currentThread().getContextClassLoader().getResourceAsStream(...)
funcionó en Tomcat pero no en pruebas de unidad.
Por ultimo fui con
ClassUtils.getDefaultClassLoader()
.getResourceAsStream("com/example/mail/templates/invoice-past-due.html"))
También encontré que una vez que lo hice de esta manera, no necesitaba tener la ruta comenzando con una barra inclinada.
getResourceAsStream()
está utilizando CLASSPATH y, como tal, se cargará desde donde estén sus clases , no sus archivos fuente.
Sospecho que debe copiar su XML en el mismo directorio que su archivo .class.