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

Eclipse Java Discussion :

[Débutant] Problème de Build Path dans Eclipse


Sujet :

Eclipse Java

  1. #1
    Invité
    Invité(e)
    Par défaut [Résolu][Débutant] Problème de Build Path dans Eclipse
    Bonjour,

    J'ai donc un problème avec l'utilisation des Build Path dans Eclipse. Il s'agit d'une petite application que l'on m'a donné à faire (dans le cadre d'un TP). On nous a donné des classes et nous devons les utiliser afin de faire une petite application sur la Programmation Concurrente.

    Le problème est que Eclipse trouve une erreur de ce type : "The type Observateur cannot be resolved. It is indirectly referenced from required .class files" dans le code suivant :

    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
    import ProdCons.se_lib.Acteur;
    import ProdCons.se_lib.Observateur;
     
    public class Producteur extends Acteur{
     
    	/**
             * Nombre de message à envoyer par le producteur.
             */
    	private int nombreMsg; 
     
    	/**
             * Constructeur d'un Producteur.
             * @param nombreMsg le nombre de message qu'il va pouvoir créer.
             * @param observateur l'observateur à qui rendre compte.
             * @param moyenneTempsDeTraitement le temps moyen de traitement d'un message.
             * @param ecartType  l'ecart type du temps moyen de traitement.
             */
    	public Producteur(int nombreMsg, Observateur observateur, int moyenneTempsDeTraitement, int ecartType){
    		new Acteur(Acteur.typeProducteur, observateur, moyenneTempsDeTraitement, ecartType);
    		this.nombreMsg = nombreMsg;
    		start();
    	}
    }

    L'erreur se trouve dans la définition du constructeur Producteur (càd public Producteur...). Eclipse souligne la ligne complète...

    Ce qui est étonnant c'est que je peux créer un nouvel objet Observateur. Je pense donc que le Build Path du projet est correct. Pourtant si j'essaye de faire corriger l'erreur par Eclipse, il me demande de configurer le Build Path...

    Avez-vous une idée ? car je commence un peu à désespérer après 3h de recherche infructeuse...

    Merci.

    PS : j'espère avoir été clair...

  2. #2
    Membre expérimenté Avatar de vincent63
    Inscrit en
    Octobre 2005
    Messages
    198
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 198
    Par défaut
    'soir,
    Tu devrais changer ton par

  3. #3
    Invité
    Invité(e)
    Par défaut
    alors j'ai changé mon code, mais cela ne résoud pas le problème... Cependant Eclipse déplace l'erreur sur la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    super(Acteur.typeProducteur, observateur, moyenneTempsDeTraitement, ecartType);
    j'ai remarqué aussi que si je mettais juste super(); la même erreur apparaissait toujours...

  4. #4
    Membre expérimenté Avatar de vincent63
    Inscrit en
    Octobre 2005
    Messages
    198
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 198
    Par défaut
    re'soir,
    Bon, pour le super, c'est toujours ça de fait, même si ce n'est pas suffisant.

    Ensuite, je te propose un truc pas forcement très beau, mais ça marche.

    On nous a donné des classes
    Si tu as le .jar correspondant (solution la plus simple) il te suffit de faire :

    clic droit sur ton projet, Propriété > Java build path > Librairies : bouton add External jar. Là, tu choisis le chemin de ton jar.
    Ensuite, tu vas dans l'onglet : Propriété > Java build path > Order et export et tu coches la case devant le jar que tu viens d'importer.

    Bon, si tu n'as pas de jar associé à tes classes, le problème va être un peu plus compliqué. On va créer ce .jar.
    Pour cela, il faut créer un système de répertoires correpondant au chemin de tes packages :
    Si ton package est : ProdCons.se_lib
    il te faut un répertoire ProdCons avec DEDANS un autre répertoire se_lib etc... (la séparation se fait avec le point dans le nom du package)

    Une fois se système de répertoires terminé, tu places dedans tes .class.

    Par exemple, Acteur et Observateur se trouveront dans le répertoire se_lib

    Enfin, tu crées à la racine des ces répertoires un autre répertoire que tu vas nommer : META-INF
    Dedans ce META-INF, il faut mettre un fichier qui se nomme MANIFEST.MF et qui contient : juste cette ligne

    Une fois, terminé, tu compresses tes répertoires situés à la racine ainsi que ton META-INF dans un seul fichier que tu vas nommer bibli par exemple. Si tu l'as compressé en zip, change l'extension en .jar et hop, on revient à la partie vue plus haut...

    Ca peut avoir l'air un peu compliqué mais c'est tout simple en fait.
    Bon courage.

  5. #5
    Invité
    Invité(e)
    Par défaut
    'jour et merci de tes réponses,

    j'avais déjà le .jar mais j'avais du le modifier pour mettre un répertoire à l'interieur car je n'arrivais pas à importer les classes définies... J'avais donc fait la manipulation que tu avais décrite...

    Après une petite heure de recherche, je ne pense pas que l'on puisse m'aider (à par les profs qui ont créé les fichiers .class). En effet j'ai remarqué que l'erreur apparaissait lorsque je faisait un extends... Je viens de penser que cela venait peut être du fait que j'ai crée un répertoire dans le .jar alors qu'il n'y en avait aucun. Peut-être que les classes ne peuvent plus être liées car le chemin a changé !

    Ce qui m'amène à une question : comment je fait pour importer un fichier .class qui est dans un pakage par défaut qui est lui même dans un .jar? En effet je ne peux pas faire un truc du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    import ProdCons.Observateur;
    Eclipse me dit import ProdCons cannot be resolved.
    : :

  6. #6
    Membre expérimenté Avatar de vincent63
    Inscrit en
    Octobre 2005
    Messages
    198
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 198
    Par défaut
    'jour,

    En fait, si tu as déjà modifié le .jar en ajoutant un répertoire, cela semble normal que l'import ne marche pas.

    Le système de répertoire doit être lié au nom du package définit dans la classe.
    MonPackage1.MonPackage2.MonPackage3.MACLASSE
    pour
    MonPackage1 > MonPackage2 > MonPackage3 > MACLASSE.class

    Pour retrouver exactement le package, tu peux toujours décompiler tes classes (voir la rubrique des outils java sur le site).

    Dans les sources, tu pourrais même en profiter pour changer les noms de package de façon à se "qu'ils collent" avec ce que tu as fait dans le jar.

    En résumé :

    Tu décompiles les sources de tes profs
    Tu changes les noms de package
    Tu recrées ton .jar en tenant compte des noms de package

    je ne pense pas que l'on puisse m'aider (à par les profs qui ont créé les fichiers .class)
    Y a pas de raison... on est pas plus bête qu'un prof... enfin j'espère...

  7. #7
    Invité
    Invité(e)
    Par défaut
    alors j'ai essayé de modifier les sources une fois les .class décompilées mais c'est pénible... donc je voulais savoir si je pouvais éviter de faire ca en pouvant importer des classes qui sont définies dans le paquetage par défaut d'un fichier jar ?
    car comme je l'ai dit dans mon message précédent, la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    import ProdCons.Observateur;
    ne fonctionne pas, et comme il s'agit d'un paquetage par défaut, il n'a pas de nom donc je ne peux pas le mettre dans la ligne... (j'espère que l'on me comprendra... )

    sinon quand j'ai dis que seul les profs pouvaient m'aider c'est que je pensais qu'il y avait des erreurs dans le .jar qu'on nous a donné...

  8. #8
    Membre expérimenté Avatar de vincent63
    Inscrit en
    Octobre 2005
    Messages
    198
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 198
    Par défaut
    Je reconnais mes limites : je ne sais pas comment importer des classes contenues dans un package par defaut dans un jar.
    Mais je ne suis pas le seul
    http://www.developpez.net/forums/vie...&view=previous
    et du coup, j'en viens même à me demander si c'est possible.


    Ceci dit, je ne crois pas qu'il soit si difficile de changer les sources (sauf si tu as beaucoup de fichiers)

    Il te suffit de décompiler tes classes
    Acteur;
    Observateur;
    Ensuite, en haut de chaque source, tu ajoutes :

    Tu les compiles et tu places les .class dans le répertoire MonPackage dans ton jar.

    Autre solution, tu peux aussi, une fois décompilées, recréer les classes associées dans Eclipse, dans ton projet
    • Nouveau
      class
      et tu les nommes Acteur et Observateur


    Puis il faut copier le code source que tu as obtenu lors de la décompilation.

    PS : pour le décompilateur, je te conseil DJ Java Decompiler 3.9 assez simple d'utilisation.

  9. #9
    Invité
    Invité(e)
    Par défaut
    le problème c'est que les profs ont dus utiliser des classes à eux pour faire ces sources. En effet dans le code décompilé il y a un type Controleur qui n'existe pas, du coup je ne peux pas utiliser les sources...
    je vais donc chercher si on peut importer des classes contenues dans un package par defaut dans un jar.

    en tout merci de ton aide !

  10. #10
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 818
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 818
    Par défaut
    Salut,

    Citation Envoyé par vincent63
    Je reconnais mes limites : je ne sais pas comment importer des classes contenues dans un package par defaut dans un jar.
    Mais je ne suis pas le seul
    http://www.developpez.net/forums/vie...&view=previous
    et du coup, j'en viens même à me demander si c'est possible.
    Ben oui, il suffit d'importer la classe comme une classe normale non contenue dans un jar.
    Le système des import permet simplement de simplifier la dénomination des classes que l'on utilise dans le code, ça évite de se retaper tout le chemin des packages à chaque fois.
    Exemple, si tu utilises la classe MaClass contenue dans le package MonJar.MonPackage1.MonSousPackage1, soit tu te tapes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ... new MonJar.MonPackage1.MonSousPackage1.MaClass()
    à chaque fois que tu en as besoin, soit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    import MonJar.MonPackage1.MonSousPackage1.MaClass;
    ...
    ...
    ... new MaClass()
    Si il n'y a pas de package, donc aussi pour le package par défaut, il n'y a pas d'import à faire... tu utilises la classe directement. Il suffit qu'elle (ou le jar) soit dans la classpath pour la compilation.

    Citation Envoyé par vincent63
    Ceci dit, je ne crois pas qu'il soit si difficile de changer les sources (sauf si tu as beaucoup de fichiers)
    Personnellement, je ne pense pas que la décompilation soit l'objet du TP... si les profs ont fourni les classes à utiliser, c'est pour les utiliser, pas pour les décompiler,modifier, refaire le jar, bidouiller à droite et à gauche....

    MoRpHoGeLL, tu dis que le jar ne comporte pas de répertoire, donc pas de package. Dans ce cas, pourquoi faire des imports?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    import ProdCons.se_lib.Acteur;
    import ProdCons.se_lib.Observateur;
    A quoi correspond ProdCons.se_lib?
    Le fichier Jar fourni par tes profs est-il bien dans le Build Path? (méthode que t'as donné vincent63, clic droit sur ton projet, Propriété > Java build path > Librairies : bouton add External jar)
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  11. #11
    Invité
    Invité(e)
    Par défaut
    dans le .jar fourni, il n'y avais que les fichiers .class ansi que le META-INF. Comme je n'arrivais pas à importer ces classes, j'ai décompresser le .jar et j'ai crée un répertoire se_lib et je recompressait le tout.
    => c'était une erreur car les fichiers .class n'appartenait pas un package donc cela ne marchait pas.

    je suis reparti avec le .jar donné par les profs, je l'ai bien inclu dans le Build Path du projet (et j'ai même cocher dans Order and Export). Cependant je ne peux pas utliser les classes définies dans ce .jar : j'ai une erreur de ce type
    Acteur cannot be resolved to a type
    voici le code (pour voir si j'appelle la classe correctement)
    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
     
    package tp_ProdCons;
     
    public class Producteur extends Acteur{
     
    	/**
             * Nombre de message à envoyer par le producteur.
             */
    	private int nombreMsg; 
     
    	/**
             * Constructeur d'un Producteur.
             * @param nombreMsg le nombre de message qu'il va pouvoir créer.
             * @param observateur l'observateur à qui rendre compte.
             * @param moyenneTempsDeTraitement le temps moyen de traitement d'un message.
             * @param ecartType  l'ecart type du temps moyen de traitement.
             */
    	public Producteur(int nombreMsg, Observateur observateur, int moyenneTempsDeTraitement, int ecartType){
    			super(Acteur.typeProducteur, observateur, moyenneTempsDeTraitement, ecartType);
    			this.nombreMsg = nombreMsg;
    			this.start();
    	}
    }
    : :

  12. #12
    Membre expérimenté Avatar de vincent63
    Inscrit en
    Octobre 2005
    Messages
    198
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 198
    Par défaut
    Ben oui, il suffit d'importer la classe comme une classe normale non contenue dans un jar.
    Le système des import permet simplement de simplifier la dénomination des classes que l'on utilise dans le code, ça évite de se retaper tout le chemin des packages à chaque fois.
    Exemple, si tu utilises la classe MaClass contenue dans le package MonJar.MonPackage1.MonSousPackage1, soit tu te tapes:
    Code:
    ... new MonJar.MonPackage1.MonSousPackage1.MaClass()

    à chaque fois que tu en as besoin, soit:
    Code:
    import MonJar.MonPackage1.MonSousPackage1.MaClass;
    ...
    ...
    ... new MaClass()
    Merci plegat... mais ça, je le savais déjà...

    Le problème (à moins que je ne sois à côté de la plaque) vient du fait qu'Eclipse n'arriverait pas à reconnaitre une classe qui est dans un package par défaut lors d'un import ou d'une référence à un autre projet (cf le lien que j'ai envoyé, le sujet du message et qques tests persos.)

    Donc, n'arrivant pas à importer dans les sources une classe contenue dans un package par defaut lui même contenu dans un .jar ajouté au classpath (tu me suis), j'en conclu une solution qui est de modifier les classes pour utiliser un vrai nom de package...

    Ce n'est évidemment pas le but du TP, mais ça fait toujours une petite expérience en décompilation (un truc toujours utile dans la vie d'un informaticien )

  13. #13
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 818
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 818
    Par défaut
    Citation Envoyé par vincent63
    Merci plegat... mais ça, je le savais déjà...

    Le problème (à moins que je ne sois à côté de la plaque) vient du fait qu'Eclipse n'arriverait pas à reconnaitre une classe qui est dans un package par défaut lors d'un import ou d'une référence à un autre projet (cf le lien que j'ai envoyé, le sujet du message et qques tests persos.)
    Ok, autant pour moi!
    En fait ce n'est pas une limitation d'Eclipse, mais de Java (les puristes me reprendront si je dis des boulettes).
    Les packages servent, en plus de ce que j'ai dit précédemment, à assurer également l'unicité des noms de classes.
    Et Java interdit l'importation des classes du package par défaut (au sens d'Eclipse, le package non-nommé en tête de projet), car alors cela risquerait d'avoir deux classes portant le même nom (la classe MaClasse du package par défaut, et la classe MaClasse du package courant). Evidemment, ce problème ne se pose pas lorsque l'on code tout dans le package par défaut, vu qu'à ce moment le package par défaut est le package courant...

    Citation Envoyé par vincent63
    Donc, n'arrivant pas à importer dans les sources une classe contenue dans un package par defaut lui même contenu dans un .jar ajouté au classpath (tu me suis), j'en conclu une solution qui est de modifier les classes pour utiliser un vrai nom de package...
    C'est une des solutions.
    L'autre consiste à tout mettre dans le package par défaut, donc, MoRpHoGeLL, à virer ton:

    en début de classe (ou à mettre ta classe dans le package par défaut de ton projet).

    Citation Envoyé par vincent63
    Ce n'est évidemment pas le but du TP, mais ça fait toujours une petite expérience en décompilation (un truc toujours utile dans la vie d'un informaticien )
    Expérience toujours utile, mais là, ça va être délicat, en rendant sa copie, de dire à son prof "J'ai refait votre Jar, vous l'aviez organisé n'importe comment!"
    Cela dit, rien n'empêche de faire la remarque... diplomatiquement... ça peut toujours influer en positif de faire des remarques constructives en TP.
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  14. #14
    Invité
    Invité(e)
    Par défaut
    merci beaucoup !!

    mon problème est résolu !!

    il fallait bien tout mettre dans le package par défaut...

  15. #15
    Membre chevronné Avatar de Scorpyosis
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2004
    Messages : 365
    Par défaut
    Et un ptit tag résolu !

  16. #16
    Membre expérimenté Avatar de vincent63
    Inscrit en
    Octobre 2005
    Messages
    198
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 198
    Par défaut
    En fait ce n'est pas une limitation d'Eclipse, mais de Java (les puristes me reprendront si je dis des boulettes).
    Les packages servent, en plus de ce que j'ai dit précédemment, à assurer également l'unicité des noms de classes.
    Et Java interdit l'importation des classes du package par défaut (au sens d'Eclipse, le package non-nommé en tête de projet), car alors cela risquerait d'avoir deux classes portant le même nom (la classe MaClasse du package par défaut, et la classe MaClasse du package courant). Evidemment, ce problème ne se pose pas lorsque l'on code tout dans le package par défaut, vu qu'à ce moment le package par défaut est le package courant...
    Oui, en fait cela semble assez logique, j'aurai dû y penser ... bien vu...

    Expérience toujours utile, mais là, ça va être délicat, en rendant sa copie, de dire à son prof "J'ai refait votre Jar, vous l'aviez organisé n'importe comment!"
    C'est surement à cause de ce genre de phrase que j'ai toujours eu de sales notes en tp...

    J'ai appris deux trucs aujourd'hui
    Merci

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

Discussions similaires

  1. Problème pour intégrer WTP dans eclipse
    Par bourriquet_42 dans le forum Eclipse
    Réponses: 4
    Dernier message: 07/11/2008, 15h25
  2. Erreur de PATH dans ECLIPSE ?
    Par a028762 dans le forum Eclipse PHP
    Réponses: 2
    Dernier message: 10/01/2008, 21h45
  3. [XSLT][débutant] Problème xsl:value-of dans xsl:for-each
    Par Choubie dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 09/05/2007, 16h30
  4. build path sous Eclipse Maven
    Par babalastar dans le forum Maven
    Réponses: 1
    Dernier message: 11/01/2007, 09h51
  5. [Débutant][php] IDE pour PHP dans Eclipse ?
    Par folsen dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 22/04/2004, 16h25

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