Java classpath

1.我们的java程序是如何运行起来的?

java程序运行时,通常是将.java文件编译成.class文件,即源文件编译成字节码文件,之后jvm通过ClassLoader加载字节码文件并实例化对象,然后运行程序。
启动程序时,我们通常使用java -jar xxx.jar或者java packageA.packageB.Main的方式(当然可以加一些额外的Option和main函数参数)。
我们来看下为什么通过这样的命令可以启动程序。

首先,操作系统要识别出java这个命令。因此我们要将java这个命令加到操作系统的Path中。
假设jdk安装目录是/usr/local/jdk.1.8.0,对于bash,我们可以通过在~/.bashrc中加入
PATH=/usr/local/jdk1.8.0/bin:$PATH
export PATH

其次,jre(Java runtime environment)要能找到我们的类。

2.classpath是什么?

classpath是类搜索路径,jre在运行我们的java应用时,会在classpath下搜索.class文件和资源文件。也就是说classpath会告诉JDK去哪里搜索第三方和用户定义的class文件。
JVM会依次搜索Java platform (bootstrap) classes,之后是extension classes,最后是classpath中指定的classes。

3.设置classpath的两种方法
方法1:通过java javac javadoc apt进行设置,例如 java -cp classpath1;classpath2
方法2:设置CLASSPATH环境变量,多个classpath同样使用分号分隔。
推荐使用方法1设置环境变量,因为这样不同的应用互不干扰。

4.classpath中是什么
classpath中可以有.jar .zip或class文件。

假如有
/home/userA/tmp/a.jar
/home/userA/tmp/b.zip

/home/userA/tmp/com/woods/C1.java
/home/userA/tmp/com/woods/C1.class

/home/userA/tmp/com/woods/C2.java
/home/userA/tmp/com/woods/C2.class

4.1 如果是.jar或.zip文件,那么classpath以.zip或.jar结尾。例如java -cp /home/userA/tmp/a.jar;/home/userA/tmp/b.zip
4.2 如果.class文件在一个未命名的包中,那么classpath以包含这个.class文件的目录结尾。例如我们要运行C1,则要将C1.class加入classpath,即java -cp /home/userA/tmp/com/woods C1
4.3 如果.class文件在一个命名的包中,那么classpath以这个.class文件的跟包结尾。例如我们要运行C2,则要将C2.class加入classpath,并使用C2的全限定名,即java -cp /home/userA/tmp com.woods.C2

C1.java如下。注意没有包名。

class C1 {
    public static void main(String[] args) {
        System.out.println("C1");
    }
}

C2.java如下。注意包名为com.woods。

package com.woods;
class C2 {
    public static void main(String[] args) {
        System.out.println("C2");
    }
}

5. 参考
建议阅读下下面的文章。
5.1 https://stackoverflow.com/questions/18093928/what-does-could-not-find-or-load-main-class-mean
5.2 https://docs.oracle.com/javase/7/docs/technotes/tools/windows/java.html
5.3 https://docs.oracle.com/javase/7/docs/technotes/tools/windows/classpath.html
5.4 https://docs.oracle.com/javase/tutorial/essential/environment/paths.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值