IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

user.dir et linux


Sujet :

avec Java

  1. #1
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 127
    Par défaut user.dir et linux
    Bonjour,

    je crois que sur linux l'expression
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.getProperty("user.dir")
    ne fonctionne pas (ou ne revoie pas ce qu'il faudrait). Je m'en servait beaucoup pour indiquer des chemins relatifs. Existe-t-il une expression plus portable que celle-ci ?

    J'ai beaucoup de .jar qui se lancent mutuellement ou utilisent des ressources situés dans d'autre jars. Et c'est pour cela que j'ai besoin de dire : "Je pars du dossier du jar actuel, je rentre dans le sous dossier bin et je prend tel fichier" ou "je lance le logiciel2.jar situé dans le même dossier que le .jar actuel" etc...
    Cette solution avec "user.dir" me convenait très bien, dommage quelle ne soit pas portable.

    Question annexe: sous mac OS, "user.dir" fonctionne-t-il ?

  2. #2
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Bah user.dir renvoie les répertoire depuis lequel l'appli a été lancée. Donc ce n'est absolument pas fiable comme propriété pour ce que tu veux faire.


    Mais bon ça fait un poil bricolage de lancer une application java à partir d'une autre appli java en utilisant le ligne de commande. Tu pourrais tout orchestrer directement en java, le tout de façon beaucoup plus propre.

    Par exemple tu places tes deux jar dans ton classpath, tu crées une classe dont le rôle est d'instancier les classes de lancement de tes deux applis (et puis ça te fait sauter des main inutiles, c'est pas mal non plus).

    Pour les ressources, il en est de même. Tu ajoutes tes jars au classpath et tu utilises monObjet.getClass().getRessource("/chemin/dans/le/classpath/monIcone.png") qui te renvoie l'URL relative de ta ressource.

    Dans ton cas j'aurais plutôt tendance à dire qu'il y a un gros problème de design et d'archi avant tout, toutes ces dépendances non liées dans le classpath, ces lancement de process java à qui mieux mieux, il y a de quoi péter un cable.


    Sinon tu peux toujours également essayer de voire ce que te renvoie un new File(".");

  3. #3
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Citation Envoyé par sinok Voir le message
    Bah user.dir renvoie les répertoire depuis lequel l'appli a été lancée. Donc ce n'est absolument pas fiable comme propriété pour ce que tu veux faire.
    +1

    Sous Windows lorsqu'on fait un raccourci ce répertoire de travail est généralement initialisé au répertoire de la cible (mais cela peut être modifié).

    Sinon lorsqu'on appelle le programme depuis une console cela correspond au répertoire courant...


    "user.dir" fonctionne, mais il ne fait pas ce que tu penses : cela ne correspond pas au répertoire de ton application, mais au répertoire courant de l'utilisateur !


    Citation Envoyé par sinok Voir le message
    Sinon tu peux toujours également essayer de voire ce que te renvoie un new File(".");
    Cela te retournera la même chose que l'user.dir, c'est à dire le répertoire de travail...



    En fait il faudrait savoir ce que tu veux précisément :
    Si tu as simplement besoin d'accéder à des ressources dans les autres jar, il serait préférable de renseigner le ClassPath et d'utiliser l'accès aux ressources indiqué par sinok.
    Si tu as besoin d'exécuter des jars indépendamment, et donc de récupérer leurs chemins complet, la meilleure solution serait de passer par le ClassLoader pour récupérer cette info :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    	public static File getClassRootDirectory(Class<?> clazz) throws URISyntaxException {
    		final String resName = "/" + clazz.getName().replace('.', '/') + ".class";
    		final String url = clazz.getResource(resName).toString();
     
     
    		if (url.startsWith("file:")) {
    			// Cas d'un fichier simple
    			// On récupère le répertoire de base :
    			int index = url.lastIndexOf(resName);
    			if (index>=5) {
    				System.err.println(url.substring(5, index+1));
    				return new File(url.substring(5, index+1));
    			}
    		} else if (url.startsWith("jar:file:")) {
    			// Cas d'une archive JAR/ZIP
    			// On récupère le fichier compréssé :
    			int index = url.lastIndexOf('!');
    			if (index>=9) {
    				return new File(url.substring(9, index)).getParentFile();
    			}
    		}
    		// On ne gère pas tous les autres cas :
    		throw new IllegalStateException("Unsupported URL : " + url);
    	}
    En lui passant en paramètre une classe appartenant au jar en question.

    Par contre cela dépend fortement de la manière dont tu lances ton programme, et je doute que cela fonctionne avec des applications Java Web Start ou autre...


    a++

  4. #4
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 127
    Par défaut
    Citation Envoyé par sinok Voir le message
    Bah user.dir renvoie les répertoire depuis lequel l'appli a été lancée. Donc ce n'est absolument pas fiable comme propriété pour ce que tu veux faire.


    Mais bon ça fait un poil bricolage de lancer une application java à partir d'une autre appli java en utilisant le ligne de commande. Tu pourrais tout orchestrer directement en java, le tout de façon beaucoup plus propre.

    Par exemple tu places tes deux jar dans ton classpath, tu crées une classe dont le rôle est d'instancier les classes de lancement de tes deux applis (et puis ça te fait sauter des main inutiles, c'est pas mal non plus).

    Pour les ressources, il en est de même. Tu ajoutes tes jars au classpath et tu utilises monObjet.getClass().getRessource("/chemin/dans/le/classpath/monIcone.png") qui te renvoie l'URL relative de ta ressource.

    Dans ton cas j'aurais plutôt tendance à dire qu'il y a un gros problème de design et d'archi avant tout, toutes ces dépendances non liées dans le classpath, ces lancement de process java à qui mieux mieux, il y a de quoi péter un cable.
    En fait, pour les ressources, il s'agit d'un problème de plugin et j'ai crée une classloader que je trouvais pas dégeu (enfin à mon niveau bien sûr)

    Cela dit quand à la critique dans la globalité, je me rends bien compte que tu as raison, je vais essayer de revoir tout ça...

    Merci bien.

  5. #5
    lvr
    lvr est déconnecté
    Membre éclairé Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    919
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 919
    Par défaut
    Si tu as besoin (...)de récupérer leurs chemins complet, la meilleure solution serait de passer par le ClassLoader pour récupérer cette info :
    Ce code marche nickel pour moi. Que je lance mon application via l'IDE, via un jar exécutable, ou via un jar servant de plugin à une autre application, je retrouve toujours mes petits.
    Par contre, je travail toujours en local pas testé des modes comme WebStart.

Discussions similaires

  1. Réponses: 5
    Dernier message: 22/01/2010, 12h56
  2. probléme avec System.getProperty("user.dir" ))
    Par aitbouhou dans le forum Général Java
    Réponses: 1
    Dernier message: 14/02/2009, 13h01
  3. user.dir et raccourcis
    Par metaska dans le forum Langage
    Réponses: 2
    Dernier message: 03/11/2008, 08h32
  4. Problème d'accès NFS du même user sur plusieurs LINUX
    Par KiKiTiTi dans le forum Administration système
    Réponses: 2
    Dernier message: 12/10/2008, 22h57
  5. configuration du user dir
    Par john123 dans le forum Apache
    Réponses: 2
    Dernier message: 07/07/2008, 08h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo