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

Langage Java Discussion :

Résolution des priorités du Classpath avec un jar exécutable


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 28
    Par défaut Résolution des priorités du Classpath avec un jar exécutable
    Bonsoir tout le monde,

    Voici ma question. J'ai créé un jar executable pour mon appli structurée de la facon suivante :

    rootFolder/
    - conf/
    -- my.properties
    - script/
    -- theJar.jar (contenant myOther.properties)
    - lib/
    -- mylibs.jar (...)

    J'ai écrit le MANIFEST comme ceci :
    (..)
    Main-Class : com.my.MainClass
    Classpath : ../conf/ ../lib/mylib1.jar ../lib/mylib2.jar...
    (..)

    Quand j'execute mon jar avec "java -jar theJar.jar", les propriétés utilisées sont celles situées dans le jar "myOther.properties" (packagées avec Maven). Mais je voudrais que mon jar utilise celles situées dans le répertoire supérieur "conf" (créé avec Maven assembly).
    J'ai réussi en utilisant la ligne de commande : "java -cp conf/;lib/;script/theJar.jar com.my.MainClass".

    Donc, quel est le mécanisme qui permet à la JVM de définir les priorités dans le classpath? Pourquoi la commande "-cp" n'utilise pas le manifest? Et comment faire en sorte qu'avec le manifest et "java -jar", je puisse utiliser les propriétés du répertoire "conf" en priorité par rapport à celle dans le jar?

    Merci pour vos éclairages!

  2. #2
    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
    Citation Envoyé par memel182 Voir le message
    Donc, quel est le mécanisme qui permet à la JVM de définir les priorités dans le classpath?
    Avec -jar le classpath est composé des éléments suivant :
    • Le jar principal de l'application.
    • Tous les éléments spécifiés par l'attribut Class-Path du manifest, dans l'ordre dans lequel ils sont déclarés...


    Avec -cp, le classpath correspond tout simplement à celui que tu indiques, dans l'ordre de déclaration.


    Citation Envoyé par memel182 Voir le message
    Pourquoi la commande "-cp" n'utilise pas le manifest?
    Parce qu'il n'y a pas de notion de jar principale.
    Tu spécifies le classpath et un classe principale donc tu remplaces le manifest en quelque sorte...

    Citation Envoyé par memel182 Voir le message
    Et comment faire en sorte qu'avec le manifest et "java -jar", je puisse utiliser les propriétés du répertoire "conf" en priorité par rapport à celle dans le jar?
    Cela dépend de la manière dont tu procèdes.

    Dans ton exemple les deux fichiers properties ont des noms différents, donc cela ne devrait pas poser de problème... non ?



    a++

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 28
    Par défaut
    Bonjour et merci de ces informations.

    J'ai été un peu rapide en écrivant mon exemple, mais mes fichiers properties ont bien le même nom, d'où mon souci...

    Ai-je donc un moyen, dans ce contexte, d'utiliser "java -jar" ou dois-je simplement utiliser "java -cp" (en retirant éventuellement les infos du classpath dans le manifest pour éviter tout conflit...)?

  4. #4
    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
    Dans ce cas tu pourrait utiliser la méthode getResources() de ClassLoader qui te renverra tous les fichiers du même "nom logique" via une Enumeration.

    Il suffit de tout lire. Cela te lira le fichier dans le jar, puis éventuellement celui défini dans "conf" (ou un autre emplacement du classpath).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    	Properties conf = new Properties();
     
    	ClassLoader cl = Main.class.getClassLoader();
    	for (Enumeration<URL> e = cl.getResources("my.properties"); e.hasMoreElements() ; ) {
    		URL url = e.nextElement();
     
    		// read properties :
    		InputStream input = url.openStream();
    		try {
    			conf.load(input);
    		} finally {
    			input.close();
    		}
    	}
    Et au final tu devrais avoir un objet Properties bien propre (initialisé avec le fichier properties du jar, et éventuellement modifié par celui de "conf").



    a++

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 28
    Par défaut
    Merci pour ces informations... Je vais voir quelle solution est la plus adaptée à mon contexte.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème avec le .jar exécutable et les fichier .jrxml
    Par asma2009 dans le forum Entrée/Sortie
    Réponses: 0
    Dernier message: 23/07/2009, 11h05
  2. Problème avec un .jar exécutable
    Par neophytus dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 17/12/2008, 08h57
  3. probleme de classpath avec un jar
    Par lahoucineinfo dans le forum Langage
    Réponses: 2
    Dernier message: 12/01/2008, 13h03
  4. Ajouter des classes au ClassPath en cours d'exécution
    Par cyrille37 dans le forum Général Java
    Réponses: 1
    Dernier message: 31/10/2007, 19h17
  5. "Ouvrir avec" un Jar exécutable
    Par RisWaaq dans le forum Langage
    Réponses: 3
    Dernier message: 09/06/2006, 14h46

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