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

389 篇文章 482 订阅 ¥19.90 ¥99.00

在这里插入图片描述

1.概述

转载并且补充: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种实现方法。

2.Bootstrap ClassLoader

Bootstrap ClassLoader 通过改变Xbootclasspath参数来实现,一般有3种方法:

  1. -Xbootclasspath: 完全取代基本核心的Java class 搜索路径.不常用,否则要重新写所有Java 核心class

  2. -Xbootclasspath/a: 后缀在核心class搜索路径后面(推荐使用)

  3. -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方式

3.Extention ClassLoader

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需要写成目录格式

4.Appclass Loader

Appclass Loader加载的是classpath配置的jar包,java -cp和java -jar命令启动程序的时候,有一些不同,主要为:

  1. java -jar启动的时候,java VM会屏蔽所有的外部classpath,也就是配置的 -cp/-classpath环境变量会失效,而只以本身jar的内部class作为类的寻找范围。这时候只能通过改变META-INF/MANIFEST.MF来设置classpath
  2. 而java -cp方式则可以正常加载内部的类来实现。

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

4.1 java -cp/classpath方式

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

4.2 java -cp方式

修改主类jar包 META-INF/MANIFEST.MF内容种的
Main-Class属性,例如

Main-Class: /home/test1.jar /home/test3.jar
#多个jar包用空格隔开

我的做法是:直接修改java.ext.dirs来加载jar包的属性来实现

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
如果你有一个 Maven 项目,并希望将其打JAR 文件以供其他 Maven 项目或非 Maven 项目使用,可以通过以下步骤实现: 1. 在项目的 `pom.xml` 文件中添加以下配置: ```xml <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.2.0</version> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <mainClass>com.example.MainClass</mainClass> <!-- 如果有主类,可以指定 --> </manifest> </archive> </configuration> </plugin> </plugins> </build> ``` 这会配置 Maven Jar 插件生成 JAR 文件,并在 MANIFEST.MF 文件中添加类路径和主类。 2. 使用 Maven 打项目: ```bash mvn clean package ``` 这将在 `target/` 目录下生成一个含编译后类的 JAR 文件。 3. 将生成的 JAR 文件安装到本地 Maven 仓库: ```bash mvn install:install-file -Dfile=path/to/jar/file.jar -DgroupId=com.example -DartifactId=my-project -Dversion=1.0 -Dpackaging=jar ``` 其中,`path/to/jar/file.jar` 是你生成的 JAR 文件路径,`com.example` 是你的项目组 ID,`my-project` 是你的项目 ID,`1.0` 是你的项目版本号。 这将在本地 Maven 仓库中安装你的项目,并使其可用于其他 Maven 项目。 4. 在其他 Maven 项目的 `pom.xml` 文件中添加以下依赖: ```xml <dependency> <groupId>com.example</groupId> <artifactId>my-project</artifactId> <version>1.0</version> </dependency> ``` 这将允许其他 Maven 项目引用你的 JAR 文件并使用其中的类。 如果你想在非 Maven 项目中使用你的 JAR 文件,可以将其添加到你的 Java 类路径中,例如: ```bash java -cp path/to/my-project-1.0.jar com.example.MainClass ``` 这将在命令行中运行你的主类,并将你的 JAR 文件添加到类路径中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值