文章目录
0. 文章摘要
本文对从命令行运行 Java 程序或 jar 文件的方法进行说明,讲解如何指定 java
命令的 -classpath
参数。本文学习网上某些 Java 教程的预备知识,对于使用 IDE 编程没有任何指导意义。
classpath 是 JVM 的一个参数,用于告诉 JVM 到哪里查找、加载类和包。
javac
命令后面只需指定要编译的 .java 文件即可,不需要指定-classpath
,-classpath
是 JVM 需要的。如:
javac ~/myprogram/org/mypackage/HelloWorld.java
1. 虚拟机查找和载入类
虚拟机查找和载入类的顺序如下:
- bootstrap classes 引导类:Java 平台的基础类,JDK 标准 API
- extension classes 扩展类:位于 JRE 或 JDK 的扩展目录
jre/lib/ext/
- 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