racine pour les chemin d'accès de fichiers

racine pour les chemin d'accès de fichiers - Java - Programmation

Marsh Posté le 03-07-2009 à 14:58:35    

Bonjour,
 
Le problème
Je vous expose un problème assez courant:
Je développe une appli J2EE et lorsque je déploie, j'ai des soucis car la racine pour les chemins d'accès aux fichiers diffère selon que je suis en train de développer sous eclipse ou que je déploie l'appli.
 
en clair, si je fais:

Code :
  1. File f=new File("." );


mon File ne pointera pas au même endroit si j'exécute à partir d'eclipse que si je déploie sur le serveur d'appli. Or, je ne peux pas me permettre de mettre des chemins absolus.
 
Le besoin
Je veux donc mettre à disposition quelque part dans mon code une méthode qui me retourne le chemin d'accès de la racine de mon projet, disons le chemin d'accès du répertoire WEB-INF par exemple et ceci, quelque soit le contexte d'exécution de mon appli. J'ai bien des solutions mais plus moches les unes que les autres.
Une fois que j'aurais le chemin d'accès du dossier WEB-INF, il me suffira de définir tous mes chemins d'accès en relatif par rapport à ce dossier.
 
solution 1
dans une de mes classes, je fais un new File("." ) et je remonte l'arborescence jusqu'à avoir un répertoire ayant pour nom "WEB-INF"
 
solution 2
je me sers du ClassLoader

Code :
  1. MaClass.class.getClassLoader().getResource("package/sousPkg/MaClass.class" )


et je sais que ça va me faire pointer dans tous les cas sur WEB-INF/classes/package/sousPkg/MaClass.class
Je n'aurais donc plus qu'à remonter de 3 étages pour me situer au dossier WEB-INF
 
Je voudrais savoir si vous avez des solutions plus propres à proposer, merci d'avance :)

Reply

Marsh Posté le 03-07-2009 à 14:58:35   

Reply

Marsh Posté le 03-08-2009 à 11:15:57    

J'ai finalement utilisé la deuxième méthode.
 
Je vous donne le bout de code. Il suppose que l'on est dans une classe s'appelant MyClass. Ce bout de code met un attribut public static et l'initialise statiquement.
A partir d'une autre classe, il suffit donc de taper MyClass.WEB_INF pour avoir le chemin du dossier WEB-INF
Si le dossier WEB-INF n'est pas trouvé, l'attribut vaudra null.
 
Si vous avez des suggestions pour améliorer ce bout de code ou une autre solution, je suis ouvert à toutes propositions.  
 

Code :
  1. // path to the WEB-INF directory
  2. public static String WEB_INF;
  3. /*
  4. * static initialization that retrieves the path to the WEB_INF directory
  5. * This initialization relies on the ClassLoader.
  6. * The class loader retrieves any resource, provided that it is located
  7. * into the classpath.
  8. * It is used to retrieve the .class file of this class, for which we know
  9. * that it is somewhere under WEB-INF/classes. When the path of the file is
  10. * found, we just have to go from file to parent file until a file  
  11. * named "WEB-INF" is found.
  12. */
  13. static{
  14. //className= package/subPackage/subsubPackage/../ClassName.class
  15. String className=MyClass.class.getName().replaceAll("\\.", "/" )+".class";
  16. //Use the ClassLoader to find the absolute path to this file.
  17. URL classPath=MyClass.class.getClassLoader().getResource(className);
  18. //create a new File and go from file to parent file to find the
  19. //WEB-INF directory
  20. File f=new File(classPath.getPath());
  21. while(f!=null && !f.getName().equals("WEB-INF" )){
  22.  f=f.getParentFile();
  23. }
  24. //if the root is reached without finding the WEB-INF directory
  25. //WEB-INF will equal null
  26. if(f==null)
  27.  logger.warn("Unable to locate WEB-INF directory" );
  28. else
  29.  WEB_INF=f.getPath();
  30. }

Reply

Marsh Posté le 03-08-2009 à 11:52:23    

ouch... c'est pas très sexy (pour pas dire que c'est vomitif)...  
 
je crois que n'utilise pas très bien le getresource:
http://www.siteduzero.com/forum-83 [...] ource.html
 
dedans tu mets direct ton fichier, dans une arborescence relative à ton classpath...

Reply

Marsh Posté le 03-08-2009 à 18:46:41    

Oh la la, overkill. :\
 
1. Si tu ne pointes pas vers le même répertoire sous Eclipse et en déployant autrement, so what? Ce sont deux environnements différents.
 
2. De toute façon, rien ne dit que "." soit une bonne valeur même en production. Il est peut-être souhaitable de paramétrer le répertoire de destination selon de le déploiement.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 04-08-2009 à 10:56:18    

pataluc a écrit :

ouch... c'est pas très sexy (pour pas dire que c'est vomitif)...  
 
je crois que n'utilise pas très bien le getresource:
http://www.siteduzero.com/forum-83 [...] ource.html
 
dedans tu mets direct ton fichier, dans une arborescence relative à ton classpath...


 
Je ne vois pas en quoi l'utilisation du getResource() est mauvaise. Je l'utilise pour récupérer le chemin d'accès de mon .class (qui se trouve bien dans le classpath par définition) et à partir de là, remonter jusqu'au WEB-INF.
 
Ceci me permet ensuite d'avoir une variable "WEB_INF" qui contient le chemin d'accès du répertoire WEB-INF et de décrire ensuite mes chemins de fichiers relativement au WEB_INF.
 
du coup, pour tous mes chemins d'accès, je n'ai plus qu'à faire WEB_INF+"/truc/machin" et je sais que je n'ai pas à me prendre la tête sur la racine pour les chemins d'accès aux fichiers.
 
Je pourrais certes mettre les fichiers auxquels je veux accéder dans mon classpath, mais le but est de ne pas etre obligé de faire cette manipulation pour chaque fichier auquel je souhaite accéder.
 
Pourrais tu éclaircir stp?

Reply

Marsh Posté le 04-08-2009 à 11:05:56    

ben je sais pas, t'as regardé le lien que j'ai mis? dans le post http://www.siteduzero.com/forum-83 [...] l#r3874270 la manière de faire reviens au même que la tienne, en plus classe.
 
ou alors il faut passer par des fichiers de config, qui seront paramétrés en fonction de ton env de dev ou de prod, mais la c'est vraiment pas top je trouve... au niveau propreté et maintenabilité du code c'est beurk.

Reply

Marsh Posté le 05-08-2009 à 15:45:43    

Je suis pas sûr que tu abordes le problème de la bonne façon. Tu as besoin de quoi ? Lire des fichiers contenus dans ton application ? Est-ce que tu as vraiment besoin d'un chemin sur le filesystem (qui pourra très bien ne pas exister si ton application est un jour déployée sous forme d'un fichier war non décompressé) ?
 
Si c'est juste pour pouvoir lire des fichiers placés dans WEB-INF, la meilleure solution, c'est ServletContext.getResource() ou getResourceAsStream() Ces méthodes retournent respectivement un objet URL et InputStream, à voir si ça suffit ou si tu as vraiment besoin d'un File.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed