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

Java Discussion :

jar, classpath et librairies


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut jar, classpath et librairies
    Salut,

    Tout d'abord, voici ce que je voudrais : une application à laquelle on puisse rajouter des librairies simplement en mettant le .jar dans le répertoire lib. En effet, l'application supportera des plugins, et les plugins auront éventuellement besoin de librairies.

    Ma première idée était donc dans l'attribut "Class-Path" du manifest du jar exécutable de définir par exemple un lib/*.jar (voir ce post), ce qui apparemment n'est pas possible.

    Donc il faut définir le classpath à l'exécution dans la ligne de commande.

    Sauf qu'on ne connaît pas forcément à l'avance toutes les librairies utilisées (les plugins pourront éventuellement en rajouter).
    Au départ je pensais qu'il n'y avait pas de problème, il suffit de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java -cp .:monjar.jar:lib/*.jar monpackage.monsouspackage.MainClass
    D'ailleurs j'avais testé ca fonctionne très bien (je suis sous linux)...

    EDIT: en fait même sous linux s'il y a plusieurs librairies le *.jar est remplacé par "fichier1.jar fichier2.jar..." sans séparer par des ':', donc ça ne marche pas non plus... Quand j'avais testé il n'y en avait qu'une (lol)...

    Mais au travail (là où je suis en stage), ils utilisent des ordinateurs avec windows, et en programmant (quelque chose qui n'avait rien à voir), je me suis aperçu que le *.jar ne fonctionnait pas en paramètre de -cp de java... (après avoir galéré 5 minutes avant de comprendre que sous dos le séparateur des répertoires est ; et non :, enfin bref).

    Donc comment est-il possible de pouvoir rajouter des .jar dans le répertoire lib, qui soient reconnus à l'exécution sans changer les paramètres d'appels ni la variable d'environnement CLASSPATH, et que ça fonctionne sous toutes les plateformes (au moins Linux, Mac et Windows -PS: y'en a d'autres?-) ?

    Merci d'avance

  2. #2
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Le Class-Path du fichier manifest fonctionne très bien, la seule chose avec un jar, c'est qu'il ne doit pas contenir d'autres jar.
    Dans ton cas, si tu copies les jar additionnels au même endroit que le jar de ton application et que tu les références dans le fichier manifest, ça fonctionnera
    (Ai-je été assez clair ? )

    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par OButterlin
    Le Class-Path du fichier manifest fonctionne très bien, la seule chose avec un jar, c'est qu'il ne doit pas contenir d'autres jar.
    Dans ton cas, si tu copies les jar additionnels au même endroit que le jar de ton application et que tu les références dans le fichier manifest, ça fonctionnera
    (Ai-je été assez clair ? )

    A+
    Oui, il marche très bien dans la mesure où tu écris le nom de tous tes .jar:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <attribute name="Class-Path" value=". ${lib.dir}/Trendy_1.8.jar ${lib.dir}/jawin.jar ${lib.dir}/xpp3_min-1.1.3.4.O.jar ${lib.dir}/xstream-1.2.1.jar" />
    Mais si tu ne sais pas forcément le noms de tous les .jar (car certains peuvent être rajoutés), tu ne peux pas écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <attribute name="Class-Path" value=". ${lib.dir}/**.jar" />

  4. #4
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    D'accord, je n'avais pas compris le fond de ton problème...
    Une bidouille peut-être :
    Si tout est en locale, tu pourrais passer par une fonction intermédiaire qui liste les jar et construit la commande (pour la lancer via Runtime.getRuntime().exec(...)) à moins qu'on puisse directement changer le class-path de la jvm en cours (je ne sais pas)
    Je te l'accorde, c'est de la pure bouze...

    Sinon, tu pourrais peut-être faire un générateur de manifest (c'est quand même mieux par ce fichier...)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par OButterlin
    Sinon, tu pourrais peut-être faire un générateur de manifest (c'est quand même mieux par ce fichier...)
    L'application supportera des plugins, et certaines librairies pourront être ajoutées pour que les plugins fonctionnent.
    Par exemple si on rajoute un plugin qui envoie un mail (juste pour l'exemple), il faudra rajouter javamail.jar dans le répertoire lib... et dans le classpath...
    Sauf que quand on ajoute un plugin je ne veux pas qu'on ai besoin de modifier le jar (manifest) ni la ligne de commande...

  6. #6
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    J'ai du mal à comprendre ce que tu cherches à faire...
    Ton application a des plugins ok, mais à un moment donné, tu les interfaces avec ton application non ? Alors où est le problème de rajouter dans le class-path ?
    Tu ne charges pas tes plugins dynamiquement quand même... si ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Il est possible de charger des jars via un URLClassLoader.
    Un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public void loadJars(File[] jars) {
        URL[] urls = new URL[jars.length];
        for(int i = 0; i < jars.length; i ++) {
            try {
                urls[i] = jars[i].toURI().toURL();
            } catch(MalformedURLException ex) {
                ex.printStackTrace();
            }
        }
        ClassLoader cl = new URLClassLoader(urls, getClass().getClassLoader());
    }
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

Discussions similaires

  1. [jar] inclure des librairie externe
    Par Grummfy dans le forum Eclipse Java
    Réponses: 6
    Dernier message: 13/12/2005, 13h41
  2. [JAR]Intégrer des librairies Jar et Zip dans un seul jar
    Par tomca dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 03/11/2005, 14h22
  3. [JAR] Inclure une librairie dans un point jar
    Par Orionmel dans le forum Général Java
    Réponses: 5
    Dernier message: 08/11/2004, 22h25
  4. [Jar][Classpath]Pb chargement resource classpath dans un jar
    Par Pill_S dans le forum Général Java
    Réponses: 20
    Dernier message: 01/10/2004, 20h12
  5. [JAR] Créer sa librairie
    Par Dokho1000 dans le forum Général Java
    Réponses: 10
    Dernier message: 26/09/2004, 00h37

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