Java中——javac、java命令以及-classpath参数总结

在最近学习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重命名,会怎么?找了相关资料


这只是换了一个问法而已,给出的答案是


其他的答案:



  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值