Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1379 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  racine pour les chemin d'accès de fichiers

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

racine pour les chemin d'accès de fichiers

n°1902046
liouan
Posté le 03-07-2009 à 14:58:35  profilanswer
 

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 :)

mood
Publicité
Posté le 03-07-2009 à 14:58:35  profilanswer
 

n°1911133
liouan
Posté le 03-08-2009 à 11:15:57  profilanswer
 

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. }

n°1911179
pataluc
Posté le 03-08-2009 à 11:52:23  profilanswer
 

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...

n°1911387
sircam
I Like Trains
Posté le 03-08-2009 à 18:46:41  profilanswer
 

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}
n°1911547
liouan
Posté le 04-08-2009 à 10:56:18  profilanswer
 

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?

n°1911552
pataluc
Posté le 04-08-2009 à 11:05:56  profilanswer
 

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.

n°1912004
Riokmij
Blink and you're dead
Posté le 05-08-2009 à 15:45:43  profilanswer
 

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.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  racine pour les chemin d'accès de fichiers

 

Sujets relatifs
ACCESS Chemin d'accès d'une table attachéscript de remplacement de fichiers
Comparer valeurs de 3 fichiers et en afficher le resultatFichiers requis LibUSB
acces base de donnée via appletprobléme de numerotation des fichiers lors du download
[VBS][RESOLU][SCRIPT]Script de suppression de fichiers temporairesMacro : Chercher les bons fichiers de liaisons.
Tableaux - Fichiers - Fonctions - Procédures 
Plus de sujets relatifs à : racine pour les chemin d'accès de fichiers


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR