classpath的说明

classpath 是 JVM 用到的一个环境变量,用来指示 JVM 如何搜索 class 文件,就是如果 JVM 需要加载某一个类,应该去哪里搜索对应的 class 文件。因此,classpath 是一组目录的集合。不同操作系统有不同的文件路径分隔符

  • Windows 是分号,带空格的目录使用双引号括起来
  • Linux 采用的是冒号 ```bash

    Windows下可能的classpath

    .;%JAVA_HOME%/bin/;%JAVA_HOME%/jre/bin

Linux下可能的classpath

/usr/shared:/usr/local/bin

  1. JVM 在加载类时,会按照配置文件中的路径先后顺序依次查找,如 .;%JAVA_HOME%/bin/;%JAVA_HOME%/jre/bin,会按照如下顺序查找,当在当前目录找到相应类的 class 文件,就会停止搜索;如果所有路径下都没有找到,则报错
  2. 1. 当前目录
  3. 1. %JAVA_HOME%/bin/java 安装目录下的 bin 目录
  4. 1. %JAVA_HOME%/jre/binjava 安装目录下的 jre/bin 目录
  5. <a name="TUEfl"></a>
  6. #### classpath 的使用建议
  7. classpath 的设定方法有如下两种:
  8. - 在系统环境变量中配置,不推荐,会污染系统环境
  9. - JVM 启动时指定,推荐
  10. JVM 启动时指定设置 class path:使用 -classpath -cp(简写)
  11. ```bash
  12. # 注意事项:
  13. # 1.不同的操作系统有不同的路径分隔符
  14. # 2.DemoTest 为启动类名称且必须为全限定名,且必须有子包结构
  15. $ java -classpath . org.example.DemoTest

注意事项:

  • 不要把任何Java核心库添加到classpath中!JVM根本不依赖classpath加载核心库!
  • 如果没有设置系统环境变量,也没有传入 -cp 参数,JVM 默认的classpath 为当前目录。

JVM 从 class 文件加载类的细节:假定 class 文件位置 d:\pro\com\example\DemoTest.class

  • DemoTest 类的根类路径:d:\pro\
  • 在通过命令行启动时,如果在类根路径启动,则可以直接运行: java com.example.DemoTest
  • 如果不在类根路径启动,则需要使用 -classpath 或 -cp 指定到类根路径:java -cp d:\pro\ com.example.DemoTest

从 jar 包中启动

多个 .class 文件散落在各层目录文件中,不方便管理,这时,我们可以将目录打包成一个 jar 文件,即将 package 组织的目录层级,以及各个目录下的所有文件(包括 .class 文件和其他文件)都打成一个 jar 文件。

打包方式:

  • javac -cp xx.jar 要编译的文件 -d 目标位置
  • jar -cvfm 【命名】 【/META-INF/MANIFEST.MF】 【要打包的文件1】 【要打包的文件1 】 …

调用:java -jar xx.jar

总结:

  1. JVM 通过 classpath 决定搜索 class 文件的路径和顺序
  2. 不推荐配置系统环境变量,而是在运行时通过 java -cp 参数 传入
  3. jar 包相当与目录,可以包含很多的 .class 文件,而 META-INF/MANIFEST.MF 文件则提供 jar 包的信息,如 Main-Class,这样就可以直接运行 jar 包