java -Djava.ext.dirs、 -classpath区别

本文探讨了Java命令行启动程序时classpath的指定方法,包括使用shell脚本和-Djava.ext.dirs参数的不同方式。深入解析了AppClassLoader与ExtClassLoader在加载类时的区别,以及加载器的层次结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java命令行启动程序时,一般需要指定classpath,如下:

java -cp "./:./lib/a.jar:./lib/b.jar" com.a.b.c.StartMain 

依赖的jar包都在lib目录下。
如果lib目录下的jar过多,一般会使用shell的帮助

    CLASS_PATH=./
    for jar in ./lib/*.jar; do
       CLASS_PATH=$CLASS_PATH:$jar
    done
    java -cp $CLASS_PATH com.a.b.c.StartMain

这里必须的把每个jar包列出来,jar包里包含许多class文件,一个jar相当于一个目录。另外,网上看到也可以通过

java -Djava.ext.dirs=$JAVA_HOME/jre/lib/ext:./:./lib com.a.b.c.StartMain

方式启动(注意必须加上$JAVA_HOME/jre/lib/ext,否则一些重要的JDK类将找不到)。
两者都可以达到启动程序的目的,但是机制不同,指定classpath时,加载com.a.b.c.StartMain 类使用的是sun.misc.Launcher$AppClassLoader加载器,
而使用-Djava.ext.dirs方式时是 sun.misc.Launcher$ExtClassLoader加载器。

有三个系统类加载器,并且加载类的顺序依次为

  • Bootstrap CLassloder
    加载 $JAVA_HOME/jre/lib下的jar、class
  • Extention ClassLoader(ExtClassLoader)
    加载$JAVA_HOME/jre/lib/ext 目录下的jar、class
  • AppClassLoader(AppClassLoader)
    加载-classpath指定的jar、class

上述的第二种启动应用程序的方式,直接使用了ExtClassLoader 系统加载器。而原则上java的程序期望使用AppClassLoader加载器。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值