CLASSPATH到底为何物

1、classpath

1.1 classpath是JVM用到的一个环境变量,它用来指示JVM如何搜索class

1.2 运行命令java时我们可以自己设置classpath

 java -classpath .;C:\work\project1\bin;C:\shared abc.xyz.Hello 

其中.指的是当前路径。如果不加-classpath则默认当前路径

1.3 不推荐在系统环境变量中设置classpath,会污染整个系统环境。推荐在启动jvm的时候通过-classpath参数设置。注:每次运行java命令都相当于启动一个jvm。

 

2、ide中运行java

在集成开发环境中运行java程序,IDE自动传入的-classpath参数是target\classes路径和引入的jar包,

 

我们调试时,把执行的命令拷贝出来看一下

 

xxx换行显示之后为如下

 

3、运行jar包时的classpath

3.1 Jvm寻找class的顺序:

1. Bootstrap classes

属于Java 平台核心的class,比如java.lang.String等.及rt.jar等重要的核心级别的class.这是由JVM Bootstrap class loader来载入的.一般是放置在{java_home}\jre\lib目录下

2. Extension classes

基于Java扩展机制,用来扩展Java核心功能模块.比如Java串口通讯模块comm.jar.一般放置在{Java_home}\jre\lib\ext目录下

3. User classes

开发人员或其他第三方开发的Java程序包.通过命令行的-classpath或-cp,或者通过设置CLASSPATH环境变量来引用.JVM通过放置在{java_home}\lib\tools.jar来寻找和调用用户级的class.常用的javac也是通过调用tools.jar来寻找用户指定的路径来编译Java源程序.这样就引出了User class路径搜索的顺序或优先级别的问题.

3.1 缺省值:调用Java或javawa的当前路径(.),是开发的class所存在的当前目录

3.2 CLASSPATH环境变量设置的路径.如果设置了CLASSPATH,则CLASSPATH的值会覆盖缺省值

3.3 执行Java的命令行-classpath或-cp的值,如果制定了这两个命令行参数之一,它的值会覆盖环境变量CLASSPATH的值

3.4 -jar 选项:如果通过java -jar 来运行一个可执行的jar包,这当前jar包会覆盖上面所有的值.换句话说,-jar 后面所跟的jar包的优先级别最高,如果指定了-jar选项,所有环境变量和命令行制定的搜索路径都将被忽略.JVM APPClassloader将只会以jar包为搜索范围.

有关可执行jar有许多相关的安全方面的描述,可以参考http://java.sun.com/docs/books/tutorial/jar/ 来全面了解.

这也是为什么应用程序打包成可执行的jar包后,不管你怎么设置classpath都不能引用到第三方jar包的东西了.

也就是说,在运行jar包时,classpath为:jre相关包+自己打的jar包中的(自己的class和第三方jar)

 

posted @ 2022-01-30 10:06  zhenjingcool  阅读(81)  评论(0编辑  收藏  举报