前言
javac是用来把后缀名为java的文件编译成class文件(字节码),然后java命令把对应的class文件执行就可以看到你程序里面定义的操作了.
首先我们知道classpath顾名思义就是class文件的路径,那-cp就是我们可以指定class文件的路径.
整篇文章的目的和主题只有一个就是弄明白classpath.
先看一个例子简单了解一下.
所有代码: 源代码
例子1
我的电脑目前执行echo $CLASSPATH是空,也就是说没有设置系统CLASSPATH.
首先创建一个文件夹TestClassPath我们所有的例子都会放到这个文件夹中.然后在文件夹下创建一个Test1.java内容如下:
import java.util.ArrayList;
import java.util.Arrays;
public class Test1 {
public static void main(String[] args) {
System.out.println("in Test1");
ArrayList list = new ArrayList<>(Arrays.asList(1,2,3,4,5));
for (int i : list) System.out.println("element:" + i);
}
}
至此目录结构如下:
.
└── Test1.java
执行javac Test1.java后目录如下:
.
├── Test1.class
└── Test1.java
执行java Test1后输出
in Test1
element:1
element:2
element:3
element:4
element:5
至此一个简单的例子就结束了,通过这一个例子我们应该知道了编译和执行的过程,但是却引出了一个问题
1.为什么CLASSPATH是空的时候javac也可以编译成功?难道不需要引入java.util.ArrayList类和java.util.Arrays类编译后的class文件吗?
The Java launcher, java, initiates the Java virtual machine. The virtual machine searches for and loads classes in this order:
Bootstrap classes - Classes that comprise the Java platform, including the classes in rt.jar and several other important jar files.
Extension classes - Classes that use the Java Extension mechanism. These are bundled as .jar files located in the extensions directory.
User classes - Classes defined by developers and third parties that do not take advantage of the extension mechanism. You identify the location of these classes using the -classpath option on the command line (the preferred method) or by using the CLASSPATH environment variable.
大概意思就是分三种类型的class文件:
Bootstrap classes: 是一些在rt.jar和一些其他jar包的class文件.
Extension classes:在JAVA_HOME/jre/lib/ext中jar包的class文件.
User Classes: 这个就是我们自己编译生成的class文件或者引入的第三方的class文件. 用-classpath(缩写-cp)来表示他们的路径.
再来一段:
It is relatively difficult to accidentally "hide" or omit the bootstrap classes.
In general, you only have to speci