J'ai la structure suivante dans une application Web Java Web:
TheProject
-- [Web Pages]
-- -- [WEB-INF]
-- -- -- abc.txt
-- -- index.jsp
-- [Source Packages]
-- -- [wservices]
-- -- -- WS.Java
Dans WS.Java
, J'utilise le code suivant dans une méthode Web:
InputStream fstream = this.getClass().getResourceAsStream("abc.txt");
Mais il renvoie toujours une valeur nulle. J'ai besoin de lire ce fichier, et je lis que si vous mettez les fichiers dans WEB-INF
, vous pouvez y accéder avec getResourceAsStream
, mais la méthode renvoie toujours un null
.
Des idées de ce que je fais peut-être mal?
Btw, la chose étrange est que cela fonctionnait, mais après avoir effectué un Clean and Build
sur le projet, il a soudainement cessé de fonctionner: /
À ma connaissance, le fichier doit se trouver directement dans le dossier où le 'this'
la classe réside, c'est-à-dire pas dans WEB-INF/classes
mais imbriqué encore plus profondément (sauf si vous écrivez dans un package par défaut):
net/domain/pkg1/MyClass.Java
net/domain/pkg1/abc.txt
Mettre le fichier dans vos Java devraient fonctionner, le compilateur copie ce fichier avec les fichiers de classe.
Un appel à Class#getResourceAsStream(String)
délègue au chargeur de classe et la ressource est recherchée dans le chemin de classe. En d'autres termes, votre code actuel ne fonctionnera pas et vous devriez mettre abc.txt
Dans WEB-INF/classes
, Ou dans WEB-INF/lib
S'il est emballé dans un fichier jar.
Ou utilisez ServletContext.getResourceAsStream(String)
qui permet aux conteneurs de servlet de mettre une ressource à la disposition d'une servlet depuis n'importe quel endroit, sans utiliser de chargeur de classe. Utilisez donc ceci à partir d'un servlet:
this.getServletContext().getResourceAsStream("/WEB-INF/abc.txt") ;
Mais existe-t-il un moyen d'appeler getServletContext à partir de mon service Web?
Si vous utilisez JAX-WS, vous pouvez obtenir un WebServiceContext
injecté:
@Resource
private WebServiceContext wsContext;
Et puis récupérez le ServletContext
:
ServletContext sContext= wsContext.getMessageContext()
.get(MessageContext.SERVLET_CONTEXT));
Au lieu de
InputStream fstream = this.getClass().getResourceAsStream("abc.txt");
utilisation
InputStream fstream = this.getClass().getClassLoader().getResourceAsStream("abc.txt");
De cette façon, il regardera depuis la racine, pas depuis le chemin de la classe invoquante actuelle
Je pense que de cette façon, vous pouvez obtenir le fichier de "n'importe où" (y compris les emplacements de serveur) et vous n'avez pas besoin de vous soucier de l'endroit où le mettre.
C'est généralement une mauvaise pratique d'avoir à se soucier de telles choses.
Thread.currentThread().getContextClassLoader().getResourceAsStream("abc.properties");
Je ne sais pas si cela s'applique à JAX-WS, mais pour JAX-RS, j'ai pu accéder à un fichier en injectant un ServletContext puis en appelant getResourceAsStream () dessus:
@Context ServletContext servletContext;
...
InputStream is = servletContext.getResourceAsStream("/WEB-INF/test_model.js");
Notez que, au moins dans GlassFish 3.1, le chemin devait être absolu, c'est-à-dire commencer par une barre oblique. Plus ici: Comment utiliser un fichier de propriétés avec jax-rs?
J'ai eu le même problème lorsque je suis passé de Websphere 8.5 à WebSphere Liberty.
J'ai utilisé FileInputStream
au lieu de getResourceAsStream()
, car pour une raison quelconque, WebSphere Liberty ne peut pas localiser le fichier dans le WEB-INF
dossier.
Le script était:
FileInputStream fis = new FileInputStream(getServletContext().getRealPath("/")
+ "\WEBINF\properties\myProperties.properties")
Remarque: J'ai utilisé ce script uniquement pour le développement.
J'ai eu un problème similaire et j'ai cherché la solution pendant un bon moment: il semble que le paramètre de chaîne soit sensible à la casse. Donc, si votre nom de fichier est abc.TXT mais que vous recherchez abc.txt, Eclipse le trouvera - le fichier JAR exécutable ne le fera pas.