java中classpath_java中的classpath

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环境变量中加入“.;”即可。“.”的意思是搜索当前目录

第二个问题看下面分析:

ae61d534a54b13a127930c303cd789ce.png

3f42eb05074fb05790b73ffc3595d72a.png

前者无包名,后者有包名。前者直接执行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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值