9
votes

GetSystemresourceastream () retourne null

hiiii ... Je souhaite obtenir le contenu du fichier de propriétés dans l'objet Classe InputStream à l'aide de GetSystemResourceeStream (). J'ai construit le code d'échantillon. Il fonctionne bien en utilisant la méthode principale (), mais lorsque je déploierai le projet et exécuté sur le serveur, le chemin du fichier de propriétés ne peut pas obtenu ... SO INPUTSTREAM Object Store Null Valeur.

échantillon code est là .. < Pré> xxx


2 commentaires

Pourquoi utilisez-vous à l'aide du chargeur de classe système plutôt que la normale?


Remarque: AS de Java9 + le chargeur de système de système PKA Le chargeur de classes d'application est le «normal», c'est-à-dire le petit-enfant du chargeur de classe Bootstrap et de l'enfant du chargeur de classe de plate-forme, voir la réponse acceptée à Stackoverflow.com/questions/46494112/...


3 Réponses :


0
votes

Essayez d'utiliser getresourceastream () au lieu de getSystemresourceastream () .


2 commentaires

1) méfiez-vous de l'appelant class.getresourceastream (nom) directement sur la classe Classe - il achète nom avec le chemin de la classe à l'instance de classe que vous appelé ça sur. 2) appeler this.getclass (). GetClassloader (). GetResourceastream (nom) et classloader.getsystemresourceastream (nom) sont presque toujours équivalents. Ils commencent avec le chargeur de classes système, à la fois par classloader.getresource (nom) où il délégués récursives via la plate-forme et les chargeurs de chargeur de démarrage pour la résolution, puis essayez le chargeur de classes système à la fin, où il est presque toujours trouvera votre ressource.


Je dis "presque toujours équivalent" dans le commentaire ci-dessus parce qu'il est fort probable que this.getclass (). GetClassloader () retournera une instance de jdk.internal.loader.classloader $ AppClassLoader (chargeur de classes système)



7
votes

Le SystemClassloader CODE> Charge des ressources de java.class.Path code> Cartes de sorcière à la variable système classpath code>. Dans votre application locale, vous avez probablement la ressource que vous essayez de charger configuré dans java.class.path code> variable. Sur le serveur, c'est une autre histoire car probablement le serveur charge vos ressources à partir d'un autre chargeur de classe.

Essayez d'utiliser le chargeur de classes code> Cette classe chargée à l'aide du chemin correct: P>

getClass().getResourceAsStream(fileName);


1 commentaires

getclass (). GetResourceastream ("Input.Properties"); travaillé pour moi. La ressource est sur le même répertoire de la classe la utilise



16
votes

je déploie le projet et exécuté sur le serveur,

Ceci ressemble à une application Web JSP / servlet. Dans ce cas, vous devez utiliser le chargeur qui est obtenu comme suit: xxx

celui-ci a accès au tout Les chemins de classe de classe liés à la webapplication en question et que vous n'êtes plus dépendant du chargeur de classes parent (une webApp en a plus d'un!) a chargé votre classe.

Puis, sur ce chargeur de classe, vous avez besoin de Il suffit d'appeler GetResourceastream () Pour obtenir une ressource de classe de classe en tant que flux, pas le getSystemresourceastream () qui dépend de la manière dont la liste web est démarrée. Vous ne voulez pas dépendre de cela aussi, car vous n'avez pas de contrôle sur celui-ci à l'hébergement externe: xxx

Ceci est finalement plus robuste que votre initiale getSystemresourceastream () approche et la classe # getresourceastream () comme suggéré par d'autres.


0 commentaires