java -jar/-cp启动添加外部的依赖包方式

 更新时间:2024年01月15日 09:42:39   作者:班班v  
这篇文章主要介绍了java -jar/-cp启动添加外部的依赖包方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

java -jar/-cp启动添加外部的依赖包

启动java主要有两种方式,分别为:java -jar test.jar、java -cp/-classpath test.jar com.main.Test。

然后分别讲一下这两种方式启动程序时,如何加载外部依赖的包。

为了方便大家理解,首先说一下Java的ClassLoader。

ClassLoader的具体作用就是将class文件加载到jvm虚拟机中去。

我们都知道在Java中程序是运行在虚拟机中,我们平常用文本编辑器或者是IDE编写的程序都是.java格式的文件,这是最基础的源码,但这类文件是不能直接运行的。

需要将.java的文件编译成字节码.class文件,才能加载到JVM中运行,这个过程由ClassLoader来完成,Java自带的ClassLoader有3大类,分别为:

Bootstrap ClassLoader 最顶层的加载类,主要加载核心类库,%JRE_HOME%\lib下的rt.jar、resources.jar、charsets.jar和class等。

另外需要注意的是可以通过启动jvm时指定-Xbootclasspath和路径来改变Bootstrap ClassLoader的加载目录。

比如java -Xbootclasspath/a:path被指定的文件追加到默认的bootstrap路径中。

我们可以打开我的电脑,在上面的目录下查看,看看这些jar包是不是存在于这个目录。

  • Extention ClassLoader 扩展的类加载器,加载目录%JRE_HOME%\lib\ext目录下的jar包和class文件。还可以加载-D java.ext.dirs选项指定的目录。
  • Appclass Loader也称为SystemAppClass 加载当前应用的classpath的所有类。

所以,我们要改变这加入外部依赖的jar包,可以分别考虑改变这3个ClassLoader来实现,分别来讲一下这3种实现方法。

一、Bootstrap ClassLoader通过改变Xbootclasspath参数实现

一般有3种方法:

  • -Xbootclasspath: 完全取代基本核心的Java class 搜索路径.不常用,否则要重新写所有Java 核心class
  • -Xbootclasspath/a: 后缀在核心class搜索路径后面(推荐使用)
  • -Xbootclasspath/p: 前缀在核心class搜索路径前面.不常用,避免引起不必要的冲突.

使用Bootstrap ClassLoader的一般方式为:

 java -Xbootclasspath/a:test1.jar -jar test2.jar					//-jar方式
 java -Xbootclasspath/a:test1.jar -cp test2.jar com.test2.Test2		//-cp方式

二、Extention ClassLoader通过改变参数java.ext.dirs实现

java中系统属性java.ext.dirs指定的目录由ExtClassLoader加载器加载,如果您的程序没有指定该系统属性(-Djava.ext.dirs=lib)那么该加载器默认加载 $JAVA_HOME/lib/ext目录下的所有jar文件。

但如果你手动指定系统属性且忘了把$JAVA_HOME/lib/ext路径给加上,那么ExtClassLoader不会去加载$JAVA_HOME/lib/ext下面的jar文件,这意味着你将失去一些功能,例如java自带的加解密算法实现。

所以我们要既要带有原来的lib/ext下的包,也要加入其他依赖,则可以这样写

java -Djava.ext.dirs=%JAVA_HOME%\jre\lib\ext;lib -jar test2.jar
java -Djava.ext.dirs=%JAVA_HOME%\jre\lib\ext;lib -cp test2.jar com.test2.Test2
#java.ext.dirs需要写成目录格式

三、Appclass Loader加载的是classpath配置的jar包

java -cp和java -jar命令启动程序的时候,有一些不同,主要为:

用java -jar启动的时候,java VM会屏蔽所有的外部classpath,也就是配置的 -cp/-classpath环境变量会失效,而只以本身jar的内部class作为类的寻找范围。

这时候只能通过改变META-INF/MANIFEST.MF来设置classpath,而java -cp方式则可以正常加载内部的类来实现。

所以这两种方式加载外部类的方法分别为:

3.1 java -cp/classpath方式

java -cp test2.jar;test1.jar com.test2.Test2  #Test是main方法,通过-cp方式加载2个jar包

3.2 java -cp方式

修改主类jar包 META-INF/MANIFEST.MF内容种的

Main-Class属性,例如

Main-Class: /home/test1.jar /home/test3.jar

#多个jar包用空格隔开

我的做法是:

直接修改java.ext.dirs来加载jar包的属性来实现

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java中对象的比较equal、Comparble、Comparator的区别

    java中对象的比较equal、Comparble、Comparator的区别

    本文主要介绍了java中对象的比较equal、Comparble、Comparator的区别,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • sprinboot项目启动一半到图形化界面卡住了的解决

    sprinboot项目启动一半到图形化界面卡住了的解决

    这篇文章主要介绍了sprinboot项目启动一半到图形化界面卡住了的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • Jenkins集成sonarQube实现代码质量检查过程图解

    Jenkins集成sonarQube实现代码质量检查过程图解

    这篇文章主要介绍了Jenkins集成sonarQube实现代码质量检查过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • 详解SpringBoot集成Hera日志管理新方案

    详解SpringBoot集成Hera日志管理新方案

    本文介绍了SpringBoot集成Hera日志平台的完整方案,SpringBoot与Hera的集成步骤包括环境准备、核心参数配置、无侵入式日志输出和控制台高效排查,感兴趣的朋友跟随小编一起看看吧
    2026-01-01
  • java中char对应的ASCII码的转化操作

    java中char对应的ASCII码的转化操作

    这篇文章主要介绍了java中char对应的ASCII码的转化操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • SpringBoot使用JUL实现日志记录功能

    SpringBoot使用JUL实现日志记录功能

    在SpringBoot中,我们可以使用多种日志框架进行日志记录,其中,JUL(Java Util Logging)是Java平台自带的日志框架,它提供了简单的 API 和配置,可以轻松地进行日志记录,本文将介绍如何在 SpringBoot中使用JUL进行日志记录,并提供示例代码
    2023-06-06
  • 基于SpringBoot+Redis实现分布式锁

    基于SpringBoot+Redis实现分布式锁

    本文主要介绍了基于SpringBoot+Redis实现分布式锁,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • java操作时间方式基础教程demo

    java操作时间方式基础教程demo

    这篇文章主要为大家介绍了java操作时间方式demo基础教程示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • java Thread 多线程

    java Thread 多线程

    本篇文章小编为大家介绍,java Thread 多线程。需要的朋友参考下
    2013-04-04
  • Springboot升级至2.4.0中出现的跨域问题分析及修改方案

    Springboot升级至2.4.0中出现的跨域问题分析及修改方案

    这篇文章主要介绍了Springboot升级至2.4.0中出现的跨域问题分析及修改方案,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12

最新评论