在同事的电脑上写了个简单的helloworld.java,javac编译生成helloworld.class,再用java helloworld运行的时候提示ClassNotFoundException。(一滴汗)来看看是怎么回事
我们都知道安装jdk后,需要设置环境变量,PATH就不多说了。这里重点说说classpath。
先一起来看一看 java 程序的运行过程. 我们已经知道java是通过java虚拟机来解释运行的, 也就是通过java命令, javac 编译生成的 .class文件就是虚拟机要执行的代码, 称之为字节码(bytecode), 虚拟机通过classloader来装载这些字节码, 也就是通常意义上的类. 这里就有一个问题, classloader 从哪里知道 java 本身的类库及用户自己的类在什么地方呢?
指明classpath有三个方法,有着缺省值.(当前路径),或者要有一个用户指定的变量来表明, 这个变量就是类路径(classpath), 或者在运行的时候传参数给虚拟机.
运行命令:java -classpath d:\mylib;%classpath% com.MyClass
CLASSPATH为java加载类(class or lib)路径,一般在环境变量中声明设为:.;%JAVA_HOME%/lib/dt.jar;%JAVA_HOME%/lib/tools.jar (要加.表示当前路径)
此时如果你只是运行简单的helloworld程序,那么可以在.class文件的当前路径下运行命令 java com.MyClass 即可。classloader会先去机器的CLASSPATH找到目标类。
理解了原理,我来说说我遇到的问题,同事声明的CLASSPATH为%JAVA_HOME%/lib/dt.jar;%JAVA_HOME%/lib/tools.jar,少了缺省值.
而我只是运行了 java com.MyClass
显然classloader是加载不了MyClass类的,于是就有了ClassNotFoundException。那么,聪明的你一定知道解决方案了吧
我们都知道安装jdk后,需要设置环境变量,PATH就不多说了。这里重点说说classpath。
先一起来看一看 java 程序的运行过程. 我们已经知道java是通过java虚拟机来解释运行的, 也就是通过java命令, javac 编译生成的 .class文件就是虚拟机要执行的代码, 称之为字节码(bytecode), 虚拟机通过classloader来装载这些字节码, 也就是通常意义上的类. 这里就有一个问题, classloader 从哪里知道 java 本身的类库及用户自己的类在什么地方呢?
指明classpath有三个方法,有着缺省值.(当前路径),或者要有一个用户指定的变量来表明, 这个变量就是类路径(classpath), 或者在运行的时候传参数给虚拟机.
运行命令:java -classpath d:\mylib;%classpath% com.MyClass
CLASSPATH为java加载类(class or lib)路径,一般在环境变量中声明设为:.;%JAVA_HOME%/lib/dt.jar;%JAVA_HOME%/lib/tools.jar (要加.表示当前路径)
此时如果你只是运行简单的helloworld程序,那么可以在.class文件的当前路径下运行命令 java com.MyClass 即可。classloader会先去机器的CLASSPATH找到目标类。
理解了原理,我来说说我遇到的问题,同事声明的CLASSPATH为%JAVA_HOME%/lib/dt.jar;%JAVA_HOME%/lib/tools.jar,少了缺省值.
而我只是运行了 java com.MyClass
显然classloader是加载不了MyClass类的,于是就有了ClassNotFoundException。那么,聪明的你一定知道解决方案了吧