this.getClass (). getClassLoader (). getResource (“…”) e NullPointerException

Eu criei um projeto maven mínimo com um único módulo filho no eclipse helios.

Na pasta src / test / resources eu coloquei um único arquivo “install.xml”. Na pasta src / test / java, criei um pacote único com uma única class que:

@Test public void doit() throws Exception { URL url = this.getClass().getClassLoader().getResource("install.xml"); System.out.println(url.getPath()); } 

mas quando eu executo o código como um teste de junit 4, acabei de obter um NullPointerException. Isso funcionou bem um milhão de vezes antes. Alguma ideia?

Eu segui este guia:

http://www.fuyun.org/2009/11/how-to-read-input-files-in-maven-junit/

mas ainda recebe o mesmo erro.

Quando você usa

 this.getClass().getResource("myFile.ext") 

getResource tentará encontrar o recurso relativo ao pacote. Se você usar:

 this.getClass().getResource("/myFile.ext") 

getResource irá tratá-lo como um caminho absoluto e simplesmente chamar o classloader como você faria se tivesse feito.

 this.getClass().getClassLoader().getResource("myFile.ext") 

O motivo pelo qual você não pode usar um caminho principal / no caminho ClassLoader é porque todos os caminhos ClassLoader são absolutos e, portanto, não é um primeiro caractere válido no caminho.

tul

  • Quando você usa .getClass().getResource(fileName) considera que o local do fileName é o mesmo local da class de chamada.
  • Quando você usa .getClass().getClassLoader().getResource(fileName) considera que a localização do fileName é a raiz – em outras palavras, a pasta bin .

Fonte :

 package Sound; public class ResourceTest { public static void main(String[] args) { String fileName = "Kalimba.mp3"; System.out.println(fileName); System.out.println(new ResourceTest().getClass().getResource(fileName)); System.out.println(new ResourceTest().getClass().getClassLoader().getResource(fileName)); } } 

Saída:

 Kalimba.mp3 file:/C:/Users/User/Workspaces/MyEclipse%208.5/JMplayer/bin/Sound/Kalimba.mp3 file:/C:/Users/User/Workspaces/MyEclipse%208.5/JMplayer/bin/Kalimba.mp3 

Deve ser getResource("/install.xml");

Os nomes dos resources são relativos a onde a class getClass () reside, por exemplo, se o seu teste for org/example/foo/MyTest.class então getResource("install.xml") irá procurar em org/example/foo/install.xml .

Se o seu install.xml estiver em src/test/resources , ele estará na raiz do caminho de class, portanto, é necessário preceder o nome do recurso com / .

Além disso, se funcionar apenas algumas vezes, talvez seja porque o Eclipse limpou o diretório de saída (por exemplo, target/test-classs ) e o recurso está simplesmente ausente do caminho de class de tempo de execução. Verifique se usando a visualização Navigator do Eclipse, em vez do explorador de pacotes. Se os arquivos estiverem faltando, execute o objective do mvn package .

Eu tive o mesmo problema com as seguintes condições:

  • Os arquivos de resources estão no mesmo pacote que os arquivos de origem java, na pasta de origem java ( src/test/java ).
  • Eu construo o projeto com maven na linha de comando e a compilation falhou nos testes com o NullPointerException .
  • A construção da linha de comando não copiou os arquivos de resources para a pasta test-classs , o que explicava a falha de compilation.
  • Quando for eclipse após a linha de comando construir e executar novamente os testes no eclipse, também obtive o NullPointerException no eclipse.
  • Quando limpei o projeto (excluí o conteúdo da pasta de destino) e reconstruí o projeto no Eclipse, o teste foi executado corretamente. Isso explica por que ele é executado quando você começa com um projeto limpo.

Eu corrijo isso colocando os arquivos de resources na pasta resources no teste: src/test/resources usando a mesma estrutura de pacotes que a class de origem.

BTW eu usei getClass().getResource(...)

Quando o eclipse executa o caso de teste, ele procura pelo arquivo no destino / classs e não no src / test / resources. Quando o recurso é salvo, o eclipse deve copiá-lo de src / test / resources para target / classs se ele tiver sido alterado, mas se por algum motivo isso não tiver acontecido, você receberá este erro. Verifique se o arquivo existe no destino / classs para ver se esse é o problema.

Acho que encontrei o mesmo problema que o seu. Eu criei um projeto mvn simples e usei “mvn eclipse: eclipse” para configurar um projeto de eclipse.

Por exemplo, meu arquivo de origem “Router.java” localiza em “java / main / org / jhoh / mvc”. E o Router.java quer ler o arquivo “routes” que localiza em “java / main / org / jhoh / mvc / resources”

Eu corro “Router.java” no eclipse, e o console do eclipse tem NullPointerExeption. Eu defino pom.xml com essa configuração para tornar todos os arquivos de bytecode java * .class localizados no diretório de compilation.

  package ${basedir}/build  

Fui ao diretório “build / classs / org / jhoh / mvc / resources”, e não há “rotas”. Eclipse NÃO copiou “rotas” para “build / classs / org / jhoh / mvc / resources”

Eu acho que você pode copiar o seu “install.xml” para o seu diretório de bytecode * .class, não em seu diretório de código-fonte.

Eu tive o mesmo problema trabalhando em um projeto com o Maven. Aqui como consertei: acabei de colocar as fonts (imagens, músicas e outras coisas) no diretório de resources:

 src/main/resources 

Eu criei a mesma estrutura para os pacotes no diretório de resources também. Por exemplo:

Se minha aula está em

 com.package1.main 

No diretório de resources eu coloquei um pacote com o mesmo nome

 com.package1.main 

Então eu uso

 getClass().getResource("resource.png"); 

Uma outra coisa para ver isso resolveu para mim:

Em um projeto Eclipse / Maven, eu tinha classs Java em src/test/java em que eu estava usando o this.getClass().getResource("someFile.ext"); padrão para procurar resources em src/test/resources que o arquivo de resources estava no mesmo local de pacote na pasta de origem de resources, como a class de teste estava na pasta de origem de teste. Ainda não conseguiu localizá-los.

Clique com o botão direito do mouse na pasta de origem src/test/resources , Build Path e “configure filtros de inclusão / exclusão”; Eu adicionei um novo filtro de inclusão de **/*.ext para ter certeza de que meus arquivos não estavam sendo apagados; meus testes agora podem encontrar seus arquivos de resources.