Bonjour,
Je cherche à récupérer l'url courante d'un projet en java mais cela me met un / avant le C:
Or moi je ne veux pas du /
Voici comment je fait:
Code:CodeSource codeSource = this.getClass().getProtectionDomain().getCodeSource();
Version imprimable
Bonjour,
Je cherche à récupérer l'url courante d'un projet en java mais cela me met un / avant le C:
Or moi je ne veux pas du /
Voici comment je fait:
Code:CodeSource codeSource = this.getClass().getProtectionDomain().getCodeSource();
Une URL a toujours un format bien précis. Si tu retires le / en début, tu aura une url invalide. Et pourquoi tu as besoin de cette url ?
Pour la passer à une classe incluse dans un jar qui est appelée dans mon application pour qu'elle puisse charger un fichier qui se trouve dans le projet.
Normalement, une url ne commence jamais par /C:/... mais par C:/...
Je ne sais pas d'où tu tiens cette idée, mais les url de fichiers locaux en java ont la forme file:/path/to/file
Ensuite, de toutes façons, ça ne devrait pas te concerner, tu n'a pas besoin de sortir le chemin de l'url pour construire un chemin vers un autre fichier, tu peux faire:
De plus, ce n'est pas comme ça que l'on accède à des ressoures d'un projet, un utilise la méthode getResource() qui permet de tenir compte de la complexité du classloader. Avec getProtectionDomain() tu pourrais avoir des surprises suivant la construction de ton projet.Code:
1
2 url = new java.net.URL(getClass().getProtectionDomain().getCodeSource().getLocation(),"blabla.txt");
Code:url = getClass().getResource("blabla.txt")
ou getResoureAsStream()Code:url = getClass().getResource("/com/company/monprojet/blabla.txt")
Code:url = getClass().getResource("blabla.txt")
Code:url = getClass().getResource("/com/company/monprojet/blabla.txt")
Sauf si je fais un getRessource depuis ma classe qui doit appeler le fichier, elle ne le trouve pas car elle cherche dans le jar et non dans le projet dans lequel elle est appelée.
Ton programme ne devrait pas dépendre de fichiers se trouvant dans le projet mais en dehors du classpath. Ces fichiers n'existeront plus une fois que ton programme sera distribué.
Je récupère l'url pour ensuite la mettre dans ce bout de code qui se trouve dans le jar appelé dans l'application :
Et ça me dit que inStream est null du coup alors que je passe bien l'url sous la forme /C:/...Code:
1
2
3
4
5
6
7
8
9 Properties properties = new Properties(); InputStream inStream = RecupererValueProperty.class.getResourceAsStream(url); System.out.println("url : "+url); System.out.println("InputStream : "+inStream); try { properties.load(inStream); } catch (IOException e) { e.printStackTrace(); }
class.getResourceAsStream ne charge QUE dans le classloader et la string à passer est le path relatif à la classe ou, si il commence par un /, relatif au classloader. A noter si tu as un doute que le classloader n'est pas limité au jar mais inclut toutes les classes / ressources de l'application.
Là, je t'avoues que je suis un peu perdu. Je dois faire comment pour charger mon fichier qui se trouve dans mon application depuis la classe qui se trouve dans mon jar et que j'appelle dans mon application
Le jar et ton application ne forment qu'un seul classpath. Si tu mets le fichier dans com/company/fichier.properties tu peux le charger depuis le jar avec getClass ().getResourceAsStream("/com/company/fichier.properties")
Le fichier n'est pas dans le jar.
C'est une application web : le fichier est dans WEB-INF et le jar dans le lib de tomcat.
Soit tu transfères ton fichier dans web-inf/classes soit tu revois ton design pour que ton jar prenne une url et tu utilises dans ton application le servletcontext pour créer cette url. Dans tous les cas tu ne touches pas au protectiondomain dans une webapp.
Mon fichier est déjà dans le dossier classes de web-inf.
Mais en cherchant sur le net, j'ai vu que depuis une classe se trouvant dans un jar qui est appelé dans une application on ne peut pas appeler de fichier
Si tu peux. Web-inf/classes et web-inf/lib forment un seul classpath
Non, le jar n'est pas dans web-inf/lib mais dans le dossier lib du serveur TOMCAT
Wow, pourquoi t'as été mettre un jar à cet endroit là ? Une raison particulière? Pour dire les choses simplement, les jar dans le dossier tomcat/lib n'ont pas et ne devraient pas avoir besoin d'accéder au contenu d'un webapp. Ils font des choses qui ne concernent pas les webapp.
Car je l'utilise dans plusieurs applications
Ce n'est pas une raison suffisante. Si plusieurs applications l'utilisent, elles doivent l'embarquer chacune dans WEB-INF/lib. Ce qu'on met dans le tomcat/lib influence le coeur de fonctionnement de tomcat, on n'y met rien qui concerne les webapp, seulement ce qui concerne des modifications de la logique de fonctionnement de tomcat. Comme des valves par exemple.