java -jar命令运行 jar包时如何运行外部依赖jar包

java -jar命令运行 jar包时如何运行外部依赖jar包

场景:

打包发不完,运行时。发现一个问题,

java java.lang.NoClassDefFoundError: org/apache/commons/lang3/ArrayUtils

显示此,基本表明,没有这个依赖,如果在开发中,在maven的pom.xml 中引入即可;

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.12.0</version> <!-- 使用最新版本或适合你项目的版本 -->
</dependency>

但是;此时只有jar包,无法修改代码。如何解决呢?

解决:

直接在java -jar test.jar 时,添加参数。

方法一、启动参数添加: -Xbootclasspath/a

java -Xbootclasspath/a:custom-rt.jar -jar test.jar

方法二、使用Extension Classloader来加载

要让Extension Classloader加载你的类,需要:

  1. 将你的JAR文件放入:

    • <JAVA_HOME>/jre/lib/ext目录(JDK 8及之前)
    • 或由java.ext.dirs系统属性指定的目录
  2. 或者运行时指定扩展目录:

    java -Djava.ext.dirs=/path/to/your/extensions -jar test.jar
    

此时此景,只能采用2;值的注意的注意⚠️的是;

使用java.ext.dirs,需要同时添加 <JAVA_HOME>/jre/lib/ext 和你自己的目录,不然只能使用你自己的目录。

实际语句:
java -Djava.ext.dirs=$JAVA_HOME/jre/lib/ext:/tmp/lib/  -jar test.jar
### 解决 `java -jar` 命令运行 JAR 文件无反应的问题 当遇到 `java -jar` 执行 JAR 文件没有任何响应的情况,可能由多种原因引起。以下是几种常见情况及其对应的解决方案。 #### 1. 主类未指定 如果 JAR 文件中的 MANIFEST.MF 清单文件缺少 Main-Class 属性,则执行 `java -jar` 后不会有任何输出或行为。为了验证这一点,可以尝试使用 `-verbose:class` 参数来查看加载过程: ```bash java -verbose:class -jar your-application.jar ``` 这可以帮助确认是否有任何类被加载以及是否存在主方法[^1]。 #### 2. JVM 版本不兼容 确保用于编译应用程序的 JDK 版本与目标环境中使用的 JRE/JDK 版本相匹配。版本差异可能导致字节码无法正确解析,从而造成程序看似“冻结”。可以通过以下方式检查当前环境下的 Java 版本: ```bash java -version ``` 并对比项目构建配置中所设定的目标版本。 #### 3. 资源路径问题 对于某些依赖本地资源的应用来说,在不同操作系统之间迁移可能会因为路径格式的不同而失败。特别是 Windows 和 Linux/Unix 系统之间的转换尤为明显。注意调整所有硬编码的绝对路径为相对路径或将它们参数化以便于跨平台移植[^4]。 #### 4. 日志记录缺失 许多应用默认情况下只会在控制台打印严重级别的日志消息;而在开发阶段通常会设置更宽松的日志级别(如 DEBUG)。因此建议先开启最详尽的日志模式再观察具体表现: 修改启动脚本加入如下选项: ```bash -Dlog.level=DEBUG ``` 或者直接在命令行追加此参数: ```bash java -Dlog.level=DEBUG -jar your-application.jar ``` 这样做有助于捕获潜在异常堆栈跟踪信息,进而定位根本原因。 #### 5. 阻塞操作卡住 有后台线程长间等待外部输入(比如数据库连接池耗尽、HTTP 请求超等),也会让前台看起来像是完全停滞了一样。此应该仔细审查代码逻辑,尤其是涉及到 I/O 或者并发的部分,寻找可能出现阻塞性调用的地方,并考虑增加合理的超机制以防止无限期挂起。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值