2012-12-03 3 views
7

Ich versuche unter die Haube über Java Compilation zu schauen. Also habe ich meine IDE weg und begann mit MS-DOS-Befehlszeile ...Wie findet der Java-Compiler die Klassendateien, während der Klassenpfad nicht auf den jdk-Pfad gesetzt ist?

ich ein einfaches Projekt erstellt, wie weiter unten im Baum beschrieben:

SampleApp

|____**src** 

     |_____pack 
       |______Sample.java 
|____**classes** 

Diese Code ist die Sample.java Quelle:

public class Sample 
{ 

    private String s = new String("Hello, world"); 

    public Sample(){ 
      System.out.println(s); 
    } 
} 

ich will nur diese Klasse kompilieren, so dass ich verwendet, um den Befehl javac:

prompt\SampleApp\src>javac -d ..\classes -sourcepath . pack\Sample.java 

Alles funktioniert gut, aber ich habe das nicht erwartet, weil ich meine CLASSPATH Umgebungsvariable vor dem Kompilieren meiner Sample.java-Datei gelöscht habe. Daher erwartete ich einen Compilerfehler aufgrund der Tatsache, dass der Compiler die java.lang.String-Klassendatei nicht finden konnte.

Ich habe diesen Artikel gelesen, der mir geholfen hat, viele Dinge zu verstehen. Der Artikelautor sagt, dass der Standardklassenpfad das aktuelle Arbeitsverzeichnis ist. Aber ich verstehe nicht, warum mein Quellcode fehlerfrei kompiliert wird. Kann mir das jemand erklären?

Antwort

6

Also erwartete ich einen Kompilierungsfehler aufgrund der Tatsache, dass der Compiler nicht in der Lage sein würde, die java.lang.String-Klassendatei zu finden.

Die kurze Antwort ist, dass der Compiler weiß wo alle Standard-Java SE Bibliotheksklassen zu finden, ohne dass Sie es zu sagen.

Die längere Antwort ist, dass String Klasse auf dem Bootclasspath gefunden wird. Dies ist implizit festgelegt durch den javac Befehl, um auf die relevanten JARs in der JDK-Installation verweisen. Der Befehl javac durchsucht den bootclasspath, bevor er nach Dingen auf dem regulären Klassenpfad sucht.

+0

Vielen Dank für Ihre Antwort. Es hilft mir wirklich! Ich werde nach weiteren Informationen über bootclasspath suchen. –

5

Die Klassenpfadvariable tut nicht, was Sie denken. Um die Oracle-Dokumentation zu zitieren:

Die Variable CLASSPATH ist eine Möglichkeit, Anwendungen zu erzählen, einschließlich der JDK-Tools, in denen für Benutzerklassen zu suchen. (Klassen, der Teil JRE, JDK-Plattform sind, und Erweiterungen sollten durch andere Mittel, wie der Bootstrap-Klassenpfad oder das Erweiterungsverzeichnis definiert werden.)

Quelle: http://docs.oracle.com/javase/tutorial/essential/environment/paths.html

Im Grunde genommen seit java.lang.* ist Teil der Plattform und mit dem JDK/JRE geliefert, muss der Compiler von Ihnen nicht gesagt werden, wo Sie nach ihnen suchen.

+0

Vielen Dank für Ihre Antwort. Die Dinge sind jetzt klarer. –

Verwandte Themen