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

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加载器。

/app/jdk1.8.0_192/bin/java -cp /app/BES-CLUSTER-951/node-172.16.100.235/patch/V9.5.1.2539.002.jar:/app/BES-CLUSTER-951/node-172.16.100.235/patch/V9.5.1.2539.001.jar:/app/BES-CLUSTER-951/node-172.16.100.235/lib/*:/app/BES-CLUSTER-951/node-172.16.100.235/lib/3rd/*: -Dcom.bes.enterprise.stopAgentTimeout=180 -Dclient.ssl.keyStorePassword={AES}PrzBD+FLE0Wheq7AAaghXw== -Dcom.bes.enterprise.nodeagent.process.timeout=180 -Dclient.ssl.keyStore=${com.bes.installRoot}/conf/security/client.p12 -Dclient.ssl.keyStoreType=PKCS12 -Dcom.bes.enterprise.startAgentTimeout=180 -Dcom.bes.enterprise.async.event.retainResultTimeout=300 -Djava.security.egd=file:/dev/./urandom -XX:+UnlockDiagnosticVMOptions -XX:MetaspaceSize=1028m -XX:NewRatio=2 -XX:HeapDumpPath=/toptdata/besServerLog/node-172.16.100.235/logs/dump/ -XX:LogFile=/toptdata/besServerLog/node-172.16.100.235/logs/jvm.log -XX:+HeapDumpOnOutOfMemoryError -XX:-UseVMInterruptibleIO -XX:MaxMetaspaceSize=2048m -XX:+LogVMOutput -Xmx4096m -Xms2048m -server -Djava.endorsed.dirs=/app/BES-CLUSTER-951/node-172.16.100.235/lib/endorsed -Dcom.bes.javaRoot=/app/jdk1.8.0_192 -Dcom.bes.installRoot=/app/BES-CLUSTER-951/node-172.16.100.235 -Dcom.bes.instanceRoot=/app/BES-CLUSTER-951/node-172.16.100.235 -Djava.awt.headless=true -Djava.ext.dirs=/app/jdk1.8.0_192/lib/ext:/app/jdk1.8.0_192/jre/lib/ext:/app/BES-CLUSTER-951/node-172.16.100.235/lib/ext -Djava.net.preferIPv4Stack=true -Djava.library.path=/app/BES-CLUSTER-951/node-172.16.100.235/lib:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib com.bes.enterprise.nodeagent.bootstrap.NodeAgentMain start --startinstances=false --restartinstances=true --monitorinterval=5 --syncinstances=true -instancedir /app/BES-CLUSTER-951/node-172.16.100.235 -verbose false -debug false -nodename node-172.16.100.235 -read-stdin true
06-02
java -djava.ext.dirs和--class-path是两个Java的命令行选项,都用于指定Java虚拟机运行时查找类文件的路径。 Java的类库是由许多Java类文件组成的,这些类文件需要被Java虚拟机加载并执行。当我们编写Java程序时,我们需要通过某种方式告知Java虚拟机去哪里查找这些类文件。 -djava.ext.dirs选项用于指定Java虚拟机搜索Java扩展(Java Extension)类库的路径。Java扩展类库是指Java虚拟机内置的一些功能库,比如Java Database Connectivity(JDBC)类库,Java Naming and Directory Interface(JNDI)类库等。Java扩展类库通常存放在JRE的ext文件夹中,但是有时候我们可能需要自己定义一些Java扩展类库,那么就需要使用-djava.ext.dirs选项来告知Java虚拟机去哪里查找这些类文件。 --class-path选项用于指定Java虚拟机搜索Java应用程序类库的路径。Java应用程序类库是指我们编写的Java程序所依赖的一些类库,比如在编写Spring框架的应用程序时需要依赖Spring框架的类库。在编写Java应用程序时,我们需要告知Java虚拟机去哪里查找这些类库,那么就需要使用--class-path选项来指定Java应用程序类库的路径。 综上所述,Java -djava.ext.dirs和--class-path选项都用于指定Java虚拟机运行时查找类文件的路径,但是-djava.ext.dirs选项用于指定Java扩展类库的路径,而--class-path选项用于指定Java应用程序类库的路径。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值