Java:关于 classpath 的一切

0. 文章摘要

本文对从命令行运行 Java 程序或 jar 文件的方法进行说明,讲解如何指定 java 命令的 -classpath 参数。本文学习网上某些 Java 教程的预备知识,对于使用 IDE 编程没有任何指导意义。

classpath 是 JVM 的一个参数,用于告诉 JVM 到哪里查找、加载类和包。

javac 命令后面只需指定要编译的 .java 文件即可,不需要指定 -classpath-classpath 是 JVM 需要的。如:
javac ~/myprogram/org/mypackage/HelloWorld.java

1. 虚拟机查找和载入类

虚拟机查找和载入类的顺序如下:

  1. bootstrap classes 引导类:Java 平台的基础类,JDK 标准 API
  2. extension classes 扩展类:位于 JRE 或 JDK 的扩展目录 jre/lib/ext/
  3. user-defined packages and libraries 用户定义的包和库

默认地,前两种类的访问是自动行为,不需要指定路径。

就像动态载入一样,当执行 Java 程序时,JVM 查找和载入类文件时是惰性的——类的字节码在第一次被使用时才会被载入。

2. 指定用户定义的包和库路径

假设我们有一个包 org.mypackage,其中含有下面三个类文件:

  • HelloWorld.class(main 方法所在的类)
  • Support.class(支持类)
  • Utils.class(工具类)

这个包位于 D:\mprogram 下(Windows):

D:\mprogram\
└── org
    └── mypackage
        ├── HelloWorld.class
        ├── Support.class
        └── Utils.class

~/myprogram 下(Linux):

~/myprogram/
└── org
    └── mypackage
        ├── HelloWorld.class
        ├── Support.class
        └── Utils.class

2.1 以应用程序参数的方式指定 classpath

运行程序时提供所在路径:

Windows

java -classpath D:\myprogram org.mypackage.HelloWorld

Linux

java -cp ~/myprogram/ org.mypackage.HelloWorld

说明:

  • -classpath-cp 用于指定包所在的目录
  • org.mypackage.HelloWorld 是类的名字

2.2 设置临时环境变量

仅对当前窗口起作用。

Windows

set CLASSPATH=D:\myprogram
java org.mypackage.HelloWorld

2.1 中的 -classpath 选项会覆盖 CLASSPATH 临时环境变量。如果什么都未指定,那么当前工作目录将默认作为 classpath,也就说,**如果而且只有当前目录是 D:\myprogram~/myprogram,即包所在路径时,不需要指定 classpath。**如果当前目录是 D:\myprogram\org\mypackage,仍需指定 -classpath(这可能有点违背直觉)。

java org.mypackage.HelloWorld

2.3 设置 jar 文件的路径

myprogram/
├── lib
│   └── support-lib.jar
└── org
    └── mypackage
        ├── HelloWorld.class
        ├── Support.class
        └── Util.class

如果需要 support-lib.jar 的支持,则:

java -classpath D:\myprogram;D:\myprogram\lib\supportLib.jar org.mypackage.HelloWorld

set CLASSPATH=D:\myprogram;D:\myprogram\lib\supportLib.jar
java org.mypackage.HelloWorld

可见,要添加 jar 包,只需在 -classpath 选项或 CLASSPATH 变量中添加 jar 包的位置,并与其他 classpath 用分号(Windows)或冒号(Linux)隔开。

从 Java 6 开始,如需添加某一目录下的所有 jar 包,可以使用通配符:

Windows

java -classpath ".;c:\mylib\*" MyApp

Linux

java -classpath '.:/mylib/*' MyApp

2.5 在 Mainfest 文件中指定 classpath

D:\myprogram\
      └── helloWorld.jar 
      └── lib\  
            └── supportLib.jar

MANIFEST.MF

Main-Class: org.mypackage.HelloWorld
Class-Path: lib/supportLib.jar

运行程序:

java -jar D:\myprogram\helloWorld.jar [app arguments]

EOF

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值