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 :

Problème de package


Sujet :

Langage Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 22
    Par défaut Problème de package
    Bonjour,

    j'ai un problème de package qui m'empeche de compiler et je ne comprends pas pourquoi :

    je fais un simple serveur FIFO avec des threads. j'ai organisé mes classes dans des repertoires avec cette architecture :

    c:\truc\racineduprog : exec_server.java dans package "monprogramme"

    c:\truc\racineduprog \server_waiting_list\parametres.java : utiliser pour passer des arguments au serveur dans le package "monprogramme.server_waiting_list"

    c:\truc\racineduprog \server_waiting_list\Println_debug.java : utiliser pour activer/desactiver mes commentaires de prog dans le package package "monprogramme.server_waiting_list"

    c:\truc\racineduprog \server_waiting_list\server\monprogramme.java : lance le serveur en vrai


    monprogramme.java fait simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    package monprogramme.server_waiting_list.server;
     
    import monprogramme.server_waiting_list.Println_debug
     
    public class Monprogramme{
    ...
    }
    Quand je met import monprogramme.server_waiting_list.* ça compile
    Quand je met import monprogramme.server_waiting_list.import monprogramme.server_waiting_list.* ça compile
    ça donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    erreur : cannot find symbol class Println_debug
    location : package monprogramme.server_wainting_list
    import monprogramme.server_waiting_list.Println_debug;

    une classe ne peut pas utiliser une classe se situer un niveau plus haut qu'elle dans le package ?? ça m'etonnerait que cela vienne de là quand même?

    j'ai essayer de mettre CLASSPATH=c:\truc\monprogramme mais ça change rien...je ne comprends pas ce que j'ai raté, auriez vous une idée svp?

    merci d'avance

  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
    Salut,

    Citation Envoyé par darksamourai Voir le message
    j'ai essayer de mettre CLASSPATH=c:\truc\monprogramme mais ça change rien...je ne comprends pas ce que j'ai raté, auriez vous une idée svp?
    Tu dois avoir un répertoire qui représente ton package de base, et donc monprogramme.

    Bref le répertorie vers lequel ton CLASSPATH point doit contenir le répertoire monprogramme qui lui même doit contenir le répertoire server_waiting_list. Bien sûr les classes doivent être situé dans le bon répertoire...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CLASSPATH
       |
       +-> monpackage
                 |
                 +-> server_waiting_list
    Sinon essayes de respecter les conventions de nommages (par de _ dans les noms de classes ou de packages, les classes commencent par une majusucle...)

    a++

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 22
    Par défaut
    pour les majuscules, c'est juste qu'en recopiant je fais pas gaffe à ça (le copier coller ne passe pas par notre TSE )

    je suis déjà selon ton schéma

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CLASSPATH : Repertoire "MonProgramme " contenant "exec_serveur.java"
    |
    ->Rep. "server_waiting_list" contenant "Parametre.java" et "Println_debug.java" du package "server_waiting_list"
           |
            -> Rep. "server" contenant Monprogramme.java (executable lançant le serveur) du package "server_waiting_list.server"

    ça donne erreur de compil pour Monprogramme.java qui n'arrive pas à importer la classe Println_debug...

  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
    Citation Envoyé par darksamourai Voir le message
    je suis déjà selon ton schéma

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CLASSPATH : Repertoire "MonProgramme " contenant "exec_serveur.java"
    Non : si exec_serveur.java appartient au package "MonProgramme" alors le CLASSPATH doit pointer vers le répertoire parent et non pas sur "MonProgramme"...

    Bref pour chercher une classe la JVM fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     RepDuClassPath + "/"  package + "/" + Nom + ".class"
    a++

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 22
    Par défaut
    ok l'organisation étant maintenant correct, j'ai mis tout le code du programme.java en commentaire sauf les imports.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    import monprogramme.server_waiting_list.*;
    La compilation passe.

    mais quand je met
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    import monprogramme.server_waiting_list.Println_debug;
    La compil plante et dit encore :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    erreur : cannot find symbol class Println_debug
    location : package monprogramme.server_waiting_list
    import monprogramme.server_waiting_list.Println_debug;

    J'ai alors remis "import monprogramme.server_waiting_list.*;"

    Mais quand je rajoute l'appel à la classe importé dans ma fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Println_debug Print=new Println_debug();
    je me retrouve avec la même erreur d'appel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    erreur : cannot find symbol class Println_debug
    location : package monprogramme.server_waiting_list
    Println_debug Print=new Println_debug();
    je n'y comprends riens...

  6. #6
    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
    Quel est ton arborescence exacte ? (PrintScreen au cas où)
    De que répertoire tu compile ? Et quel commande tu utilises précisément ?

    a++

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 22
    Par défaut
    je compilai avec l'adresse du cmd.exe par défaut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    c:\Documents and Settings\Installation>javac "c:\PRG\MonProgramme\server_waiting_list\server\Monprogramme.java"
    je viens d'essayer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cd c:\PRG\MonProgramme
    c:\PRG\MonProgramme>javac .\server_waiting_list\server\Surcouf.java
    ça reviens au même

    l'arborescence est :
    -> repertoire
    * = fichier du repertoire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    C:
    -> PRG
          ->Monprogramme
                *exec_client.java
                *exec_server.java (contient le main)
                ->server_waiting_list
                         *Parametres.java
                         *Println_debug.java
                         ->client
                         ->server
                                  *MonProgramme.java
                                  *Theads_Monprogramme.java
                                  * etc...

  8. #8
    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
    Et que te renvoi la commande suivante :
    a++

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 22
    Par défaut
    dans le cmd.exe : ça renvoie "%CLASSPATH%" ....

  10. #10
    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 darksamourai Voir le message
    dans le cmd.exe : ça renvoie "%CLASSPATH%" ....
    Donc tu n'as pas défini de CLASSPATH et tu dois le définir. Le mieux étant d'utiliser l'option -classpath :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    javac -classpath c:\PRG "c:\PRG\MonProgramme\server_waiting_list\server\Monprogramme.java"
    a++

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 22
    Par défaut
    oyo,

    j'ai redemarré le pc et cette fois echo classpath m'affiche bien c:\PRG
    j'ai recompilé en allant directeement dans le répertoire

    c:\PRG\MonProgramme>javac ./server_waiting_list/server/Monprogarmme.java

    et re planté avec toujours la même erreur : impossible d'importer MonProgramme.server_waiting_list.Println_debug qui a été compilé correctement juste avant...(il n'importe aucune autre classe)

    est ce que le fait que Println_debug soit dans le repertoire supérieur pose un pb? je pense pas quand meme...

  12. #12
    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
    Vérifies bien les minuscules/majuscules de tout tes fichiers...


    Tu n'utilises pas toujours la même règles et cela pourrait bien êtr problématique (monprogramme, Monprogramme, MonProgramme, etc...)

    a++

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 22
    Par défaut
    Tu n'utilises pas toujours la même règles et cela pourrait bien êtr problématique (monprogramme, Monprogramme, MonProgramme, etc...)
    c'est parceque je ne fais pas de copier-coller. Je suis en stage et je n'ai pas acces directement à Internet et le programme ne s'appele pas MonProgramme mais je doute que mon entreprise apprécie que j'utilise le vrai nom lol.

    Element qui t'avancera peu etre pour détecter mon erreur : Ce programme doit etre appeler par une page JSP d'un site utilisant des objets java(serveur Tomcat qui tourne sur le serveur). J'ai déjà réussi à faire fonctionner le programme mais avec l'executable (cad les fichiers exec_server et exec_client) à la racine du serveur cad

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Tomcat5.0
    ->webapps
         -> LeSite
              ->WebInf
                      *exec_server.java
                      *exec_client.java
                  ->rep1
                       *classes spécifique au site
                       ->MonProgramme
                               ->server_waiting_list
                                       *Parametres.java
                                       *Println_debug.java
                                       ->server
                                                *Monprogramme.java

    Avec ça et mettant rep1.MonProgramme.server_waiting_list comme package, le programme fonctionne!

    Mais ils veulent que l'executable exec_server soit dans le repertoire MonProgramme pour que mon apport soit regroupé dans le repertoire MonProgramme.

    Il n'y avait pas de CLASSPATH à ce moment là et ça marchait!

    Bon la version sur laquelle je travaille n'est pas situé sur la racine webapps de tomcat mais à c:\PRG\MonProgramme donc ça ne devrait pas interférer mais c'est une piste comme une autre...

    Peut il y avoir un problème par rapport à la machine virtuelle appelé par TOMCAT et mon programme qui voudrait en appellé une autre avec un classpath différent (puisque je ne me base pas sur webapps comme repertoire par defaut)?

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 22
    Par défaut
    une autre question : est ce que la classe contenant le main doit forcement être à la racine du package?

Discussions similaires

  1. [JNI]Problème de package avec jni
    Par picomz dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 10/08/2006, 15h43
  2. [ClassLoader] Chargement dynamique d'une classe -> problème avec packages !
    Par ymerej dans le forum API standards et tierces
    Réponses: 9
    Dernier message: 31/05/2006, 21h37
  3. probléme de package dans eclipse
    Par bf83 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 13/04/2006, 14h29
  4. [Eclipse 3.1] Problème de package
    Par yakanet dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 24/02/2006, 14h53
  5. [servlet] [jsp] problème de package
    Par Erreip dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 08/11/2005, 10h54

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