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)