classpath和jar
到底什么是?
是JVM用到的一个环境变量,它用来指示JVM如何搜索。
因为Java是编译型语言,源码文件是,而编译后的文件才是真正可以被JVM执行的字节码。因此,JVM需要知道,如果要加载一个的类,应该去哪搜索对应的文件。
所以,就是一组目录的集合,它设置的搜索路径与操作系统相关。例如,在Windows系统上,用分隔,带空格的目录用括起来,可能长这样:
在Linux系统上,用分隔,可能长这样:
现在我们假设是,当JVM在加载这个类时,会依次查找:
- <当前目录>abcxyzHello.class
- C:workproject1binabcxyzHello.class
- C:sharedabcxyzHello.class
注意到代表当前目录。如果JVM在某个路径下找到了对应的文件,就不再往后继续搜索。如果所有路径下都没有找到,就报错。
的设定方法有两种:
在系统环境变量中设置环境变量,不推荐;
在启动JVM时设置变量,推荐。
我们强烈不推荐在系统环境变量中设置,那样会污染整个系统环境。在启动JVM时设置才是推荐的做法。实际上就是给命令传入或参数:
没有设置系统环境变量,也没有传入参数,那么JVM默认的为,即当前目录:
上述命令告诉JVM只在当前目录搜索。
在IDE中运行Java程序,IDE自动传入的参数是当前工程的目录和引入的jar包。
通常,我们在自己编写的中,会引用Java核心库的,例如,、等。这些应该上哪去找?
有很多“如何设置classpath”的文章会告诉你把JVM自带的放入,但事实上,根本不需要告诉JVM如何去Java核心库查找,JVM怎么可能笨到连自己的核心库在哪都不知道?
不要把任何Java核心库添加到classpath中!JVM根本不依赖classpath加载核心库!
更好的做法是,不要设置!默认的当前目录对于绝大多数情况都够用了。
假设我们有一个编译后的,它的包名是,当前目录是,那么,目录结构必须如下:
运行这个必须在当前目录下使用如下命令:
JVM根据classpath设置的在当前目录下查找,即实际搜索文件必须位于。如果指定的文件不存在,或者目录结构和包名对不上,均会报错。
如果有很多文件,散落在各层目录中,肯定不便于管理。如果能把目录打一个包,变成一个文件,就方便多了。
jar包就是用来干这个事的,它可以把组织的目录层级,以及各个目录下的所有文件(包括文件和其他文件)都打成一个jar文件,这样一来,无论是备份,还是发给客户,就简单多了。
jar包实际上就是一个zip格式的压缩文件,而jar包相当于目录。如果我们要执行一个jar包的,就可以把jar包放到中:
这样JVM会自动在文件里去搜索某个类。
因为jar包就是zip包,所以,直接在资源管理器中,找到正确的目录,点击右键,在弹出的快捷菜单中选择“发送到”,“压缩(zipped)文件夹”,就制作了一个zip文件。然后,把后缀从改为,一个jar包就创建成功。
假设编译输出的目录结构是这样:
这里需要特别注意的是,jar包里的第一层目录,不能是,而应该是、、。如果在Windows的资源管理器中看,应该长这样:
如果长这样:
说明打包打得有问题,JVM仍然无法从jar包中查找正确的,原因是必须按存放,而不是。
jar包还可以包含一个特殊的文件,是纯文本,可以指定和其它信息。JVM会自动读取这个文件,如果存在,我们就不必在命令行指定启动的类名,而是用更方便的命令:
在大型项目中,不可能手动编写文件,再手动创建zip包。Java社区提供了大量的开源构建工具,例如Maven,可以非常方便地创建jar包。
JVM通过环境变量决定搜索的路径和顺序;
不推荐设置系统环境变量,始终建议通过命令传入;
jar包相当于目录,可以包含很多文件,方便下载和使用;
文件可以提供jar包的信息,如,这样可以直接运行jar包。
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/java-jiao-cheng/15578.html