欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

同一包下的两个java文件,其中一个被另一个引用,命令行下执行javac编译命令提示被调用类找不到

程序员文章站 2022-04-14 09:29:35
...

每个学习java的人在写第一个HelloWord.java之前,都会按照网上的操作,先安装jdk,配置环境变量,用记事本编写java源文件代码,然后cmd命令窗口编译,执行,打包等一系列操作。。。但是如果你cmd窗口执行java -version/javac /java 等命令时,提示:“不是内部或外部命令,也不是可运行的程序或批处理文件” 那必然是你环境变量设置的不对,乖乖回去检查环境变量设置。
我们都知道设置环境变量,但是有很多人并不知道为什么要这么设置,他们的作用又是什么?

1,JAVA_HOME 顾名思义就是java的安装根目录比如C:\Program Files\Java\jdk1.8.0_202 ,其实此变量是否设置没有多少关系,但是往往设置是为了设置path和CLASSPATH 用的,这样的好处是,你更新了多个版本的jdk,你只需要修改JAVA_HOME一个参数就行了,后两个参数都是相对路径。这点有点像java的方法封装。

2,path的作用是让某个程序的可执行文件可以在任何盘符的位置可以直接执行,在java安装目录的bin目录下有很多可执行文件,比如我们编译用的javac,执行用的java以及很多java命令都在里面,当我们设置了java的path路径后,命令行中不管你在盘符的哪个位置,执行javac 都会先去path下设置的各个路径下找是否有javac可执行程序(这是操作系统机制)。

3,CLASSPATH:作用是指定类搜索路径,要使用已经编写好的类,前提当然是能够找到它们了,java虚拟机就是通过CLASSPTH来寻找类的,重点来了:为什么我们设置的时候 加了".;" 意思就是优先在当前路径下找被调用文件,但是很多人对这个当前路径理解错误,这个当前路径是指:执行命令行时所在的盘符

废话一堆,来说今天的问题:
新建两个类:
Test.java


public class Test {
	public static void main(String[] args) {
		HelloWorld hello = new HelloWorld();
		hello.print();
	}
}

HelloWord.java


public class HelloWorld {
    public void print() {
    	System.out.println("Hello World");
    }
}

将两个文件都放到G:\code文件夹下,打开命令行执行命令:
同一包下的两个java文件,其中一个被另一个引用,命令行下执行javac编译命令提示被调用类找不到
我们前边讲到classpath优先在当前目录查找被调用类,当前目录是“C:\Users\12103” 这个目录下并没有我们要找的文件HelloWorld
既然知道问题的原因了,解决方式有两种
1,由于两个文件在同一目录下,那么我们可以进入这两个文件所在目录,再执行编译命令(这里有个前提,如果本身没在环境变量中classpath加上“.;”编译也会报错,因为你没让它在当前目录里找):
同一包下的两个java文件,其中一个被另一个引用,命令行下执行javac编译命令提示被调用类找不到
2,我们可以指定查找被调用类的路径:

①,设置环境变量里的CLASSPATH,由于我们文件放置的位置不固定,又或者我们的源代码分属各个包下,如果每次都去设置环境变量显然是不可取的(pass掉)

②,设置临时变量
同一包下的两个java文件,其中一个被另一个引用,命令行下执行javac编译命令提示被调用类找不到
③,在命令行窗口中,执行javac或者javac -help
会看到“ -cp <路径> 指定查找用户类文件和注释处理程序的位置” 意思就是说,此参数可以查找类文件,顾名思义,其实这就是classpath的简写,也是临时指定classpath的一种方式
同一包下的两个java文件,其中一个被另一个引用,命令行下执行javac编译命令提示被调用类找不到
假如说被调用的文件和被编译的源文件不在同一个文件夹下,比如HelloWord文件在G盘根目录下,那我编译的时候,应该是:
同一包下的两个java文件,其中一个被另一个引用,命令行下执行javac编译命令提示被调用类找不到
总结:之所以出错是我们了解不够深入,java学习就得多看,多学,多练,最不怕的就是出问题,出问题是你学习研究的机会,但不要脚两次踏入同一条河流!共勉

相关标签: java javac cmd