Java继承——Javac与java路径搜索

本文探讨了在Java中编写带有包的程序时遇到的编译和运行问题,特别是关于如何正确配置CLASSPATH以确保程序可以成功编译和运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在编写Package的时候遇到了could not find main class的问题,根源在与javac和java路径搜索,所以,对于javac编译器和java虚拟机的搜索路径中的相关概念进行梳理一番,需要注意的是编译和运行是分开来叙述的。相关解释可查找《Java核心技术 卷一》类路径一节。

编译问题

描述
  • 编写一个package inheritance,里面包含三个文件Employee.java、ManagerDemo.java、Manager.java
  • main方法包含在ManagerDemo.java里面,具体代码如下所示:
    Java
  • 在inheritance文件目录下编译文件
    javac ManagerDemo.java
  • 编译不通过,错误
    cannot find symbol……
  • 如果想要编译通过只有
    javac *.java
原因和解决方法
  • 原因:此时javac所在路径为./inheritance/,在编译ManagerDemo.java的时候,因为源代码文件中的package inheritance的缘故javac编译器会寻找inheritance.Manager和inheritance.Employee。涉及到一个full-qualified class name的概念。因此,javac编译器正处在inheritance目录下,是无法找到Manager和Employee的类文件的
  • 解决方法:
    1. 取巧的解决办法:在CLASSPATH中添加路径“..”,这样javac会搜索到上一级目录,并且找到inheritance目录,再从该目录找到Manager和Employee,说起来是一个很不智能的过程。
    2. 将inheritance当作根目录下,使用指令
      javac ./inheritance/ManagerDemo.java
  • 原理:javac编译器会根据CLASSPATH中设置的值来搜索相应的.class和.java文件,当java文件当中有package xxx的时候,javac的搜索路径会对应增加一条xxx

运行问题

描述
  • 在编译通过之后,在inheritance目录下运行ManagerDemo,会出现运行错误:
    java ManagerDemo
原因及解决方法
  • 假设在inheritance所在目录下,因为ManageDemo中package inheritance的缘故,此时ManagerDemo的全称应该是inheritance.ManagerDemo。
  • 修改名称即可运行:
    javac inheritance.ManagerDemo

遗留问题

  • 在《Java核心技术 卷一》中第141页中提到,javac编译器不同于java虚拟机的一个地方是:javac编译器总是在当前的目录中查找文件,但Java虚拟机仅在CLASSPATH中有“.”的时候才搜索当前路径,但是实际操作中,当删除了CLASSPATH变量中的“.”,javac会出现编译错误。(使用的javac版本为1.8.0_111)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值