Java – class.getResource retorna nulo

Eu estou usando o seguinte para obter o URL desse arquivo específico, mas retorna null. Alguém tem alguma sugestão sobre o problema ou uma maneira alternativa de fazer isso?

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

Para aqueles que usam o Intellij Idea : verifique Configurações -> Compilador -> Padrões de resources .

A configuração contém todas as extensões que devem ser interpretadas como resources. Se uma extensão não obedecer a nenhum padrão aqui, class.getResource retornará null para resources usando essa extensão.

O caminho é relativo à raiz do caminho de class e, se você não fornecer um caminho absoluto, ele estará procurando no mesmo pacote da class que está usando (neste caso, ExchangeInterceptor ). Para encontrar algo na raiz use /GeoIP.dat .

Use o método getResource da class ‘ ClassLoader

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

Eu resolvi esse problema apontando a resource root do resource root no IDEA.

Inicialmente, o diretório era assim e o ícone era um ícone de pasta simples

Antes

insira a descrição da imagem aqui

Right click com o Right click em um diretório (ou apenas no nome do projeto) -> Mark directory As -> Resource Root .

Depois de

depois de

Recompile e alegre-se: P

Não, esse é o caminho certo afaik. Certifique-se de que o recurso esteja no seu caminho de class. Isso geralmente é a causa desses tipos de problemas.

Se você estiver usando o Gradle e o IntelliJ, e alterar os Resource patterns não funcionou, e as raízes do seu recurso estão definidas corretamente … você pode tentar isto:

insira a descrição da imagem aqui

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

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

Apenas no caso de alguém ainda ter problemas para entender isso:

.getResource () lhe concede access à pasta bin local. Isso significa que seus resources precisam estar localizados em YourProject / bin / package /. A pasta raiz é YourProject / bin / e pode ser acessada adicionando o prefixo / ao argumento String, como iirekm disse.

Onde você colocou este GeoIP.dat? No mesmo pacote que o ExchangeInterceptor ou no pacote “root”. Se estiver no mesmo pacote, seu código está OK, se estiver no prefixo root ‘add’ / ‘.

Talvez você esteja usando o M2Eclipse? Se configurado incorretamente, também pode resultar em tais problemas. Outra causa de tais problemas pode ser: carregadores de classs configurados incorretamente, OSGi mal configurado, …

O arquivo precisa estar no classpath, por exemplo: –

bin / my / package / GeoIP.dat

O prefixo / parece ser uma mentira. O seguinte iria funcionar.

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

Eu suspeito que o problema é que você não tem o arquivo no classpath.

Enquanto usava o IntelliJ, eu gerava o projeto como um aplicativo JavaFX e depois adicionei suporte a framework maven. Acontece que, em seguida, coloquei meu recurso em src/main/resources e tive que adicionar ./ atrás de cada nome de recurso que, ao usá-los no código.

Além disso, conforme indicado em uma resposta anterior, apenas o carregamento do recurso por um classLoader funcionou.

Então, para mim, o carregamento final do URL foi feito usando:

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

O File.separatorChar retorna / on * nix e \ nas janelas.

Eu enfrentei o problema similar. Da API do Java SE para getResource (nome da string) :

Se o nome começar com um ‘/’ (‘\ u002f’), o nome absoluto do recurso será a parte do nome que segue o ‘/’.

Então eu adicionei '/' antes do meu diretório: MyClass.class.getResource("/dir_name/") .

No seu caso, tente adicionar '/' antes do nome do seu arquivo:

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

Primeiro, você precisa ter certeza de que está acessando o arquivo correto no caminho certo. Você pode verificar isso por getClass (). GetResource (“GeoIP.dat”). GetAbsolutePath ().

Em segundo lugar, o especificador de caminho faz distinção entre maiúsculas e minúsculas, portanto, certifique-se de que seu arquivo não seja denominado “geoIP.dat” ou “GeoIP.DAT”.

Em caso de eclipse .

Apenas uma sugestão. Seu código pode estar correto, mas sua configuração não é. Eu corri para o mesmo erro, nada ajudou, até que eu verifiquei as configurações do eclipse.

Certifique-se de que você definiu seu ambiente de execução corretamente.

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