[Java Platform, Standard Edition Tools Reference] 第二章

本文详细介绍了Java类路径(classpath)的设置和使用,包括-classpath选项、CLASSPATH环境变量、通配符使用以及类与包名的关系。通过示例展示了如何为不同情况设置类路径,如运行包含包名的类、无包名的类以及从JAR文件运行类。同时,文章强调了使用-classpath而非CLASSPATH环境变量的优先级。
摘要由CSDN通过智能技术生成

Setting the Class Path

class path  是用来告诉JRE到哪里查找class和其他源文件的的一个路径。

这一章节主要介绍一下几个内容:

Synopsis(摘要)

如果想设置去哪里可以找到某个类可以通过使用-classpath 选项或者在环境变量中设置CLASSPATH 这个变量的值。两种方式的话,我们首选-classpath ,因为属于在命令行中使用,不会影响到其他的application。
使用方式:

sdkTool -classpath classpath1;classpath2...
set CLASSPATH=classpath1;classpath2...

sdkTool
泛指jdk中自带的一些命令行工具,例如:java, javac, javadoc, or apt网址:https://docs.oracle.com/javase/8/docs/technotes/tools/index.html

classpath1;classpath2(表示-classpath 后面可以写多个classpath)
用于告诉jvm到那个jar或者zip或者文件中去找要运行的类(一般来说这个类就是含有main方法的那个类)
1. 如果你要运行的类是在jar或者zip中,那么-classpath后面的值应该是这个jar的路径+jar名称(这种情况一般是jar中没有在manifest文件中配置Maiin-Class。如果指定了Main-Class,那么就不需要使用-classpath了。直接通过java -jar jar名字就行)
2. 如果你要运行的这个类没有包名(类直接在src下),那么-classpath后面的值就是这个所在的文件夹路径
3. 如果你要运行的这个类有报名,那么-classpath后面的值就是这个类所在的根目录的路径(去掉包名的那个文件夹)

下面针对上面三种情况通过例子解释下:
1. 运行的类在jar中的情况
新建一个java项目,并且Manifest.xml中我们写Main-Class(原因上面写了)。

 Mainfest.xml文件内容

Manifest-Version: 1.0
Class-Path: lib/commons-lang-2.6.jar

打成jar后放到桌面,cmd直接运行,如下:

C:\Users\liuhb\Desktop>java -cp .;java-practice.jar com.lhb.practice.jse.Test
Hello World

可以看到成功打印出结果。-cp就是-classpath,后面跟的就是告诉jvm去哪里找我要运行的类,最后的com.lhb.practice.jse.Test就是要运行类。一般在jar中的manifest.xml中不写Main-Class的时候就会通过这种方式来运行。如果manifest.xml中写了Main-Class,那么就可以直接通过java -jar java-practice.jar来运行了,jvm会自动到Mainfest.xml中找到Main-Class指定的类来运行。


上面命令最后写类的全限定名(包名+类名)com.lhb.practice.jse.Test,是因为在jvm类加载器加载类的规则要求。这里我们指定了classpath,所以了加载就会到这个jar中找Test,但是时找不到的,因为Test在里面的包中,所以必须写上全限定名才行。
 

2. 要运行的类,没有包名的情况
首先创建一个没有包的类NoPackageTest,也就是直接在src下面创建类就行

然后通过javac编译成class,如下:

E:\java-practice\src>javac -cp c:\Users\liuhb\Desktop\lib\commons-lang-2.6.jar NoPa
ckageTest.java

注意:在通过javac编译时,我也使用了-cp,因为我们的类中使用了第三方commons-lang的工具了,所以也要使用-cp(-classpath)告诉jvm到哪了可以找到这个类。
这时在同目录下会发现多出一个同名的class文件,然后我们通过命令来运行下,在命令行将路径切换到java-practice(项目根目录下),然后执行下面命令

E:\java-practice>java -cp ./src;c:\Users\liuhb\Desktop\lib\commons-lang-2.6.jar NoP
ackageTest
Hello World
no paackageHello World

正如上面说的如果是没有包名的类,我们只要通过-classpath指定类所在的目录(./src)就行。
因为我们类中还是用了第三方commons-lang中的工具,所以还需要告诉jvm去哪里加载这个第三方jar中的所有类,所以-cp后面通过classpath1;classpath2的形式写了多个路径。这也正是了1中说的,如果-classpath是一个jar,就要写路径+jar的名字。
有人或者会问,我按照下图的写法行不?

 你会发现直接报错了,说找不到类,这是因为你感觉自己通过./src/NoPackageTest指定了运行类的路径,但是jvm并不知道去哪找这个类,必须通过-classpath才能告诉jvm去哪个目录找这个类。一定要注意区别

3. 要运行的类,有包名的情况下
代码如下:

然后我们通过命令行进入到这个包下面(包名为com.lhb.practice.jse),对这个类进行编译

E:\java-practice\src\com\lhb\practice\jse>javac -cp c:\Users\liuhb\Desktop\lib\comm
ons-lang-2.6.jar Test.java

 这里javac时使用-cp的作用上面已经说过,就不多少了。
编译完成后,同目录下应该就有了对应的class文件了,然后就可以运行一下,看看有包名的情况下怎么运行类。

E:\java-practice\src>java -cp .;c:\Users\liuhb\Desktop\lib\commons-lang-2.6.jar com
.lhb.practice.jse.Test
Hello World

要运行有包名的类,需要通过-classpath(-cp)先告诉jvm你包名第一层所在的位置,一般都是在src下,然后最后通过包名+类名的方式指定运行的类(com.lhb.practice.jse.Test)

下面看看官网是怎么来描述classpath的:

  • class path用来告诉jdk 工具和程序需要用到的第三方或者用户自定义的classess在什么位置(这些classes不是java平台自带的那些昂(jre/ext等),因为自带的那些不用告知也知道在那)。http://docs.oracle.com/javase/8/docs/technotes/guides/extensions/index.html
  • 关于jdk,jvm和其他jdk tools查找类的顺序,比如显示bootstrap class,然后extension class,然后再是class path,具体的策略和顺序可以参考http://docs.oracle.com/javase/8/docs/technotes/tools/findingclasses.html
  • 当你需要使用其他的libaries时(例如其他目录下的jar)  ,你也需要通过classpath来指定一下,后者CLASSPATH,两者的区别之前说过。CLASSPATH是环境变量,影响全局关于-

Class Path Wild Cards

classpath中还可以使用通配符,通配符不会递归,例如 -classpath mydir/*只会搜索mydir这个目录下的所有jar,而不会去搜索它的子目录

Class Path and Package Names

这部分就是说当我们的类有包名时,必须通过包名+类名这种完全限定名来表示一个类。例如:

java -classpath C:\java\MyClasses utility.myapp.Cool

utility.myapp(包名) + Cool(类名)来表示一个类,而不能直接写类名。前面我们的例子也说过这个情况。包名是属于类的一部分,而不是路径的部分(虽然在系统中看到的是文件夹目录)
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值