How does the java compiler find the class files wh

2020-03-17 04:05发布

问题:

I'm trying to look under the hood about java compilation. So I put my IDE away and started using MS-DOS command-line...

I created a simple project, as described in the tree below :

SampleApp

|____**src**

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

This is the Sample.java source code :

public class Sample 
{

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

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

I just want to compile this class, so I used the javac command :

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

All works fine, but i didn't expect that because I deleted my CLASSPATH environment variable before compiling my Sample.java file. So I was expecting a compiler error due to the fact that the compiler would not be able to find the java.lang.String class file.

I read this article http://www.ibm.com/developerworks/java/library/j-classpath-windows/ which helped me understand many things. The article author says that the default classpath is the current working directory. But I don't understand why my source code compile without error. Could someone explain this to me?

回答1:

So I was expecting a compiling error due to the fact that the compiler would not be able to find the java.lang.String class file.

The short answer is that the compiler knows where to find all of the standard Java SE library classes without you telling it.

The longer answer is that String class is being found on the bootclasspath. This is implicitly set by the javac command to refer to the relevant JARs in the JDK installation. The javac command searches the bootclasspath before it looks for stuff on the regular classpath.



回答2:

The classpath variable doesn't do what you think. To cite the oracle documentation:

The CLASSPATH variable is one way to tell applications, including the JDK tools, where to look for user classes. (Classes that are part of the JRE, JDK platform, and extensions should be defined through other means, such as the bootstrap class path or the extensions directory.)

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

Basically since java.lang.* is part of the platform and delivered with the JDK/JRE, the compiler doesn't have to be told by you where to look for them.