深入探讨、理解Java的CLASSPATH
Java本质部分

Java本质部分:CLASSPATH是什么?假设你在C:\workspace下写了个HelloWorld.java,并顺利使用编译器javac将之编译为HelloWorld.class,在不切换路径的情况下,可以直接执行java HelloWorld来加载HelloWorld.class并运行当中所定义的行为。
如果你切换到C:\底下或是其它路径底下,那么该如何加载HelloWorld.class并执行呢?以下并不是正解:java C:\workspace\HelloWorld首先你要知道java这个指令是作什么用的?执行java,其实就是启动JVM,之后接下类别名称,表示由JVM载入该类别的.class并执行。
在PATH 是什么?中提过,当你在实体操作系统下执行某个指令时,操作系统会依PATH中的路径信息,试图找到可执行的档案(例如对Windows来说,就是.exe、.bat,对Linux等就是有执行权限的档案)。
在为什么需要 JVM?中则提过,JVM是Java程序唯一认得的操作系统,对JVM来说,可执行档就是扩展名为.class的档案。
当你要想在JVM中执行某个它的可执行档(.class)时,则JVM 会依CLASSPATH中的路径信息来寻找。
作个简单的比照,可以很清楚地对照PATH与CLASSPATH:实体操作系统依PATH中的路径信息来寻找可执行指令(对Windows就是.exe、.bat等,对Linux 等就是有执行权限的档案)。
JVM(虚拟操作系统)依CLASSPATH中的路径信息来寻找可执行指令(.class档案)。
如何在启动JVM时告知可执行档(.class)的位置?可以使用-classpath自变量来指定:java -classpath c:\workspace HelloWorld指定可执行档(.class)时,不用加上.class扩展名,这跟在Windows下执行javac时,不用特别再加上扩展名(javac.exe)是类似的。
java环境变量path和classpath的配置

java环境变量path和classpath的配置在Java的学习中,涉及到两个系统环境变量path和classpath⼀. path环境变量path环境变量是系统环境变量的⼀种,它⽤于保存⼀系列的路径,每个路径之间⽤分号分隔。
当在命令⾏窗⼝运⾏⼀个可执⾏⽂件时,操作系统⾸先会在当前⽬录下查找是否存在该⽂件,如果不存在会继续在path环境变量中定义的路径下寻找这个⽂件,如果仍未找到,系统会报错。
在Windows7系统下配置环境变量:1.右击【计算机】,选择【属性】,出现如下界⾯: 图12.点击【⾼级系统设置】,出现如下界⾯:图23.点击【环境变量】,出现如下界⾯:图34.选中path系统变量,点击【编辑】,出现如下界⾯:图45.将你JDK的安装⽬录bin⽂件夹路径复制下来,如下图: 图56.将复杂的bin路径粘贴到path值⾥⾯,注意末尾⽤英⽂半⾓符号(;),如下图:图6然后,点击【确定】,以及图3的【确定】,图2的【应⽤】就可以了。
7.下⾯验证环境变量配置是否成功,在命令⾏中输⼊javac,出现下图所⽰就成功了。
⼆. classpath环境变量classpath环境变量也⽤于保存⼀系列路径,它和path环境变量的查看与配置的⽅式完全相同。
当Java虚拟机需要运⾏⼀个类时,会在classpath环境变量中所定义的路径下寻找所需的class⽂件。
从JDK5.0开始,如果classpath环境变量没有进⾏配置,Java虚拟机会⾃动将其设置为".",也就是当前⽬录。
所以,⼀般classpath不需要配置。
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
java -classpath 参数

Java -classpath参数是Java编程中常用的一种参数,它用于指定Java程序中使用到的类库及其相关文件的位置。
它有助于程序开发者管理项目中调用的类库,减少重复编写相同的代码,从而提高编程效率。
Java -classpath参数的使用非常简单,只需要在编译或运行程序时将-classpath参数添加到命令中,并将调用的相关文件的路径作为参数值添加进去即可。
具体的命令格式如下:java -classpath path1:path2:path3...其中,path1:path2:path3等为要添加的类库文件所在的路径,多个路径之间用“:”分隔开。
例如,要添加一个log4j.jar文件,它位于/home/usr/lib/log4j.jar,那么它的添加命令如下:java -classpath /home/usr/lib/log4j.jarJava -classpath参数不仅仅可以添加单个文件,还可以添加整个目录,只需要在目录后面加上“/*”即可。
例如,要添加/home/usr/lib目录下的所有文件,命令如下:java -classpath /home/usr/lib/*此外,Java -classpath参数还可以使用CLASSPATH环境变量来指定,此时只需要在编译或运行程序时将-classpath参数去掉即可,例如:java这样,程序就会自动使用CLASSPATH环境变量中指定的路径来查找并加载所需要的类库文件。
总之,Java -classpath参数是Java编程中常用的一种参数,它可以帮助我们更加有效地管理项目中调用的类库,减少重复编写代码,从而提高编程效率。
classpath与package详解

本文实例运行的环境是在Windows XP + JDK 1.5.0。
对其他的环境,读者应该很容易进行相应的转换。
1. 下载并安装JDK1.5.0,并按默认路径,安装到C:\Program Files\Java\jdk1.5.0中。
2. 用鼠标单击WindowsXP的“开始”->“运行”,在弹出的运行窗口中输入cmd,按确定或回车,打开一个命令行窗口。
3. 在命令行中输入:java有一列长长的洋文滚了出来,这是JDK告诉我们java这个命令的使用方法。
其中隐含了一个重要信息,即JDK安装成功,可以在命令行中使用java此命令了。
4. 在命令行中输入javac屏幕显示:'javac' 不是内部或外部命令,也不是可运行的程序或批处理文件。
这是由于windows找不到javac这个命令的原因。
这就不明白了,java与javac都是JDK在同一个子目录里面的两个文件,为什么可以直接运行java而不能直接运行javac呢?原来,Sun公司为了方便大家在安装完JDK后马上就可以运行Java类文件,在后台悄悄地将java 命令加入了Path的搜索路径中,因此我们可以直接运行java命令(但我们是看不到它到底是在哪设置的,无论是在用户的Path或系统的Path设置中均找不到这个java存放的路径)。
但Sun所做的到此为止,其他JDK的命令,一概不管,需要由用户自己添加到搜索路径中。
5. 既然如此,那我们自己添加Path的搜索路径吧。
对“我的电脑”按右键,选“属性”,在“系统属性”窗口中选“高级”标签,再按“环境变量”按钮,弹出一个“环境变量”的窗口,在用户变量中新建一个变量,变量名为“Path”,变量值为"C:\Program Files\Java\jdk1.5.0\bin;%PA TH%"。
最后的%PATH%的意思是说,保留原有的Path设置,且将目前的Path设置新加到其前面。
关于Java的path,classpath,java_home环境变量的配置与具体含义

关于Java的path,classpath,java_home环境变量的配置与具体含义关于Java的path,classpath,java_home环境变量的配置与具体含义对于⼀个Java初学者来说,第⼀步要做的是安装jdk并配置环境变量,⼀般按照书上或者⽹上的步骤,⼀步步照着做就⾏了,但是对于初学者来说,很多问题没有解决,⽐如为什么很多配置⽅法各不相同,却都能够配置成功?⽽且很少有⼈能够解释清楚path,classpath,java_home的含义是什么。
我刚学Java的时候也是⼀头雾⽔,随着学习的深⼊,逐渐了解了这些变量的含义,在此,把我的⼀些想法和收获与⼤家分享。
⾸先,我们先来看⼀下通过cmd对Java⽂件的执⾏步骤。
我之前在E盘Java⽂件夹下保存了HelloWorld.java⽂件,下⾯使⽤这个⽂件进⾏⽰范。
⾸先跳转到Java⽂件夹⽬录下然后使⽤javac命令对HelloWorld.java⽂件进⾏编译,此时当前⽬录下会⾃动⽣成⼀个HelloWorld.class⽂件。
这⼀指令的含义是操作系统调⽤⼀个名为javac.exe的应⽤程序对HelloWorld.java⽂件进⾏处理,处理结果保存在⼀个名为HelloWorld.class⽂件的⽂件中。
然后我们使⽤java命令对HelloWorld.class⽂件进⾏执⾏,屏幕上显⽰出“Hello World!”,表⽰执⾏成功。
这⼀指令的含义是操作系统调⽤⼀个名为java.exe的应⽤程序对HelloWorld.class⽂件进⾏处理(⽂件的后缀.class应省略掉)。
执⾏结果出现在屏幕上。
现在我们有⼀个疑问,系统是如何找到并调⽤javac.exe和java.exe两个应⽤程序的?打个⽐⽅,平时我们运⾏某⼀程序,⽐如魔兽,酷狗⾳乐,都是先找到它们的应⽤程序war3.exe和kugou.exe的所在位置,然后双击运⾏。
那么操作系统是如何⾃动找到javac.exe和java.exe的位置呢?这就是path环境变量的作⽤。
JavaWeb项目中classpath路径详解

JavaWeb项⽬中classpath路径详解在使⽤ssh等框架开发web程序时配置⽂件(xml和properties)存放的路径⼀般为src下,当部署程序时则必须存在于classes路径下,具体如下src不是classpath, WEB-INF/classes,lib才是classpathWEB-INF/ 是资源⽬录, 客户端不能直接访问,这话是没错,不过现在的IDE编译器在编译时会把src下的⽂件(是⽂件,不是.java)移到WEB-INF/classes下。
不过值得注意的是,spring配置⽂件⾥这个locations是uri表⽰,也就是说你写的jdbc.properties是当前相对路径,要访问classpath记得要这样写:<value>classpath:jdbc.properties</value>⾸先classpath是指WEB-INF⽂件夹下的classes⽬录解释classes含义:1.存放各种资源配置⽂件 eg.init.properties log4j.properties struts.xml2.存放模板⽂件 eg.actionerror.ftl3.存放class⽂件对应的是项⽬开发时的src⽬录编译⽂件⼩结:这是⼀个定位资源的⼊⼝如果你知道开发过程中有这么⼀句话:惯例⼤于配置那么也许你会改变你的想法对于第⼆个问题这个涉及的是lib和classes下⽂件访问优先级的问题: lib>classes对于性能的影响应该不在这个范畴classpath 和 classpath* 区别:classpath:只会到你的class路径中查找找⽂件;classpath*:不仅包含class路径,还包括jar⽂件中(class路径)进⾏查找.⾸先这个是web.xml⽅式定义参数传给Servlet。
因此,<param-value></param-value>的解释是接收这个参数的servlet执⾏的。
java项目中classpath的理解

java项⽬中classpath的理解在java项⽬中,你⼀定碰到过classpath,通常情况下,我们是⽤它来指定配置/资源⽂件的路径。
在刚开始学习的时候,⾃⼰也糊⾥糊涂,但是现在,是时候弄清楚它到底是指什么了。
顾名思义,classpath就是class的path,也就是类⽂件(*.class的路径)。
⼀谈到⽂件的路径,我们就很有必要了解⼀个java项⽬(通常也是web项⽬)它在真正运⾏时候,这个项⽬内部的⽬录、⽂件的结构;这样,我们才好分析、理解classpath。
开发时期的web项⽬结构下⾯,我以⼀个ssm的项⽬为例,我先把开发时候的项⽬的⽬录结构图放出来。
根据maven的约定,⼀般我们的项⽬结构就像下⾯这样。
classpath⽤在哪⾥了?⽽我们经常⽤到classpath的地⽅,就是在指定⼀些配置/资源⽂件的时候会使⽤到。
⽐如说,我们在web.xml中指定springmvc 的配置⽂件,如下图,我们使⽤:classpath:entry/dev/spring-mvc.xml;再⽐如,当我们把*Mapper.xml⽂件放在了main/java/../mapping/⽂件夹下时,在mybatis的配置⽂件中配置其位置,我们使⽤:classpath*:**/mapper/mapping/*Mapper.xml很显然,上⾯这2个classpath的配置,是为了告诉配置⽂件,去哪⾥寻找我们要指定的配置⽂件。
要想弄清楚为什么是上⾯这样写的,我们就要来看看项⽬运⾏时(或者是发布后)的⽬录结构了。
web项⽬发布后的⽬录结构我们使⽤IDEA对项⽬进⾏打包,⼀种是war包,⼀种是explorer的⽂件夹,war包解压后就是explorer了。
我们来对解压后的⽬录结构进⾏分析。
经过对⽐,我们要注意到,开发时期的项⽬⾥,src/main/下⾯的java和resources⽂件夹都被(编译)打包到了⽣产包的WEB-INF/classes/⽬录下;⽽原来WEB-INF下⾯的views和web.xml则仍然还是在WEB-INF下⾯。
关于classpath

关于classpath刚学Java那会⼉,配置Java开发环境,⽹上查找的教程都会教你如何配置JAVA_HOME以及CLASSPATH环境变量。
然⽽,CLASSPATH其实是⽆需配置的。
Java程序使⽤到的类⽂件可以分为三类:启动类(Bootstrap classes):组成Java平台的类,包括rt.jar以及其他⼀些重要jar⽂件;扩展类(Extension classes):${JAVA_HOME}/jre/lib/ext下⾯的jar包;⽤户类(User classes):开发者⾃⼰编写的类。
对应这三类class⽂件,Java中有三种类加载器:启动类加载器扩展类加载器应⽤程序类加载器⼀般⽽⾔,对于启动类和扩展类我们⽆需做任何配置,JVM会⾃动地找到这些类。
当然,对于启动类,也可以使⽤java -Xbootclasspath:<path>来⾃⾏⾃定加载的路径,不过我们⼏乎不会这样做。
对于⽤户⾃定义的类:如果不做任何配置,默认会从.路径,也就是当前路径下查找;如果使⽤形如java -classpath "a/b/lib;c/xx.jar"的参数,则会从指定的路径或jar包下查找,注意会覆盖掉.路径;当然,如果设置了CLASSPATH也会从其设定值对应路径下查找。
使⽤CLASSPATH来设置⽤户类的查找路径是不推荐的做法,因为这会污染系统环境变量,不同的Java程序查找到相同的⽤户类,⽽通常不同程序定义的类应该相互隔离。
最后,如果想要查看当前Java程序所使⽤的到的类路径,可以命令⾏输⼊jinfo <pid>,找到java.class.path对应的项;sun.boot.class.path则会列出启动类路径。
下⾯是⼀个查看⽰例:。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
深入探讨、理解Java的CLASSPATH来源: 本站原创从表面上看,Java的classpath(类路径)很简单,但一直以来它都是一个产生问题和混乱的根源。
本文介绍classpath的基本知识、可能产生的问题,并提供了一个简单的classpath管理工具。
和Java类路径(classpath)打交道的过程中,开发者偶尔会遇到麻烦。
这是因为,类装载器实际装入的是哪一个类有时并不显而易见,当应用程序的classpath 包含大量的类和目录时,情况尤其严重。
本文将提供一个工具,它能够显示出被装入类文件的绝对路径名。
一、Classpath基础Java虚拟机(JVM)借助类装载器装入应用程序使用的类,具体装入哪些类根据当时的需要决定。
CLASSPATH环境变量告诉类装载器到哪里去寻找第三方提供的类和用户定义的类。
另外,你也可以使用JVM命令行参数-classpath分别为应用程序指定类路径,在-classpath中指定的类路径覆盖CLASSPATH环境变量中指定的值。
类路径中的内容可以是:文件的目录(包含不在包里面的类),包的根目录(包含已打包的类),包含类的档案文件(比如.zip文件或者.jar文件)。
在Unix家族的系统上,类路径的各个项目由冒号分隔,在MS Windows系统上,它们由分号分隔。
类装载器以委托层次的形式组织,每一个类装载器有一个父类装载器。
当一个类装载器被要求装载某个类时,它在尝试自己寻找类之前会把请求先委托给它的父类装载器。
系统类装载器,即由安装在系统上的JDK或JRE提供的默认类装载器,通过CLASSPATH环境变量或者-classpath这个JVM命令行参数装入第三方提供的类或者用户定义的类。
系统类装载器委托扩展类装载器装入使用Java Extension机制的类。
扩展类装载器委托自举类装载器(bootstrap class loader)装入核心JDK类。
你可以自己开发特殊的类装载器,定制JVM如何动态地装入类。
例如,大多数Servlet引擎使用定制的类装载器,动态地装入那些在classpath指定的目录内发生变化的类。
必须特别注意的是(也是令人吃惊的是),类装载器装入类的次序就是类在classpath中出现的次序。
类装载器从classpath的第一项开始,依次检查每一个设定的目录和压缩文件,尝试找出待装入的类文件。
当类装载器第一次找到具有指定名字的类时,它就把该类装入,classpath中所有余下的项目都被忽略。
看起来很简单,对吧?二、可能出现的问题不管他们是否愿意承认,初学者和富有经验的Java开发者都一样,他们都曾经在某些时候(通常是在那些最糟糕的情形下)被冗长、复杂的classpath欺骗。
应用程序所依赖的第三方类和用户定义类的数量逐渐增长,classpath也逐渐成了一个堆积所有可能的目录和档案文件名的地方。
此时,类装载器首先装载的究竟是哪一个类也就不再显而易见。
如果classpath中包含重复的类入口,这个问题尤其突出。
前面已经提到,类装载器总是装载第一个它在classpath中找到的具有合适名字的类,从实际效果看,它“隐藏”了其他具有合适名字但在classpath中优先级较低的类。
如果不小心,你很容易掉进这个classpath的陷阱。
当你结束了一天漫长的工作,最后为了让应用程序使用最好、最新的类,你把一个目录加入到了classpath,但与此同时,你却忘记了:在classpath的另一个具有更高优先级的目录下,存放着该类的另一个版本!三、一个简单的classpath工具优先级问题是扁平路径声明方法与生俱来固有的问题,但它不是只有Java的classpath才有的问题。
要解决这个问题,你只需站到富有传奇色彩的软件巨构的肩膀上:Unix操作系统有一个which命令,在命令参数中指定一个名字,which 就会显示出当这个名字作为命令执行时执行文件的路径名。
实际上,which命令是分析PATH变量,然后找出命令第一次出现的位置。
对于Java的类路径管理来说,这应该也是一个好工具。
在它的启发之下,我着手设计了一个Java工具JWhich。
这个工具要求指定一个Java类的名字,然后根据classpath的指引,找出类装载器即将装载的类所在位置的绝对路径。
下面是一个JWhich的使用实例。
它显示出当Java类装载器装载com.clarkware.ejb.ShoppingCartBean类时,该类第一次出现位置的绝对路径名,查找结果显示该类在某个目录下:> java JWhich com.clarkware.ejb.ShoppingCartBeanClass 'com.clarkware.ejb.ShoppingCartBean' found in'/home/mclark/classes/com/clarkware/ejb/ShoppingCartBean.class'下面是第二个JWhich的使用实例。
它显示出当Java类装载器装载javax.servlet.http.HttpServlet类时,该类第一次出现位置的绝对路径名,查找结果显示该类在某个档案文件中:> java JWhich javax.servlet.http.HttpServletClass 'javax.servlet.http.HttpServlet' found in'file:/home/mclark/lib/servlet.jar!/javax/servlet/http/HttpServlet.class'四、JWhich的工作过程要精确地测定classpath中哪一个类先被装载,你必须深入到类装载器的思考方法。
事实上,具体实现的时候并没有听起来这么复杂——你只需直接询问类装载器就可以了!1: public class JWhich {2:3: /**4: * 根据当前的classpath设置,5: * 显示出包含指定类的类文件所在6: * 位置的绝对路径7: *8: * @param className <类的名字>9: */10: public static void which(String className) {11:12: if (!className.startsWith("/")) {13: className = "/" + className;14: }15: className = className.replace('.', '/');16: className = className + ".class";17:18: .URL classUrl =19: new JWhich().getClass().getResource(className);20:21: if (classUrl != null) {22: System.out.println("\nClass '" + className +23: "' found in \n'" + classUrl.getFile() + "'");24: } else {25: System.out.println("\nClass '" + className +26: "' not found in \n'" +27: System.getProperty("java.class.path") + "'");28: }29: }30:31: public static void main(String args[]) {32: if (args.length > 0) {33: JWhich.which(args[0]);34: } else {35: System.err.println("Usage: java JWhich");36: }37: }38: }首先,你必须稍微调整一下类的名字以便类装载器能够接受(12-16行)。
在类的名字前面加上一个“/”表示要求类装载器对classpath中的类名字进行逐字精确匹配,而不是尝试隐含地加上调用类的包名字前缀。
把所有“.”转换为“/”的目的是,按照类装载器的要求,把类名字格式化成一个合法的URL资源名。
接下来,程序向类装载器查询资源,这个资源的名字必须和经过适当格式化的类名字匹配(18-19行)。
每一个Class对象维护着一个对装载它的ClassLoader对象的引用,所以这里是向装载JWhich类的类装载器查询。
Class.getResource()方法实际上委托装入该类的类装载器,返回一个用于读取类文件资源的URL;或者,当指定的类名字不能在当前的classpath中找到时,Class.getResource()方法返回null。
最后,如果当前的classpath中能够找到指定的类,则程序显示包含该类的类文件所在位置的绝对路径名(21-24行)。
作为一种调试辅助手段,如果当前classpath 中不能找到指定的类,则程序获取java.class.path系统属性并显示当前的classpath (24-28行)。
很容易想象,在使用Servlet引擎classpath的Java Servlet中,或者在使用EJB 服务器classpath的EJB组件中,上面这段简单的代码是如何运作。
例如,如果JWhich类是由Servlet引擎的定制类装载器装入,那么程序将用Servlet引擎的类装载器去寻找指定的类。
如果Servlet引擎的类装载器不能找到类文件,它将委托它的父类装载器。
一般地,当JWhich被某个类装载器装入时,它能够找出当前类装载器以及所有其父类装载器所装入的所有类。
如果需要是所有发明之母,那么帮助我们管理Java类路径的工具可以说迟到了很长时间。
Java新闻组和邮件列表中充塞着许多有关classpath的问题,现在JWhich为我们提供了一个简单却强大的工具,帮助我们在任何环境中彻底玩转Java类路径。
从表面上看,Java的classpath(类路径)很简单,但一直以来它都是一个产生问题和混乱的根源。
本文介绍classpath的基本知识、可能产生的问题,并提供了一个简单的classpath管理工具。