getResourceAsStream () está sempre retornando nulo

Eu tenho a seguinte estrutura em um aplicativo da Web Java:

TheProject -- [Web Pages] -- -- [WEB-INF] -- -- -- abc.txt -- -- index.jsp -- [Source Packages] -- -- [wservices] -- -- -- WS.java 

Em WS.java , estou usando o seguinte código em um método da Web:

 InputStream fstream = this.getClass().getResourceAsStream("abc.txt"); 

Mas está sempre retornando um nulo. Eu preciso ler a partir desse arquivo, e eu li que, se você colocar os arquivos em WEB-INF , você pode acessá-los com getResourceAsStream , mas o método está sempre retornando um null .

Alguma idéia do que eu posso estar fazendo errado?

Btw, o estranho é que isso estava funcionando, mas depois que eu realizei um Clean and Build no projeto, de repente parou de funcionar: /

Pelo que eu sei, o arquivo tem que estar bem na pasta onde a class 'this' reside, isto é, não em WEB-INF/classs mas aninhada ainda mais profundamente (a menos que você escreva em um pacote padrão):

 net/domain/pkg1/MyClass.java net/domain/pkg1/abc.txt 

Colocar o arquivo em suas fonts java deve funcionar, o compilador copia esse arquivo junto com os arquivos de class.

Uma chamada para a Class#getResourceAsStream(String) delega para o carregador de classs e o recurso é pesquisado no caminho da class. Em outras palavras, seu código atual não funcionará e você deve colocar abc.txt em WEB-INF/classs , ou em WEB-INF/lib se empacotado em um arquivo jar.

Ou use ServletContext.getResourceAsStream(String) que permite que os contêineres de servlet disponibilizem um recurso para um servlet de qualquer local, sem usar um carregador de classs . Então use isso de um Servlet:

 this.getServletContext().getResourceAsStream("/WEB-INF/abc.txt") ; 

Mas existe uma maneira de chamar getServletContext do meu serviço da Web?

Se você estiver usando o JAX-WS, poderá obter um WebServiceContext injetado:

 @Resource private WebServiceContext wsContext; 

E então pegue o ServletContext partir dele:

 ServletContext sContext= wsContext.getMessageContext() .get(MessageContext.SERVLET_CONTEXT)); 

Ao invés de

 InputStream fstream = this.getClass().getResourceAsStream("abc.txt"); 

usar

 InputStream fstream = this.getClass().getClassLoader().getResourceAsStream("abc.txt"); 

Desta forma, vai olhar a partir da raiz, não do caminho da class de invocação atual

Eu acho que desta forma você pode obter o arquivo “em qualquer lugar” (incluindo locais do servidor) e você não precisa se preocupar com onde colocá-lo.

Geralmente é uma má prática ter que se preocupar com essas coisas.

 Thread.currentThread().getContextClassLoader().getResourceAsStream("abc.properties"); 

Não sei se isso se aplica ao JAX-WS, mas, para o JAX-RS, consegui acessar um arquivo injetando um ServletContext e, em seguida, chamando getResourceAsStream ():

 @Context ServletContext servletContext; ... InputStream is = servletContext.getResourceAsStream("/WEB-INF/test_model.js"); 

Note que, pelo menos no GlassFish 3.1, o caminho tinha que ser absoluto, ou seja, começar com barra. Mais aqui: Como eu uso um arquivo de propriedades com o jax-rs?

Eu tive o mesmo problema quando mudei do Websphere 8.5 para o WebSphere Liberty.

Eu FileInputStream vez de getResourceAsStream() porque, por alguma razão, o WebSphere Liberty não pode localizar o arquivo na pasta WEB-INF .

O roteiro foi:

 FileInputStream fis = new FileInputStream(getServletContext().getRealPath("/") + "\WEBINF\properties\myProperties.properties") 

Nota: usei este script apenas para desenvolvimento.

Eu tive um problema semelhante e procurei a solução por um bom tempo: parece que o parâmetro string é sensível a maiúsculas e minúsculas. Portanto, se o nome do arquivo for abc.TXT, mas você procurar por abc.txt, o eclipse o encontrará – o arquivo JAR executável não será.