2012-03-19 6 views
2

Je construis un WAR/EAR et un de mes composants lit dans de nombreux fichiers de configuration personnalisée à l'aide de fichiers IO:Comment ouvrir un fichier de ressources dans un fichier WAR en utilisant un chemin d'accès?

Reader reader = new BufferedReader(new FileReader(path)); 

Le chemin ci-dessus est une chaîne qui est passé comme une propriété à cette classe par printemps fichier ApplicationContext.xml.

Quelle chaîne de caractères dois-je spécifier si je veux mettre tous ces fichiers de configuration dans un fichier WAR? Est-ce faisable? Ou est le composant incorrect et devrait utiliser getResourceAsStream() à la place? J'ai parcouru et trouvé beaucoup d'informations sur getResource() et URI. Cependant, je n'ai pas pu trouver s'il est possible de créer le bon chemin de fichier vers une ressource à l'intérieur applicationContext.xml

Répondre

5

Dans l'environnement de printemps, il est préférable d'utiliser spring resources API Exemple simple:

@Inject 
private ResourceLoader resourceLoader; 

public void someMethod() { 
    Resource resource = resourceLoader.getResource("file:my-file.xml"); 
    InputStream is = null; 
    try { 
     is = resource.getInputStream(); 
     // do work 
     .... 
    } finally { 
     IOUtils.closeQuetly(is); 
    } 
} 

Si vous souhaitez accéder à des fichiers externes (ressources non classpath, qui devrait se trouver dans META-INF/ressources dans l'archive) avec des chemins non fixes, vous devez placer ces chemins dans le fichier de propriétés principal et le charger sur le déploiement de l'application.

modifier: modifier @Resource à @Inject dans l'exemple

3

La clé pour accéder aux fichiers est de les rendre disponibles dans votre classpath. Par défaut dans un fichier WAR, tous les fichiers sous WEB-INF/classes sont ajoutés au chemin de classe et vous pouvez référencer ces fichiers.

Par exemple: permet d'assumer c'est la structure de votre fichier WAR

webapp.war 
| 
|---> WEB-INF 
|------| 
|  |----> classes 
|    |----> MyResource.properties 
|---> index.html 
|---> images 
|-------| 
|  ----> logo.gif 

Vous pouvez accéder à votre "MyResource.properties" en utilisant l'API suivante

Reader reader = new BufferedReader(new FileReader("MyResource.properties")); 

Hope this helps.

Bonne chance!

+1

Le fait d'avoir des ressources de fichiers dans votre chemin de classe facilite l'accès. Mais il existe une autre possibilité, comme décrit dans la réponse à cette [question] (http://stackoverflow.com/questions/9618483/relative-views-in-view-states-within-a-flow-that-is-loaded- from-a-jar-file). L '[API servlet] (https://tomcat.apache.org/tomcat-7.0-doc/servletapi/javax/servlet/ServletContext.html#getResource (java.lang.String)) décrit où ces ressources doivent être localisées. Fondamentalement votre WAR devrait contenir un dossier ** META-INF/resources **, où vos fichiers, qui ne devraient pas être dans le classpath, doivent être placés. – Markus

+0

Cette réponse ne fonctionne pas pour moi. Je reçois un 'IOException' parce que le fichier est introuvable. En outre, j'ai vu le commentaire suivant: «Par défaut, les classes du package java.io résolvent toujours les chemins d'accès relatifs par rapport au répertoire utilisateur en cours.Ce répertoire est nommé par la propriété système user.dir et est généralement le répertoire dans lequel Java machine virtuelle a été appelée. " à [java.io.File javadoc] (http://docs.oracle.com/javase/6/docs/api/java/io/File.html) –

+0

Selon le printemps, vous devez spécifier la ressource en utilisant "classpath: MyResource.properties ". Vous pouvez trouver la référence ici http://static.springsource.org/spring/docs/2.0.x/reference/resources.html – uaarkoti

Questions connexes