2012-12-03 15 views
7

Sto cercando di dare un'occhiata alla compilation java. Così ho messo il mio IDE di distanza e iniziato a utilizzare MS-DOS a riga di comando ...Come fa il compilatore java a trovare i file di classe mentre il classpath non è impostato sul percorso jdk?

Ho creato un progetto semplice, come descritto nella albero di seguito:

SampleApp

|____**src** 

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

Questo è il codice sorgente Sample.java:

public class Sample 
{ 

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

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

voglio solo compilare questa classe, quindi ho usato il comando javac:

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

Tutto funziona correttamente, ma non me l'aspettavo perché ho cancellato la mia variabile di ambiente CLASSPATH prima di compilare il mio file Sample.java. Quindi mi aspettavo un errore del compilatore dovuto al fatto che il compilatore non sarebbe stato in grado di trovare il file di classe java.lang.String.

Ho letto questo articolo http://www.ibm.com/developerworks/java/library/j-classpath-windows/ che mi ha aiutato a capire molte cose. L'autore dell'articolo dice che il classpath predefinito è la directory di lavoro corrente. Ma non capisco perché il mio codice sorgente venga compilato senza errori. Qualcuno potrebbe spiegarmi questo?

risposta

6

Quindi mi aspettavo un errore di compilazione dovuto al fatto che il compilatore non sarebbe stato in grado di trovare il file di classe java.lang.String.

La risposta breve è che il compilatore sa dove trovare tutte le classi della libreria standard di Java SE senza dirti esso.

La risposta più lunga è che la classe String è stata trovata nel percorso di avvio. Questo è implicitamente impostato dal comando javac per fare riferimento ai JAR pertinenti nell'installazione JDK. Il comando javac cerca nel percorso bootclass prima di cercare elementi sul classpath regolare.

+0

Grazie per la risposta. Mi aiuta davvero! Cercherò ulteriori informazioni su bootclasspath. –

5

La variabile classpath non fa ciò che si pensa. Per citare la documentazione di Oracle:

La variabile CLASSPATH è un modo di raccontare le applicazioni, inclusi gli strumenti JDK, dove cercano classi utente. (Classi che fanno parte della piattaforma JRE, JDK, e le estensioni devono essere definite attraverso altri mezzi, quali il percorso classe di bootstrap o directory extensions.)

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

Fondamentalmente dal java.lang.* fa parte della piattaforma e viene fornito con JDK/JRE, il compilatore non deve sapere da dove cercare.

+0

Grazie per la risposta. Le cose sono più chiare ora. –