面试总结:java命令行main主类及其依赖的jar

面试官问,如何在java命令行中,运行Main及其依赖的jar。平常只是添加jar包,或者直接跑打包好的jar包,并没有对该类问题进行思考。

1、一般运行包含主类的jar,可以使用如下命令:

java -jar <jar-file-name>.jar

 2、如果java文件中没有相关的主类main,则可以使用如下方法,进行启动。

java -cp app.jar com.xxx.TestMain

3、我们知道,jar打包后内部是一个或者多个.class字节码文件,在我们运行主类之前,我们首先需要通过类加载器加载主类依赖的.jar文件,想要真正了解类加载流程,首先我们先了解,JVM中的类加载器有哪些,如下:

Java 中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由 Java 应用开发人员编写的。 
引导类加载器/启动类加载器(bootstrap class loader):

它用来加载 Java 的核心库(jre/lib/rt.jar),是用原生C++代码来实现的,并不继承自java.lang.ClassLoader,已经封装到JVM内核中了。

加载扩展类和应用程序类加载器,并指定他们的父类加载器,在java中获取不到。 

扩展类加载器(extensions class loader):

它用来加载 Java 的扩展库(jre/ext/*.jar)。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。 

系统类加载器(system class loader):

它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。可以通过 ClassLoader.getSystemClassLoader()来获取它。

自定义类加载器(custom class loader):

除了系统提供的类加载器以外,开发人员可以通过继承 java.lang.ClassLoader类的方式实现自己的类加载器,以满足一些特殊的需求。

 4、从上面类加载器的介绍不难看出,java提供了各种各样的类加载器满足我们的需求,我们类依赖的外部jar,主要是通过覆盖系统默认的扩展类加载器去进行加载的,如下:

当main类依赖多个jar时,可以把多个jar打包到一个目录,然后用-Djava.ext.dirs指定该目录,引用依赖的多个jar。
 tips:
-Djava.ext.dirs会覆盖Java本身的ext设置,java.ext.dirs指定的目录由ExtClassLoader加载器加载,如果您的程序没有指定该系统属性,那么该加载器默认加载$JAVA_HOME/jre/lib/ext目录下的所有jar文件。

java -Djava.ext.dirs=<多个jar包的目录> com.test.HelloWord

例:java  -Dfile.encoding=utf8  -Djava.ext.dirs=./lib  -classpath  ./conf   com.test.MyTest

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值