wake-up-neo.com

So kompilieren Sie Java-Paketstrukturen mit Javac

Ich versuche, von der Befehlszeile aus ein Java-Paket zu kompilieren, das ein anderes von mir importiert. Ich folgte einem Tutorial online , aber es scheint, dass ich eine Fehlermeldung bekomme, wenn ich versuche, die letzte Java-Datei (CallPackage.Java) zu kompilieren. 

Hier ist die Dateistruktur:

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

Hier ist CallPackage.Java:

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

und hier ist HelloWorld.Java:

///HelloWorld.Java

package importpackage.subpackage;

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

Versuchte Schritte

  1. Gehen Sie zum Unterpaket und kompilieren Sie HelloWorld.Java mit $javac HelloWorld.Java.
  2. Rufen Sie test_directory auf und kompilieren Sie CallPackage.Java mit $javac CallPackage.Java.

Dies gibt mir einen Fehler beim letzten Befehl:

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

Wie kann ich beide Pakete zusammenstellen? Vielen Dank für jede Hilfe!

13
Pswiss87

Sind Sie sicher, dass sich importpackage/subpackage in Ihrem Klassenpfad befindet?

-cp-Pfad oder -classpath-Pfad

Geben Sie an, wo Benutzerklassendateien und (optional) Anmerkungsprozessoren und Quelldateien gesucht werden sollen. Dieser Klassenpfad überschreibt den Benutzerklassenpfad in der Umgebungsvariablen CLASSPATH. Wenn weder CLASSPATH, -cp noch -classpath angegeben ist, besteht der Benutzerklassenpfad aus dem aktuellen Verzeichnis. Weitere Informationen finden Sie unter Festlegen des Klassenpfads. 

Wenn die Option -sourcepath nicht angegeben ist, wird der Benutzerklassenpfad auch nach Quelldateien durchsucht.

Wenn die Option -processorpath nicht angegeben ist, wird der Klassenpfad auch nach Anmerkungsprozessoren durchsucht.

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

3
Jazzy Josh

Das Problem war, dass der Klassenpfad für jeden Befehl (Javac und Java) festgelegt werden muss:

Versuchte Schritte

  1. kompilieren Sie HelloWorld.Java anstelle des Unterpakets aus dem top_level:

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

  2. kompilieren Sie CallPackage.Java auf dieselbe Weise:

    $javac -cp . CallPackage.Java

  3. führen Sie die Datei auch mit dem Klassenpfad aus:

    $Java -cp . CallPackage

NOTE: Beim Ausführen von "$ Java CallPackage" wird ein Fehler ausgegeben "Fehler: Hauptklasse CallPackage konnte nicht gefunden oder geladen werden"

Zusammenfassend muss bei jedem Schritt der Klassenpfad angegeben werden. Es funktionierte, nachdem es als solches ausgeführt wurde.

9
Pswiss87

Gleiche Situation für mich. Ich übernahm es, indem ich gleichzeitig den Unterricht zusammenstellte.
Zum Beispiel ist hier mein Projekt: 

+ 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 {
      ...
}


Wie Sie sehen können: BeerSelect.Java versucht Klassen in com.example.model Paket.
Beim ersten Mal kompilierte ich BeerExert.Java zuerst mit dem Befehl:

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

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

Und das Ergebnis war:
-->... error: package com.example.model does not exist

Ich wusste also, dass das Zusammenstellen mehrerer Klassen separat in diesem Fall nicht funktioniert. 


Nachdem ich auf Google gelitten hatte, fand ich diesen sehr einfachen Weg, um das Problem zu lösen:
Kompilieren Sie einfach alles auf einmal:

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


Zum Schluss habe ich Folgendes bekommen:

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

Hoffentlich hilft das.

0

(1) kompilieren Sie zuerst den Code

javac -d importpackage.subpackage.HelloWorld

(2) und kompilieren Sie dann das CallPackage.Java

javac CallPackage.Java

0
Dev