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 :

Problème de visibilité entre 2 classes dans un même répertoire


Sujet :

avec Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2014
    Messages : 18
    Points : 20
    Points
    20
    Par défaut Problème de visibilité entre 2 classes dans un même répertoire
    Hello les javistes,

    je suis en java 1.6
    Je cherche à compiler A.java et B.java en ligne de commande dans un même répertoire, A est compilé, mais B non car B ne "voit" pas A.
    Les 2 classes java ont comme première ligne : package hello;

    Javac A.java
    => Ok
    javac -cp . B.java
    =>
    B.java:45: cannot find symbol
    symbol : class A
    location: class hello.B
    protected List<A> greeting;

    B.java:69: cannot find symbol
    symbol : class A
    location: class hello.B
    public List<A> getGreeting() {

    B.java:71: cannot find symbol
    symbol : class A
    location: class hello.B
    greeting = new ArrayList<A>();

    Qqn voit où j'ai fait une erreur ?
    Merci d'avance de votre aide

  2. #2
    Membre expert
    Avatar de MarieKisSlaJoue
    Homme Profil pro
    Ingénieur Cloud
    Inscrit en
    Mai 2012
    Messages
    1 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Roumanie

    Informations professionnelles :
    Activité : Ingénieur Cloud
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 145
    Points : 3 653
    Points
    3 653
    Billets dans le blog
    20
    Par défaut
    Avec le code de ta classe A et B ça serai plus facile. Tu peux décrire arborescence de ton répertoire ?
    Ce post à été écrit par un panda
    Apollo 11 - AGC revue de code
    -- qwerty keybord

  3. #3
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Le classpath "." n'est valide que pour les classes sans package.
    Ta commande de compilation est donc incorrect.

    Le classpath doit correspondre au répertoire de base contenant tes classes, c'est à dire le répertoire contenant le répertoire "hello" qui contiendra les fichiers *.class.


    Pour compiler correctement il faut définir le classpath correctement, et perso je conseillerais également de définir le sourcepath et le répertoire de destination.

    Il faudrait connaitre ton arborescence exact, mais si tes sources sont dans un répertoire "src" et que tu veux mettre les classes dans un répertoire "bin", ca donnerait quelque chose comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    javac  -sourcepath /chemin/de/base/src -cp /chemin/de/base/bin -d /chemin/de/base/bin   fichier.java

    a++

  4. #4
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2014
    Messages : 18
    Points : 20
    Points
    20
    Par défaut
    Mon but consiste à tester cet exemple "hello world" en JAXB : https://jaxb.java.net/tutorial/secti...llo-World.html
    Tous les fichiers se trouvent dans le même répertoire. Les 2 fichiers java comportent "package hello", et sont dans un répertoire de meme nom.
    Ce 1er fichier compile bien en faisant javac (j'ai enlevé les imports pour faire plus court) :

    GreetingType.java :

    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
    package hello;
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "GreetingType", propOrder = {
        "text"
    })
    public class GreetingType {
     
        @XmlElement(name = "Text", required = true)
        protected String text;
        @XmlAttribute(name = "language")
        @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
        @XmlSchemaType(name = "language")
        protected String language;
     
        public String getText() {    return text;    }
        public void setText(String value) {       this.text = value;   }
        public String getLanguage() {       return language;    }
        public void setLanguage(String value) {      this.language = value;    }
     
    }
    Ce 2eme fichier ne compile pas car le compilateur ne voit pas GreetingType.class qui est pourtant dans le meme repertoire !

    GreetingListType.java :

    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
    package hello;
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "GreetingListType", propOrder = {
        "greeting"
    })
    public class GreetingListType {
     
        @XmlElement(name = "Greeting", required = true)
        protected List<GreetingType> greeting;
     
        /**
         * For example, to add a new item, do as follows:    getGreeting().add(newItem);
         */
        public List<GreetingType> getGreeting() {
            if (greeting == null) {
                greeting = new ArrayList<GreetingType>();
            }
            return this.greeting;
        }
    }

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    java et javac ne regardent pas dans "le même répertoire". Ils regardent dans le classpath et le sourcepath, respectivement et en utilisant le nom complet de la classe.

    Si tu as cette structure


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    src
      hello
        A.java
        B.java
    il faut te placer dans le dossier src et lancer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    javac hello/A.java
    javac hello/B.java
    Dans ta commande d'origine, tu as tappé


    en étant dans le répertoire hello/ du coup tu dit au compilateur que si il veux touver A.class, il doit aller regarder après hello/hello/A.class ou hello/hello/A.java, ce qui évidement n'existe pas.

    Quand tu utilise des packages, les répertoires doivent être cohérents avec les instructions "package", mais aussi les paramètres que tu passe au compilateur doivent pointer sur la racine du classpath et pas sur un sous-dossier, c'st indispensable à la recherche. Dans ton cas, chercher ./A.java ou chercher ./hello/A.java, ce n'est pas la même chose.


    pour faire simple, le compilateur, quand tu lui dit que B.java nécessite hello.A, il va chercher
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $classpath/hello/A.class
    $classpath/hello/A.java
    et rien d'autre. Il se fiche du dossier où se trouve B.java pour cette opération.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2014
    Messages : 18
    Points : 20
    Points
    20
    Par défaut
    merci tchize_, adiGuba, MarieKisSlaJoue

    Erixx

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

Discussions similaires

  1. Problème de portée entre deux classes
    Par Shikette dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 13/11/2009, 23h32
  2. problème de communication entre mes classes
    Par emiliekun dans le forum ActionScript 3
    Réponses: 13
    Dernier message: 19/08/2009, 15h10
  3. Problème d'inclusion entre deux classes.
    Par XavierHWT dans le forum Débuter
    Réponses: 2
    Dernier message: 25/05/2009, 15h52
  4. Problèmes d'inclusion entre deux classes
    Par Invité dans le forum C++
    Réponses: 3
    Dernier message: 26/05/2008, 15h41
  5. Problème de visibilité de table/colonne dans une requête
    Par MicaelFelix dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 13/07/2007, 17h41

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