Java – class.getResource devuelve nulo

Estoy usando lo siguiente para obtener la URL de este archivo en particular, pero devuelve nulo. ¿Alguien tiene alguna sugerencia sobre el problema o una forma alternativa de hacerlo?

URL url = ExchangeInterceptor.class.getResource("GeoIP.dat"); 

Para aquellos que usan Intellij Idea : verifique Configuración -> Comstackdor -> Patrones de recursos .

La configuración contiene todas las extensiones que deben interpretarse como recursos. Si una extensión no cumple con ningún patrón aquí, class.getResource devolverá nulo para recursos usando esta extensión.

La ruta es relativa a la raíz de la ruta de clase y si no proporciona una ruta absoluta, está buscando en el mismo paquete que la clase que está utilizando (en este caso ExchangeInterceptor ). Para encontrar algo en la raíz use /GeoIP.dat .

Utilice el método getResource de la clase ‘ ClassLoader

 URL url = ExchangeInterceptor.class.getClassLoader().getResource("GeoIP.dat"); 

Resolví este problema señalando la resource root del resource root en IDEA.

Inicialmente, el directorio era así y el ícono era un ícono de carpeta simple

antes de

enter image description here

Right click el Right click en un directorio (o solo en el nombre del proyecto) -> Mark directory As -> Resource Root .

Después

después

Recomstackr y regocijarse: P

No, esa es la manera correcta de afaik. Asegúrate de que el recurso esté en tu classpath. Esto a menudo es la causa de este tipo de problemas.

Si está utilizando Gradle e IntelliJ, y los Resource patterns cambiantes no funcionaron, y sus raíces de recursos están configuradas correctamente … puede intentar esto:

enter image description here

Settings > Build, Execution, Delpoyment > Build Tools > Gradle > Runner > Delegate IDE build/run actions to gradle . (IntelliJ 2017.3.3)

Fuente: https://youtrack.jetbrains.com/issue/IDEA-176738#comment=27-2518612

Solo en caso de que alguien todavía tenga problemas para entender eso:

.getResource () le otorga acceso a la carpeta bin local. Eso significa que sus recursos deben estar ubicados en YourProject / bin / package /. La carpeta raíz es YourProject / bin / y puede ser accedida agregando el prefijo / al argumento String, como dijo iirekm.

¿Dónde has puesto este GeoIP.dat? En el mismo paquete que ExchangeInterceptor, o en el paquete “raíz”. Si está en el mismo paquete, su código es correcto, si está en la raíz, agregue el prefijo ‘/’.

¿Tal vez estás usando M2Eclipse? Si se configura incorrectamente, también puede provocar tales problemas. Otra causa de tales problemas puede ser: cargadores de clases mal configurados, OSGi mal configurado, …

El archivo debe estar en el classpath, por ejemplo:

bin / my / package / GeoIP.dat

El / prefijo parece ser una mentira. Lo siguiente funcionaría.

 URL url = ExchangeInterceptor.class.getResource("my/package/GeoIP.dat"); 

Sospecho que el problema es que no tienes el archivo en el classpath.

Mientras usaba IntelliJ, genere el proyecto como una aplicación JavaFX y luego agregué el soporte de maven framework. Resulta que, luego coloqué mi recurso en src/main/resources y tuve que agregar ./ detrás de cada nombre de recurso mientras los usaba en el código.

También como se indicó en una respuesta anterior, solo se cargó el recurso por un cargador de clases.

Entonces, para mí, la carga final de la URL se realizó usando:

URL url = getClass().getClassLoader().getResource(String.format(".%ssample.fxml", File.separatorChar));

File.separatorChar devuelve / en * nix y \ en windows.

Me he enfrentado con el problema similar. Desde Java SE API para getResource (String name) :

Si el nombre comienza con un ‘/’ (‘\ u002f’), el nombre absoluto del recurso es la parte del nombre que sigue a ‘/’.

Así que he agregado '/' antes de mi directorio: MyClass.class.getResource("/dir_name/") .

En su caso intente agregar '/' antes de su nombre de archivo:

URL url = ExchangeInterceptor.class.getResource("/GeoIP.dat");

En primer lugar, debe asegurarse de que está accediendo al archivo correcto en el camino correcto. Puede verificarlo por getClass (). GetResource (“GeoIP.dat”). GetAbsolutePath ().

En segundo lugar, el especificador de ruta distingue entre mayúsculas y minúsculas, así que asegúrese de que su archivo no se llame “geoIP.dat” o “GeoIP.DAT”.

En caso de eclipse .

Solo una pista. Su código podría ser correcto, pero su configuración jre no. Me encontré con el mismo error, nada me ayudó, hasta que verifiqué la configuración del eclipse.

Asegúrese de establecer correctamente el entorno de ejecución.

 Preferences -> Java -> Installed JREs -> use "jdk..." as compatible JRE