何解:环境变量只设置了Path,没有设置ClassPath,照样能用java命令执行Application? 安装完1.4以上jre后,Windows下有一个常驻内存的jusched.exe进程,用于为java程序运行提供环境。你的程序只用了基本类,假如你使用了第三方的类,那末你也需要设置classpath,或者在运行时,在java命令行指定-classpath参数。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我用系统自带的进程任务管理器产看进程,但是没有发现你说的那个常驻内存的jusched.exe进程啊?另外你说的第三方的类,除了自己开发的类,包不包括JDK中的像tools.jar和dt.jar中的类呢?如果是这样,那我的程序只用到了基本类,那就完全可以不用设置ClassPath了。咳,刚开始接触Java时,为了成功运行一个HelloWorld程序简直被这些东西搞晕了,我想很多初学者都应该有这种体会。Java入门有点难度,这也是Java和其他程序语言的区别之一吧! 你这个程序只用c:\j2sdk1.4.2\jre\lib\rt.jar包。你检查你的文件目录,这个目录是在jre/lib/ext下的,你用System.out.println(System.getPropeties().getPropety("java.ext.dirs"));可以看到java的ext.dirs属性正是指向这一路径。java在寻找class的时候,会自动去找这个路径,你的rt.jar是放在这个路径下,所以不用添加到classpath中也可以找到它。 你这个程序只用c:\j2sdk1.4.2\jre\lib\rt.jar包。你检查你的文件目录,这个目录是在jre/lib/ext下的,--------------------------不太理解你的意思:),你是说rt.jar这个包在jre/lib/ext目录下也有吗?但是没有啊,jre/lib/ext目录下只有dnsns.jar,ldapsec.jar,localedata.jar,sunjce_provider.jar四个包。System.out.println(System.getPropeties().getPropety("java.ext.dirs"));------------------------------------我查了一下API 文档,应该是System.out.println(System.getProperties().getProperty("java.ext.dirs"));,呵呵,少了两个字母r。然后我用System.out.println(System.getProperties().getProperty("java.ext.dirs"));打印出来的结果是C:\j2sdk1.4.2\jre\lib\ext。咳,还是不太明白。我想估计是JVM搜寻到类的路径然后再自动加载的吧。 你设置了path就是使java这个外部命令执行时操作系统按你设置的那几个目录去查找java命令而你编译程序只要用到java和javac这两个命令 我的意思是,我没有设置ClassPath,javac和java是如何找到那些程序用到的类,并加载进去的。 jvm的类加载分三中方式:系统级别:rt.jar扩展级别:java_home/jre/lib/ext/目录下的jar文件应用级别:环境变量中的classpath或javac java中的参数指定java -classpath .. ...或者自己写ClassLoader加载。前面2中是JVM自动处理。其中第二种是为了处理Java的classpath灾难而提供的解决方案。 jusched.exe 是java 定期更新用的,不是提供运行环境,关了就行 怎么可能只用到基本类呢?只要是个程序都会自己封装一些类的,是不是就意味着要设置classpath呢? 谢谢大家的解答。但是我自己写的那个类,执行的时候又是怎么找到的呢?以前很多人都说,在设置ClassPath的时候加个.,表示当前目录,就可以找到你自己写的那个需要执行的类。但是我没有设置ClassPath,而且java运行的时候也没有加classpath等任何参数,那我自己定义的类jvm在执行的时候又是怎么找到的呢?困惑ing…… 自己的类是不用在classpath中申明的因为他在就在同一个project下,编译器在编译时首先会在当前工程所在的路径中寻找! SUN ONE 出的那本《JAVA 2 应用开发指南》中提到安装JDK 1.4.1时就只提到了改变环境变量 PATH 并没提到CLASSPATH 我刚接触JAVA的时候 运行结果都没出什么问题.. louisqiang(tenwin):前面2中是JVM自动处理。其中第二种是为了处理Java的classpath灾难而提供的解决方案。----------------------------------------------------------------------------------请问什么叫ClassPath灾难啊?xxben(001):自己的类是不用在classpath中申明的,因为他在就在同一个project下,编译器在编译时首先会在当前工程所在的路径中寻找!----------------------------------------------------------------------------------请问你这里的工程(Project)指的是什么意思?是不是指Java IDE里面的工程(Project)?我是直接在命令行下面用java执行的,没有建立工程(Project)。对于Path环境变量的理解,我没有问题。现在主要是对ClassPath环境变量还又点不太明白。用javac编译程序,和ClassPath有没有什么关联(我觉得是没有什么关联的)?有的话,是什么样的关联?另外javac的-classpath选项又是代表什么意思?javac的-classpath选项和java的-classpath选项的意思有没有什么异同?louisqiang(tenwin)::jvm的类加载分三种方式:系统级别:rt.jar扩展级别:java_home/jre/lib/ext/目录下的jar文件应用级别:环境变量中的classpath或javac java中的参数指定-classpath,或者自己写ClassLoader加载。----------------------------------------------------------------------------------那这样我觉得合理的解释就是:JVM在执行Java程序的时候,会自动加载程序用中需要的在rt.jar和其他java_home\jre\lib中包含的.jar文件中包含的Java基础类库和一些扩展类库。这些都是JVM自动处理的,对用户来说是透明的。如果Java程序中使用到了一些应用级别的类(如第三方的类),可以在javac和java中的-classpath选项中指定它们的搜索路径,或者是自己写ClassLoader加载,另外也可以设置ClassPath环境变量,在里面指定那些应用级别的类的搜索路径。设置ClassPath环境变量不是必须的,只是为了方便使用,设置了ClassPath,JDK就会按ClassPath制定的路径去搜索需要的应用级别的类,而不必每一次都使用-classpath选项或自己写ClassLoader。还有需要注意的就是:如果相关的类就在当前工作目录下的话,上面3种方法都可以不要,因为JDK系统会首先搜索会在当前的工作目录中搜索程序相关的类。(以上的这个是我自己参考大家给的解释而做的一个假设,不知道对不对:),见笑了,希望能有人出来给个权威的答案。如果没有的话,就先不管这些了,等以后更加深入以后或许自己会理解的,再次感谢大家的热情的解答:) 实际上 java 虚拟机是由 java luncher 初始化的, 也就是 java (或 java.exe)这个程序来做的. 虚拟机按以下顺序搜索并装载所有需要的类: 1, 引导类: 组成 java 平台的类, 包含 rt.jar 和 i18n.jar 中的类. 2, 扩展类: 使用 java 扩展机制的类, 都是位于扩展目录($JAVA_HOME/jre/lib/ext)中的 .jar 档案包. 3, 用户类: 开发者定义的类或者没有使用 java 扩展机制的第三方产品. 你必须在命令行中使用 -classpath 选项或者使用 CLASSPATH 环境变量来确定这些类的位置. 我们在上面所说的用户自己的类就是特指这些类. 这样, 一般来说, 用户只需指定用户类的位置, 引导类和扩展类是"自动"寻找的.当你的程序需要第三方的类库支持, 而且比较常用, 就可以采用此种方法.比如常用的数据库驱动程序, 写 servlet 需要的 servlet 包等等. 设置方法就是在环境变量中加入 CLASSPATH. 然后就可以直接编译运行了.而你的程序只用了些基础类,寻找时,就用不着必须设定它. 如何求一个int型数的绝对值? 高分请教大家一个snmp4j相关问题 drawArc和fillArc有什么区别 Jsp中监听的问题 各位可好那 HELP ME!!! 我用java写了个屏幕保护程序,有些问题请教! 多行字符串处理的问题 用 synchronized 关键字怎么没效果?请高手指点这一段小小小小的程序 怎样在JBuilder中开发接收邮件程序 (关乎饭碗100分)java中的窗体能不能一开起之后让其他任何程序的窗体都失去焦点,只等关闭此窗体后其他的窗体才能得到焦点 一个蛮经典的程序!
你检查你的文件目录,这个目录是在jre/lib/ext下的,
你用System.out.println(System.getPropeties().getPropety("java.ext.dirs"));可以看到java的ext.dirs属性正是指向这一路径。java在寻找class的时候,会自动去找这个路径,你的rt.jar是放在这个路径下,所以不用添加到classpath中也可以找到它。
你检查你的文件目录,这个目录是在jre/lib/ext下的,
--------------------------不太理解你的意思:),你是说rt.jar这个包在jre/lib/ext目录下也有吗?但是没有啊,jre/lib/ext目录下只有dnsns.jar,ldapsec.jar,localedata.jar,sunjce_provider.jar四个包。System.out.println(System.getPropeties().getPropety("java.ext.dirs"));
------------------------------------我查了一下API 文档,应该是System.out.println(System.getProperties().getProperty("java.ext.dirs"));,呵呵,少了两个字母r。然后我用System.out.println(System.getProperties().getProperty("java.ext.dirs"));打印出来的结果是C:\j2sdk1.4.2\jre\lib\ext。咳,还是不太明白。我想估计是JVM搜寻到类的路径然后再自动加载的吧。
而你编译程序只要用到java和javac这两个命令
我的意思是,我没有设置ClassPath,javac和java是如何找到那些程序用到的类,并加载进去的。
系统级别:rt.jar
扩展级别:java_home/jre/lib/ext/目录下的jar文件
应用级别:环境变量中的classpath或javac java中的参数指定java -classpath .. ...
或者自己写ClassLoader加载。前面2中是JVM自动处理。其中第二种是为了处理Java的classpath灾难而提供的解决方案。
只提到了改变环境变量 PATH 并没提到CLASSPATH
我刚接触JAVA的时候 运行结果都没出什么问题..
----------------------------------------------------------------------------------
请问什么叫ClassPath灾难啊?xxben(001):自己的类是不用在classpath中申明的,因为他在就在同一个project下,编译器在编译时首先会在当前工程所在的路径中寻找!
----------------------------------------------------------------------------------
请问你这里的工程(Project)指的是什么意思?是不是指Java IDE里面的工程(Project)?我是直接在命令行下面用java执行的,没有建立工程(Project)。对于Path环境变量的理解,我没有问题。现在主要是对ClassPath环境变量还又点不太明白。用javac编译程序,和ClassPath有没有什么关联(我觉得是没有什么关联的)?有的话,是什么样的关联?另外javac的-classpath选项又是代表什么意思?javac的-classpath选项和java的-classpath选项的意思有没有什么异同?louisqiang(tenwin)::
jvm的类加载分三种方式:
系统级别:rt.jar
扩展级别:java_home/jre/lib/ext/目录下的jar文件
应用级别:环境变量中的classpath或javac java中的参数指定-classpath,或者自己写ClassLoader加载。
----------------------------------------------------------------------------------那这样我觉得合理的解释就是:JVM在执行Java程序的时候,会自动加载程序用中需要的在rt.jar和其他java_home\jre\lib中包含的.jar文件中包含的Java基础类库和一些扩展类库。这些都是JVM自动处理的,对用户来说是透明的。如果Java程序中使用到了一些应用级别的类(如第三方的类),可以在javac和java中的-classpath选项中指定它们的搜索路径,或者是自己写ClassLoader加载,另外也可以设置ClassPath环境变量,在里面指定那些应用级别的类的搜索路径。设置ClassPath环境变量不是必须的,只是为了方便使用,设置了ClassPath,JDK就会按ClassPath制定的路径去搜索需要的应用级别的类,而不必每一次都使用-classpath选项或自己写ClassLoader。还有需要注意的就是:如果相关的类就在当前工作目录下的话,上面3种方法都可以不要,因为JDK系统会首先搜索会在当前的工作目录中搜索程序相关的类。(以上的这个是我自己参考大家给的解释而做的一个假设,不知道对不对:),见笑了,希望能有人出来给个权威的答案。如果没有的话,就先不管这些了,等以后更加深入以后或许自己会理解的,再次感谢大家的热情的解答:)
这个程序来做的. 虚拟机按以下顺序搜索并装载所有需要的类:
1, 引导类: 组成 java 平台的类, 包含 rt.jar 和 i18n.jar 中的类.
2, 扩展类: 使用 java 扩展机制的类, 都是位于扩展目录($JAVA_HOME/jre/lib/ext)
中的 .jar 档案包.
3, 用户类: 开发者定义的类或者没有使用 java 扩展机制的第三方产品. 你必须在
命令行中使用 -classpath 选项或者使用 CLASSPATH 环境变量来确定这些类的位置. 我
们在上面所说的用户自己的类就是特指这些类.
这样, 一般来说, 用户只需指定用户类的位置, 引导类和扩展类是"自动"寻找的.当你的程序需要第三方的类库支持, 而且比较常用, 就可以采用此种方法.比如常
用的数据库驱动程序, 写 servlet 需要的 servlet 包等等. 设置方法就是在环境变量中
加入 CLASSPATH. 然后就可以直接编译运行了.而你的程序只用了些基础类,寻找时,就用不
着必须设定它.