Java环境变量Classpath

标签: java 环境变量 classpath | 发表时间:2012-09-17 13:10 | 作者:Albertxiaoyu
出处:http://www.yeeyan.org

译者 Albertxiaoyu


Classpath是一个参数,它的值可以通过命令行指定,或者通过环境变量来指定。Classpath这个参数的值,被Java虚拟机或者Java编译器所使用,它告诉Java虚拟机机,Java编译器,去哪里寻找用户定义的类和包。


Overview and architecture

与传统的动态载入行为类似,当执行一个Java程序的时候,Java虚拟机会寻找和载入类(但是,只有当这个类被用到的时候,Java虚拟机才会载入它。Classpath这个值,告诉Java虚拟机或者编译器,在文件系统中,哪些文件是定义了要用到的类的。



Java虚拟机按照下述流程来寻找和载入类:


  1. 系统导入类:这些类对Java平台是起基础性作用的,它们由以下类组成:Java类库的公共类部分;为Java类库服务的私有类。
  2. 扩展类:存在于JRE或者JDK扩展目录下的包,如jre/lib/ext/。
  3. 用户定义的包和类库
在默认情况下,只有JDK的标准API包和扩展包,是不用额外设定变量的,Java虚拟机或者Java编译器知道怎样找到它们。所有用户自定义的包或者类库,它们的存放路径,必须通过命令行来指定或者通过相关的Manifest文件来设定(每一个Manifest文件与一个Jar文件相关联,Jar文件包含了用户自定义的包或者类库)。这样,在指定了自定义的包或者类库的存放路径之后,Java虚拟机或者Java编译器,就知道怎么去找到这些类或者包。




在执行Java程序的时候指定路径

基本用法

假设,我们拥有一个叫做org.mypackage的包,它包含以下内容:



  • HelloWorld (main class)
  • SupportClass
  • UtilClass


然后,定义这些类的文件,存放在以下位置:D:myprogram(在Window系统下);/home/user/myprogram(在Linux系统下)。

文件的路径结构如下:


在这个例子中,当我们启用Java这个工具(用于载入某个java程序到虚拟机中去执行)的时候,我们指定要运行的java程序为org.mypackage.HelloWorld。当然,我们还要告诉Java这个工具,它去什么地方找我们自己定义的要载入Java虚拟机运行的包和类。所以,要启动运行这个程序,我们使用以下的命令:


Microsoft Windows:
 java -classpath D:myprogram  org.mypackage.HelloWorld 

Linux:

 java -classpath /home/user/myprogram org.mypackage.HelloWorld 
其中:
  • -classpath D:myprogram 这个参数,指定了程序中要用到的包所在的路径。(在Linux系统中,是这样表达, -classpath /home/user/myprogram)
  • org.mypackage. HelloWorld 这是主类的名称

注意,如果,我们所在的工作目录是D:myprogram(在Linux系统是,/home/user/myprogram/)运行Java,那么,我们就不用显式设定classpath(指定要载入的类的路径)的值,因为,要载入的类,定义它们的文件就在当前目录下了,就是,Java会从当前目录先寻找要载入的类的定义文件。




添加一个目录下的所有JAR文件


在Java 6和更高版本的Java中,我们可以将一个指定目录下的所有JAR文件添加进来,设定一个包含通配符的路径值,将该路径值赋值给classpath.

Windows系统下运行的例子:

java -classpath ".;c:mylib*" MyApp 


在Linux系统下运行的例子:

java -classpath '.:/mylib/*' MyApp

通过环境变量来设定路径值

环境变量CLASSPATH,可以替代classpath的功能,用CLASSPATH来存放要载入的类的定义文件的路径值。上面的例子,我们可以用下面的内容来代替(在Windows系统中):


有时候,您还要查一下JAVA_HOME的值,该值,表示正在使用的JDK的存放路径。

set CLASSPATH=D:myprogram 
java org.mypackage.HelloWorld 

设置Jar文件的存放路径

现在,假设,我们要运行的程序,使用了一个辅助的类库,该类库包含在一个Jar文件中,该Jar文件存放在D:myprogramlib.


现在文件存放结构是:


 


基于上面的文件结构,那么,我们就要使用以下的命令:


在Manifest文件中设定路径

假设我们的程序的源代码包含在一个名为helloWorld.jar的jar文件中,并且该文件存放在D:myprogram目录下。于是,我们拥有下面的文件系统结构:


helloWorld.jar文件中的Manifest文件,是这样定义的:

Main-Class: org.mypackage.HelloWorld 
Class-Path: lib/supportLib.jar



注意:manifest文件以换行符结束或者以return键结束。

然后,要注意在这个例子中,描述supportLib.jar的存放路径,是相对路径,是相对于helloWorld.jar文件的存放路径,用的并不是绝对路径(在命令行中,-classpath的值,就要用到绝对路径)。只要上述二者的相对位置结构保持不变,那么,jar文件的实际存放位置和它需要的类库的实际存放位置是不相关的。

要运行jar文件中的程序,我们可以使用下面的命令:
java -jar D:myprogramhelloWorld.jar

不需要再在命令行中指定Classpath的值,因为,它的值已经在manifest文件中定义了。

注意:没有必要在载入程序(java)处定义主类,因为在manifest文件中,必须要有具有以下形式的一行:

Main-Class: classname 

要获取更多关于jar选项的信息,可以查看 JavaDoc.



在manifest文件中设定多个JAR文件的存放路径,用空格将每个路径区别开:

Class-Path: lib/supportLib.jar   lib/supportLib2.jar

 
 


相关 [java 环境变量 classpath] 推荐:

Java环境变量Classpath

- - 译言-电脑/网络/数码科技
Classpath是一个参数,它的值可以通过命令行指定,或者通过环境变量来指定. Classpath这个参数的值,被Java虚拟机或者Java编译器所使用,它告诉Java虚拟机机,Java编译器,去哪里寻找用户定义的类和包. 与传统的动态载入行为类似,当执行一个Java程序的时候,Java虚拟机会寻找和载入类(但是,只有当这个类被用到的时候,Java虚拟机才会载入它.

AIX环境变量简介及使用

- - CSDN博客推荐文章
环境变量是操作系统环境设置的变量,适用于整个系统的用户进程; 环境变量可以在命令中设置,但是用户注销的时候将会丢失这些设置值; 若要重复适用,则最好在.profile中定义;环境变量的使用与本地变量的使用方法相同, 但是在使用之前,必须用export命令导出. 如果设置了此变量,在cd一个目录的时候,shell会先去查找此变量保存的值; 如果此变量中保存了cd切换的目录,则切换到该目录下.

Kettle环境变量在ETL工程上的应用

- - 行业应用 - ITeye博客
    好久没更新博文,最近临近离职,事情少了,有空停下来总结总结这段时间的东西.     今天先记录下Kettle环境变量的应用.     一个好的环境变量的使用,在业务变更或者环境变动后,只需要很少工作量的修改即可完成. 我们把变量分成系统环境变量和业务变量,系统环境变量是指那些在ETL中指定的系统级资源配置,如数据库信息、日志文件路径等等,这些变量一旦设定,不会经常变动;业务变量指跟当前ETL执行处理的内容有关,如日期、产品ID等等,跟运行时有关.

Linux下通过crontab调度脚本时脚本所使用的环境变量问题

- - CSDN博客推荐文章
通过crontab调度脚本时脚本使用的环境变量与直接在shell中运行脚本时使用的环境变量不同(因为crontab并不知道你所使用的shell,只是简单的设置了HOME、LOGNAME、SHELL和有限的PATH等环境变量),因而可能导致“XXX command not find”的错误或者运行结果不一致的情况.

Java中的锁(Locks in Java)

- - 并发编程网 - ifeve.com
原文链接 作者:Jakob Jenkov 译者:申章 校对:丁一. 锁像synchronized同步块一样,是一种线程同步机制,但比Java中的synchronized同步块更复杂. 因为锁(以及其它更高级的线程同步机制)是由synchronized同步块的方式实现的,所以我们还不能完全摆脱synchronized关键字( 译者注:这说的是Java 5之前的情况).

Java PaaS 对决

- 呆瓜 - IBM developerWorks 中国 : 文档库
本文为 Java 开发人员比较了三种主要的 Platform as a Service (PaaS) 产品:Google App Engine for Java、Amazon Elastic Beanstalk 和 CloudBees RUN@Cloud. 它分析了每种服务独特的技术方法、优点以及缺点,而且还讨论了常见的解决方法.

Java浮点数

- d0ngd0ng - 译言-电脑/网络/数码科技
Thomas Wang, 2000年3月. Java浮点数的定义大体上遵守了二进制浮点运算标准(即IEEE 754标准). IEEE 754标准提供了浮点数无穷,负无穷,负零和非数字(Not a number,简称NaN)的定义. 在Java开发方面,这些东西经常被多数程序员混淆. 在本文中,我们将讨论计算这些特殊的浮点数相关的结果.

Qt——转战Java?

- - 博客 - 伯乐在线
编者按:事实上,在跨平台开发方面,Qt仍是最好的工具之一,无可厚非,但Qt目前没有得到任何主流移动操作系统的正式支持. 诺基亚的未来计划,定位非常模糊,这也是令很多第三方开发者感到失望,因此将导致诺基亚屡遭失败的原因. Qt的主要开发者之一Mirko Boehm在博客上强烈讽刺Nokia裁了Qt部门的决定,称其为“绝望之举”,而非“策略变更”.

java 验证码

- - ITeye博客
// 创建字体,字体的大小应该根据图片的高度来定. // 随机产生160条干扰线,使图象中的认证码不易被其它程序探测到. // randomCode用于保存随机产生的验证码,以便用户登录后进行验证. // 随机产生codeCount数字的验证码. // 得到随机产生的验证码数字. // 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同.

java面试题

- - Java - 编程语言 - ITeye博客
 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面. 抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节. 抽象包括两个方面,一是过程抽象,二是数据抽象.  继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法. 对象的一个新类可以从现有的类中派生,这个过程称为类继承.