web-dev-qa-db-fra.com

Comment compiler les structures de package Java en utilisant javac

J'essaie de compiler (à partir de la ligne de commande) un package Java qui importe un autre package de mon choix. Je suivais un tutoriel en ligne mais il semble que je reçois une erreur lorsque je tente de compiler le fichier Java final (CallPackage.Java). 

Voici la structure du fichier:

+ test_directory (contains CallPackage.Java)
   -> importpackage
       -> subpackage (contains HelloWorld.Java)

Voici CallPackage.Java:

/// CallPackage.Java
import importpackage.subpackage.*;
class CallPackage{
  public static void main(String[] args){
  HelloWorld h2=new HelloWorld();
  h2.show();
  }
}

et voici HelloWorld.Java:

///HelloWorld.Java

package importpackage.subpackage;

public class HelloWorld {
  public void show(){
  System.out.println("This is the function of the class HelloWorld!!");
  }
}

Tentatives

  1. Accédez au sous-package et compilez HelloWorld.Java avec $javac HelloWorld.Java.
  2. Accédez au répertoire test_directory et compilez CallPackage.Java avec $javac CallPackage.Java.

Cela me donne une erreur sur la dernière commande:

CallPackage.Java:1: package importpackage.subpackage does not exist
import importpackage.subpackage.*;
^
CallPackage.Java:4: cannot find symbol
symbol  : class HelloWorld
location: class CallPackage
  HelloWorld h2=new HelloWorld();
  ^
CallPackage.Java:4: cannot find symbol
symbol  : class HelloWorld
location: class CallPackage
  HelloWorld h2=new HelloWorld();
                    ^
3 errors

Comment puis-je compiler les deux packages? Merci beaucoup pour toute aide!

13
Pswiss87

Etes-vous sûr que importpackage/subpackage est dans votre classpath?

-cp path ou -classpath path

Spécifiez où trouver les fichiers de classe utilisateur et (éventuellement) les processeurs d'annotation et les fichiers source. Ce chemin d'accès aux classes remplace le chemin d'accès aux classes d'utilisateurs dans la variable d'environnement CLASSPATH. Si ni CLASSPATH, -cp ni -classpath ne sont spécifiés, le chemin de la classe d'utilisateurs est constitué du répertoire en cours. Voir Définition du chemin de classe pour plus de détails. 

Si l'option -sourcepath n'est pas spécifiée, le chemin d'accès aux classes d'utilisateurs est également recherché pour les fichiers source.

Si l'option -processorpath n'est pas spécifiée, le chemin de classe est également recherché pour les processeurs d'annotation.

http://docs.Oracle.com/javase/7/docs/technotes/tools/windows/javac.html

3
Jazzy Josh

Le problème était que le chemin d'accès aux classes devait être défini pour chaque commande (javac et Java):

Tentatives

  1. au lieu d'aller au sous-paquet, compilez HelloWorld.Java à partir du top_level:

    $javac -cp . importpackage/subpackage/HelloWorld.Java

  2. compilez CallPackage.Java de la même manière:

    $javac -cp . CallPackage.Java

  3. exécutez le fichier en utilisant le chemin de classe également:

    $Java -cp . CallPackage

NOTE: l'exécution de "$ Java CallPackage" donnera une erreur "Erreur: impossible de trouver ou de charger la classe principale CallPackage"

En résumé, à chaque étape, le chemin de classe doit être spécifié. Cela a fonctionné après l'avoir exécuté en tant que tel.

9
Pswiss87

Même situation pour moi. Et je suis venu le reprendre en compilant des cours en même temps.
Par exemple, voici mon projet: 

+ beerV1
   -> classes
   -> src
         -> com
              -> example
                   -> model
                        -> BeerExpert.Java
                   -> web
                        -> BeerSelect.Java


BeerExpert.Java:

package com.example.model;
import ...

public class BeerExpert{
    ...
}


BeerSelect.Java:

package com.example.web;
import com.example.model.*;
import ...

public class BeerSelect {
      ...
}


Comme vous pouvez le constater: BeerSelect.Java essaie d’importer des classes dans com.exemple.modèle paquet.
À la première fois, j'ai compilé BeerExert.Java d'abord par la commande:

--> javac -d classes src/com/example/model/BeerExpert.Java

Ensuite:
--> javac -d classes src/com/example/web/BeerSelect.Java

Et le résultat fut:
-->... error: package com.example.model does not exist

Donc, je savais que la compilation de plusieurs classes séparément ne fonctionnerait pas dans ce cas. 


Après avoir souffert sur google, j'ai trouvé ce moyen très simple de résoudre le problème:
Il suffit de compiler tout à la fois:

--> javac -d classes src/com/example/model/BeerExpert.Java src/com/example/web/BeerSelect.Java 


Enfin, voici ce que j'ai eu:

 + beerV1
           -> classes
                 -> com
                      -> example
                           -> model
                                -> BeerExpert.class
                           -> web
                                -> BeerSelect.class
           -> src
                 -> com
                      -> example
                           -> model
                                -> BeerExpert.Java
                           -> web
                                -> BeerSelect.Java

J'espère que cela pourra aider.

0

(1) compiler d'abord le code

javac -d importpackage.subpackage.HelloWorld

(2) puis compilez le CallPackage.Java

javac CallPackage.Java

0
Dev