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

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

编译问题

描述

  • 编写一个package inheritance,里面包含三个文件Employee.java、ManagerDemo.java、Manager.java
  • main方法包含在ManagerDemo.java里面,具体代码如下所示:
    Java继承——Javac与java路径搜索_第1张图片
  • 在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)

你可能感兴趣的:(Java基础,Unix平台)