classpath在java中是一个绕不过去的坎,我之前的文章中讲过classpath是什么。
1:未打包前classpath就是项目结构中的src文件夹。
2:经过maven打包以后你会在idea中看见一份target文件夹,这里边的classes就是classpath。
3:当你真正运行jar包的时候,如果你要获取jar内的资源,最好使用class.getResource去最为锚点进行定位。
4:当你用java命令执行.class文件时时,当前目录也是classpath(注意:前提.class的源文件.java文件类不能有包名,如果有包名,必须严格按照包名结构存放.class文件,然后在包的最外层执行java命令)
classpath看起来很简单,但实际上要深刻体会并不容易。下边以一个java命令运行.class文件来理解一个classpath吧。
有时候我们需要直接用jdk提供的java命令来执行class文件让软件运行起来,特别是很多初学者,但经常会发现如下提示:
“错误:找不到或无法加载主类“
其实原因很简单,我们忽略了2个细节。
1.java指令默认在寻找class文件的地址是通过CLASSPATH环境变量中指定的目录中寻找的。
2.我们忽略了package的影响。
第一个问题好解决:
我们直接在CLASSPATH环境变量中加入“.;”即可。“.”的意思是搜索当前目录
第二个问题看下面分析:
前者无包名,后者有包名。前者直接执行javac会在目录下生成一个.class文件,直接使用java命令运行
(注意:不要带.class后缀),输出和hello world。
后者这样做会报错。
按照java规定,一个类的全名应该是包名+类名。所以应该按照package定义的路径来存放源文件。
即必须会后者创建一个org/will/app/main的文件夹,然后将类放进去编译。
重点来了!
你这个时候在/.../.../org/will/app/main下执行java NewsManager依然会报错。因为实际上,你执行的路径是:/.../.../org/will/app/main/org/will/app/main/NewsManager,因为类中包含了包名,所以重复了。你应该退出到org的上一级文件夹,执行java /app/main/NewsManager。成功输出hello world。
当然,你还有一个方法可以不需要回退org的上一级文件夹,你可以在运行时指定classpath。比如
java classpath /.../... /app/main/NewsManager
复制代码
这样也可以成功运行,输出hello world。
参考文章
https://www.cnblogs.com/wangxiaoha/p/6293340.html