每个Java开发者,从开始学习Java的那一天起,就认识了classpath。也许你只是不经意的输入了一个java HelloWorld 但这个时候,你已经无意中使用到了classpath。
说了半天,什么是classpath,有什么用呢?
概念
我们都知道,在JAVA的世界里,两个变更至关重要:path
、classpath
其中path指定了我们所使用的javac
、java
这些可招待程序的发行版具体路径,而classpath
主要用来标识在执行java程序时加载类的位置。
Oracle官方的精确定义是这样的:
The class path is the path that the Java runtime environment searches for classes and other resource files.
即classpath是Java运行时查找class和其他资源文件的路径。
一般可以在java命令后以-classpath
或-cp
的形式,来指定具体的classpath
。而且,一般在系统中也不建议直接指定CLASSPATH这个环境变量,毕竟每个应用 的类路径是有区别的,在各个不同的应用中以-cp
这种形式更容易使用。如果我们没有显式的指定-cp的时候,其默认值是一个点( .
),代表当前路径,所以我们前面说 虽然你只是简单的输入一个java,后面跟了一个class的名称,但你已经在使用它了。
虽然说起来道理很简单,但还是会成为一些初学者,甚至一些所谓「资深」的开发者的难题。
原理
为什么看似简单的classpath
,会成为开发中的一个拌脚石呢?
我们开发过程中,如果一直使用IDE进行开发,这些classpath的设置,已经由IDE代为完成,所以每次都是直接运行自己的程序,依赖的外部程序都是直接添加到所谓的 build-path
里。而这些内容,在启动应用程序时,就会以classpath的形式提供。
而在命令行中运行Java程序时,这一切都需要手动进行配置,此时就会出现问题。有时是ClassNotFoundException
,有时会是找不到或无法加载主类
。这个时候,一定是类路径设置的问题,无法找到对应的类,或者是已经加载到的类路径中的这些class,没有包含main
方法的类,或者jar文件中的MANIFAST.MF里没有Main-Class
。
那么,如何确定当前运行的Java应用加载了哪些资源到其类路径里,或者说它的classpath配置了一些什么内容呢? 这里有几个Java默认饮食的小工具,可以直接使用。
jps
这个命令我们在前面的文章里曾经介绍过。(你可能不知道的几个java小工具)通过
jps -lv
可以列出当前运行的所有Java进程,以及其详细的参数信息,这样我们的配置的classpath内容就罗列出来了。Jconsole
这个工具我们前面文章也介绍过。通过att