关于javac对类文件的查找问题

javac命令以下面两种方式使用类文件
1.运行javac命令本身需要加载一些类文件,这些类文件都是jdk里自带的,比如tools.jar
2.在编译源代码时,如果源代码中引用了其他的的类或接口,javac需要加载对应的类文件来获取信息。这样的类文件有.java文件和.class文件两种形式。比如在编译下面的Test类时,需要先查找到ITest接口类,需要获取ITest接口信息。

Test类代码

package main.java;
import main.java.ITest;
public class Test implements ITest{
    public void say(){
        System.out.println("hello world!");
    }
    public static void main(){
        new Test().say();
    }
}

ITest接口代码

package main.java;
public interface ITest{
    public void say();
} 

在查找ITest的过程中有如下几种情况:

如果只找到了ITest.java,则编译之,并使用编译生成的ITest.class文件
如果只找到了ITest.class,则直接使用之
如果既找到了ITest.java又找到了ITest.class,则javac会比较.java文件和.class文件的时间戳,如果.java文件版本更高,则编译.java文件并使用生成的.class文件。

下面说说类查找路径问题(从哪里找类文件)

javac命令会从Bootstrap classes,Extension classes,User classes三个位置去寻找类文件。下面说说这三个位置是如何设置的。
Bootstrap classes:默认是jdk安装目录下rt.jar以及jar/lib目录下的几个jar包中的.class文件,可通过 javac中的-bootclasspath选项来设置。
Extension classes:默认是jdk安装目录下jre/lib/ext目录下jar包中的.class文件,可以通过javac中的-extdirs选项来设置。
User classes:默认是当前目录下的.class或.java文件。有如下几种设置方式
设置CLASSPATH环境变量(想想百度里的小白安装jdk教程吧),这种设置通常作为一个默认设置。
通过javac的-cp或-classpath选项来设置,例如命令为:javac -cp D:/my/classess;D:/my/xxx.jar,则会从-cp指定的目录下查找.class和.java文件。
另外可以通过-sourcepath单独指定.java文件的查找路径(一般用不到)。例如命令为:javac -cp D:/my/classess;D:/my/xxx.jar -sourcepath D:/my/src/main;D:/my/src/test。此条命令会让javac从-cp指定的目录下查找.class文件,从-sourcepath指定的目录下查找.java文件。

像eclipse这种ide,会根据项目里的构建路径,jvm等配置来生成javac或java命令需要的选项参数,然后执行该命令,做到一键编译,一键启动。

你可能感兴趣的:(java,javac)