新手请教:关于路径的问题

yuehaiyang 2011-03-08 05:32:13
测试代码为:d:\abc\hello.java

JDK的环境变量都已经配置好了,在cmd的窗口下输入:javac d:\abc\hello.java可以编译成功,生成hello.class
但是,输入java d:\abc\hello却运行不了,提示Exception in thread "main" java.lang.NoClassDefFoundError:。。。。。。

后来,我在CMD窗口中更改当前目录为d:\abc后,输入java hello就可以运行,为啥?
...全文
144 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
NOHI 2011-03-08
  • 打赏
  • 举报
回复
jywbd 2011-03-08
  • 打赏
  • 举报
回复
纯属路过,打扰了
H602miss 2011-03-08
  • 打赏
  • 举报
回复
是不是添加了package 了的啊?
yuanyue0540 2011-03-08
  • 打赏
  • 举报
回复
在环境变量里加上
classpath = d:\abc;

如果原来有classpath 就在值最前面加上 d:\abc;...(原来内容)...
humanity 2011-03-08
  • 打赏
  • 举报
回复
Java 需要类路径 classpath。

Java 的包名是个名字空间,里面是相对目录,

当以 D:\abc 为根时, 如果你的类名是 test.main.Hello, 那么相对路径是 test/main。根是 file://D:/abc/
如果我们把这个打包成 D:\a.jar,相对路径还是 test/main,根是 jar:file://D:/a.jar!/
把文件放到网络服务器上构成分布式服务并自动从某个特定的位置的配置中读取 classpath,得到 classpath 路径后,它的根可能是 jar:http://localhost/a.jar!/

java 在内部使用 new URLClassLoader(new URL[]).loadClass(...) 方式加载类。它会把包名替换成子目录结构搜索 Hello.class.

按上面三种情况,我们的 URL 分别是
file://D:/abc/test/main/Hello.class
jar:file://D:/a.jar!/test/main/Hello.class
jar:http://localhost/a.jar!/test/main/Hello.class

对于依赖网络应用生存的 java 设计时对网络的考虑比传统程序更多,你如果想象一下要运行一个 Windows 程序是不是要事物下载 dll 到本地目录来运行呢? Java 设计时是不用先写到磁盘临时文件,直接在网络中读取立即加载都行,而且这些 URL 具体怎么拿到内容也是独立于 ClassLoader 这个类的,它是由这个 URL 协议对应的实现类的 URLStreamHandler 去做的,职能分离了给不同的类去实现。打包时就以不同的第三方 api 发布都行。

当我们指定了一大批各种各样的 classpath 时,就想象有一片森林,有多树根,java 按包类替换成子目录的规则在整个树中查找一个类的 class 文件。

这里的相对路径对于各种操作系统来说,JRE 提供的基础 API 负责解释怎么对应到具体操作系统的文件系统目录或jar路径或 http 路径等。让我们的应用程序独立出来,这样更适合跨平台。如果你写个程序都必须很小心在编译时是写成 C:/a.txt 还是 /home/userA/a.txt 再编译还是写成别的,这很麻烦。统一写成一个 URL 的形式则很简单,至少我们要把这个跟操作系统相关的东西拿到真正要运行的时候从命令行输入而不是编译到代码中去。这样才可能“编译一次,到处运行”。













awusoft 2011-03-08
  • 打赏
  • 举报
回复
如果hello.java里边是有package的话,编译的时候还需要使用
javac -d . 这样的参数来自动生成包路径
colachens 2011-03-08
  • 打赏
  • 举报
回复
在环境变量里加上
classpath = d:\abc;

如果原来有classpath 就在值最前面加上 d:\abc;...(原来内容)...

不用 在CMD窗口中更改当前目录为d:\abc 就可以 java hello


62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧