平时建立java工程都是借助eclipse或intellij这些ide编辑器来构建,对于java工程的实际编译执行原理,从未了解过。作为一个曾经的C++程序员,对于源码刨根问底的那份执着从未丢过。于是今天就写了这样的一个例子进行测试。
1.首先建立个跟目录MyJavaTest。
2.建立第一个MyJavaTest\src\com\common\sayHellojava,代码如下:
package com.common;
public class sayHello{
public void say(){
System.out.println("hello boy");
}
}
3.建立第二个java文件MyJavaTest\src\com\major\HelloWorld.java,代码如下:
package com.major;
import com.common.*;
public class HelloWorld{
public static void main(String[] args){
sayHello sayhello = new sayHello();
sayhello.say();
//System.out.println("hello boy");
}
}
4.在MyJavaTest跟目录下执行javac -d classes src\com\common\sayHello.java命令编译sayHello.java文件生成对应的class文件,并存放在classes\src\com\common\目录,这里的-d命令,不用解释,也知道是什么意思了吧,classes是自定目的路径。
5.接着执行javac -cp classes -d classes src\com\major\HelloWorld.java编译HelloWorld.java文件生成对应的class文件,并存放在classes\src\com\major\目录。
然后进入classes目录下,执行java com.major.HelloWorld。终于成功了。
编译HelloWorld.java需要引入sayHello这个类,同时还要 -cp classes表明classpath依赖路径为classes目录,告诉java编辑器到该目录下寻找sayHello类。不使用该命令,则需在环境变量里面添加classpath,但是这样,不同的工程构建,就需要改动一次其值,岂不是很麻烦。最后执行的时候,如何执行java HelloWorld会报错,因为HelloWorld属于com.major包下,这是我的一时疏忽,不过从报错的顺序里,我们可以看出java编辑器载入执行类是如何查找该类的。
至此,纠结我多日的这一困惑,终于得到解决了。