程序如下:
package com.cl;public class HelloWorld { public static void main(String[] args) {
System.out.println("HelloWorld!");
}}环境变量设置:
PATH:.;C:\Program Files\Java\jdk1.5.0_15\bin
classpath:C:\Program Files\Java\jdk1.5.0_15\lib;E:\workspace\eclipsew\java;.;E:\workspace\java;HelloWorld.java在E:\workspace\java\com\cl下测试步骤如下:
1:
C:\Users\hp>javac com.cl.HelloWorld.java
错误:无法读取: com.cl.HelloWorld.java
1 错误2:
C:\Users\hp>e:3:
E:\workspace\java\com\cl>javac HelloWorld.java4:
E:\workspace\java\com\cl>java com.cl.HelloWorld
HelloWorld!5:
E:\workspace\java\com\cl>java HelloWorld
Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld (wrong nam
e: com/cl/HelloWorld)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$000(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)6:
C:\Users\hp>java com.cl.HelloWorld
HelloWorld!疑问:
步骤1里报的错是什么意思,我觉得环境变量没有问题呀,为什么会报这个错?
在源程序当前路径下为什么编译的时候不需要带包名,而运行的时候就得带上包名,不然就报异常,这是为什么?
package com.cl;public class HelloWorld { public static void main(String[] args) {
System.out.println("HelloWorld!");
}}环境变量设置:
PATH:.;C:\Program Files\Java\jdk1.5.0_15\bin
classpath:C:\Program Files\Java\jdk1.5.0_15\lib;E:\workspace\eclipsew\java;.;E:\workspace\java;HelloWorld.java在E:\workspace\java\com\cl下测试步骤如下:
1:
C:\Users\hp>javac com.cl.HelloWorld.java
错误:无法读取: com.cl.HelloWorld.java
1 错误2:
C:\Users\hp>e:3:
E:\workspace\java\com\cl>javac HelloWorld.java4:
E:\workspace\java\com\cl>java com.cl.HelloWorld
HelloWorld!5:
E:\workspace\java\com\cl>java HelloWorld
Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld (wrong nam
e: com/cl/HelloWorld)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$000(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)6:
C:\Users\hp>java com.cl.HelloWorld
HelloWorld!疑问:
步骤1里报的错是什么意思,我觉得环境变量没有问题呀,为什么会报这个错?
在源程序当前路径下为什么编译的时候不需要带包名,而运行的时候就得带上包名,不然就报异常,这是为什么?
如果我没有记错的话 环境变量我是这样配的:
classpath .;%JAVA_HOME%\lib;
JAVA_HOME F:\学习工具\java\Program Files\Java\jdk1.5.0_04\
path %JAVA_HOME%\bin;
C:\Users\hp>javac com.cl.HelloWorld.java =========
你咋不切换到源代码所在的路径下?
步骤1里报的错是什么意思,我觉得环境变量没有问题呀,为什么会报这个错? 答:你在C:\去编译E:\下面的某个路径下面的文件,后面那个文件的路径要给出绝对路径吧!!!你这个"com.cl.HelloWorld.java"是个相对路径吧!
在源程序当前路径下为什么编译的时候不需要带包名,而运行的时候就得带上包名,不然就报异常,这是为什么?
答:你在源文件当前路径下编译当然是不要代包名了,但是运行的时候:因为你的源程序里第一句话有了:package com.cl; 意思就是将编译好的二进制.class的文件放到:当前路径/com/cl下的cl文件夹里。当你运行的时候:
(1)你要是不加包名的话,他就去classpath路径下找路径下有没有HelloWorld.class这个二进制文件,没有就报错了。
(2)加了包名,就是在当前路径下的com.cl下面有那个编译好的HelloWorld.class二进制文件。不信话,你编译后,去在当前路径下会发现 多了个文件加com,在com文件夹里有个cl文件夹,cl文件夹里就有HelloWorld.class二进制文件!
classpath 是 class path 不是 java path
首先感谢你的回答!
经再多次尝试,发现在dos下用javac命令编译时是不能带包名的,需给出java文件绝对路径或在其祖先目录下给出相对目录
C:\Users\hp>javac e:\workspace\java\com\cl\HelloWorld.javaC:\Users\hp>e:E:\workspace\java\com\cl>javac com.cl.HelloWorld.java
错误:无法读取: com.cl.HelloWorld.java
1 错误
E:\workspace\java>javac com.cl.HelloWorld.java
错误:无法读取: com.cl.HelloWorld.java
1 错误E:\workspace\java>javac com\cl\HelloWorld.javaE:\workspace>javac java\com\cl\HelloWorld.java
我原先是理解错了,记得以前在一本书上看过classpath可以设置java默认工作环境,这样就不用进入到java源程序当前目录下了。
现在我的理解是
classpath是运行java程序时在classpath设置的路径下找类文件,
path是提供了javac.exe、java.exe等应用程序的路径,
但是我想问下有没有像设置一个你说的“java path”,这样编译的时候可以从其下找java文件
程序如下:
package com.cl; public class HelloWorld { public static void main(String[] args) {
System.out.println("HelloWorld!");
} } 环境变量设置:
PATH:.;C:\Program Files\Java\jdk1.5.0_15\bin
classpath:C:\Program Files\Java\jdk1.5.0_15\lib;E:\workspace\eclipsew\java;.;E:\workspace\java; HelloWorld.java在E:\workspace\java\com\cl下 测试步骤如下:
1:
C:\Users\hp>javac com.cl.HelloWorld.java
错误:无法读取: com.cl.HelloWorld.java
1 错误 2:
C:\Users\hp>e: 3:
E:\workspace\java\com\cl>javac HelloWorld.java 4:
E:\workspace\java\com\cl>java com.cl.HelloWorld
HelloWorld! 5:
E:\workspace\java\com\cl>java HelloWorld
这里的第5步,应该是可以运行成功的,我也做了试验。其实在classpath中你已经设置了“.”当前目录。那么第5步应该可以执行。
我测试的是不行的
E:\workspace\java\com\cl>java HelloWorld
Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld (wrong nam
e: com/cl/HelloWorld)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$000(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)E:\workspace\java\com\cl>java com/cl/HelloWorld
HelloWorld!E:\workspace\java\com\cl>java com.cl.HelloWorld
HelloWorld!