在最近学习Maven的过程中,对java是怎么编译和寻找对应的类加载做了一下实验。
1、实验环境:
用idea呈现结构,doc做为编译和运行
User类的属性:
WechatUtil类只有一个静态方法:
Main类:
直接运行Main的结果:
classes文件夹是装载编译后的文件,src是装在java的源文件。
2、javac:
javac命令编译.java源文件的时候,它会去寻找相关的import的类,如Main中引用了两个类,一个是util包中的WechatUtil类和entity包中的User类。编译Main.java时,它根据我们的-classpath路径去寻找相关的类,而-classpath默认是先从当前路径开始寻找。现在先看一下命令演示的结果:
我直接javac,输入Main.java的绝对路径去编译这个文件,它会报找不到其他的两个类,这是因为我javac的时候,路径填写的是src/edu/bnuz/,当前路径是在CP,而它需要的两个类的全限定名是cn.com.minstone下,在CP下,没有这个文件夹cn这个文件夹,所以找不到。
先进入src文件夹,再次编译,编译成功,这是因为当前文件夹为src,它能直接访问到另外的两个类
会发现,如果我们在命令行没有指定生成的.classes文件,它会默认在源文件的目录。
在这里,我想说明一个问题,当编译Main.java这个源文件的时候,它是会去寻找另外的两个类(.java或者.classes),如果没有.classes文件,则会寻找.java,例子中就是Main.java会去寻找WechatUtil.class这个文件,如果没有,则会寻找WechatUtil.java进行编译,而WechatUtil.java编译的时候又需要User.class文件,则会去找User.class文件,一直这样找下去。
下面做个实验,我先把刚编译好的.classes删除。
编译Main.java的时候 ,我用已经编译好的.class
可以看到,util包下没有了WechatUtil.class和entity包下没有User.class文件,就是因为我们指定了-classpath路径,让我们在编译Main.java的时候去该路径下寻找相关的.class,所以就不会去编译WechatUtil.java和User.java了。
3、java:
这个命令的用法和javac命令的用法很像,只是这里java命令后面跟随的文件名必须是全限定名,这这个edu.bnuz并不是路径的意思,因为我们jdk配置的就是默认在当前路径下去寻找.class,而我们当前路径是在src,并不是,在classes文件中,我们这里并没classes文件,所以也可以说明这个并不是路径,我们这里代表,我们去../classes下找edu.bnuz.Main,和找它依赖的类。
在做完实验后,想起我们在web打包部署放在webapp下的时候
tomcat启动,它是怎么知道加载哪个文件夹是放.class文件和我们的lib的。
如果我们把classes文件夹重命名或者把lib重命名,会怎么?找了相关资料
这只是换了一个问法而已,给出的答案是
其他的答案: