2017-10-18 5 views
1

Ich frage mich warum die folgenden Schritte funktionieren.Warum javac akzeptiert, Klassen mit Paketdeklaration mit falscher Baumstruktur zu kompilieren

Lassen Sie uns sagen, dass die tatsächliche Dateistruktur:

- src 
    - Toto.java 

die Datei Toto.java

package myPackage; 
class Toto{} 

Die official javac specification Staaten

Quelldateien in einem Verzeichnisbaum anordnen enthält, die ihre widerspiegelt Paket Baum. Wenn sich beispielsweise alle Quelldateien in \ workspace befinden, setzen Sie den Quellcode für com.mysoft.mypack.MyClass in/workspace unter \ workspace \ com \ mysoft \ mypack \ MyClass.java.

Ich dachte, dass

$ cd src 
$ javac Toto.java 

wird ein Fehler ausgegeben. Der Compiler gibt stattdessen keinen Fehler und kompiliert die richtige Datei. Offensichtlich

,

cd src 
javac PokerQ/Affichage.java 

oder

javac PokerQ/Affichage.java 

nicht kompilieren.

Antwort

2

Im Prinzip müssen Sie Ihre Quelldateien nicht in einer Baumstruktur ablegen, die der Pakethierarchie entspricht. Der Compiler kompiliert jede Klasse und speichert den Paketnamen intern. Unabhängig davon, wie Sie die Quellverzeichnisse organisieren, weiß jede erzeugte Datei .class, welchem ​​Paket sie entspricht.

Das potentielle Problem ist, dass, wenn Sie mehrere Klassen kompilieren, einige dieser Klassen höchstwahrscheinlich aufeinander verweisen. Der Compiler und die JRE verwenden die Verzeichnishierarchie als ein Mittel, Klassen zu finden, wenn eine Klasse auf eine andere verweist. Standardmäßig platziert der Compiler kompilierte .class Dateien im selben Verzeichnis wie seine Java-Quelle. Wenn das Quellverzeichnis higgley-piggledy ist, erhalten Sie eine Reihe von .class Dateien, die selbst nicht nach Paketen strukturiert sind, was es schwierig macht, sie zu finden. Sie können das Problem - wenn Sie es wirklich wollen - immer noch umgehen, indem Sie den Klassensuchpfad in den Befehlszeilen javac oder java sorgfältig einstellen.

Darüber hinaus, wenn Sie ein Verzeichnis für den Compiler mit -d <path> angeben, dann wird es eine Struktur der kompilierten Klassen erstellen, die die Pakethierarchie entspricht, aber die Quellen sind durcheinander. Ich bin mir nicht sicher, ob irgendjemand den Standardansatz benutzt, die kompilierten Klassen in dieselben Verzeichnisse wie Quellen zu stellen und im Prinzip könnte man eine ziemlich komplexe Java-Anwendung mit mehreren Paketen erstellen, in der sich alle Quelldateien befinden dasselbe Verzeichnis - vorausgesetzt, Sie könnten alle verfolgen.

Wie dem auch sei, die Idee, dass der Quellbaum mit der Pakethierarchie übereinstimmt, ist fest in der Java-Entwicklungsmethodik verankert, egal ob sie immer unbedingt notwendig ist oder nicht.IDE-Tools und Build-Tools wie Ant und Maven nehmen diese Organisation an, also müsstest du ein bisschen blutig sein, anders zu arbeiten.

Verwandte Themen