问题描述
测试代码为:d:abchello.javaJDK的环境变量都已经配置好了,在cmd的窗口下输入:javacd:abchello.java可以编译成功,生成hello.class但是,输入javad:abchello却运行不了,提示Exceptioninthread"main"java.lang.NoClassDefFoundError:。。。。。。后来,我在CMD窗口中更改当前目录为d:abc后,输入javahello就可以运行,为啥?
解决方案
解决方案二:
在环境变量里加上classpath=d:abc;如果原来有classpath就在值最前面加上d:abc;...(原来内容)...不用在CMD窗口中更改当前目录为d:abc就可以javahello
解决方案三:
如果hello.java里边是有package的话,编译的时候还需要使用javac-d.这样的参数来自动生成包路径
解决方案四:
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在内部使用newURLClassLoader(newURL[]).loadClass(...)方式加载类。它会把包名替换成子目录结构搜索Hello.class.按上面三种情况,我们的URL分别是file://D:/abc/test/main/Hello.classjar:file://D:/a.jar!/test/main/Hello.classjar: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的形式则很简单,至少我们要把这个跟操作系统相关的东西拿到真正要运行的时候从命令行输入而不是编译到代码中去。这样才可能“编译一次,到处运行”。
解决方案五:
在环境变量里加上classpath=d:abc;如果原来有classpath就在值最前面加上d:abc;...(原来内容)...
解决方案六:
是不是添加了package了的啊?
解决方案七:
纯属路过,打扰了