You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows10 PowerShell启动Java应用两种方式的差异及Java17异常排查

两种Java Jar启动方式的核心差异

1. 类路径与依赖加载逻辑不同

使用-classpath myfile.jar MainApplication启动

  • 仅将myfile.jar单独加入类路径,JVM不会读取该jar包中MANIFEST.MF的其他配置项(比如Class-Path)
  • 所有依赖的类/jar包必须显式通过-classpath参数指定,否则JVM无法找到这些依赖

使用-jar myfile.jar启动

  • JVM会自动解析MANIFEST.MF的完整配置:
    • 读取Main-Class确定主类(无需手动指定)
    • 读取Class-Path配置项,自动将其中声明的所有依赖jar包加入类路径
  • 确保应用所需的所有依赖类都能被正确加载

2. Java版本的行为差异

Java 17的模块系统对类加载的约束比Java 11更严格:

  • Java 11对类路径兼容性更强,即使依赖未显式声明,可能通过隐式扫描等方式被加载
  • Java 17则要求所有依赖必须明确加入类路径,否则会直接抛出依赖缺失的异常(你遇到的HTTP factory has not been set就是典型的依赖类未加载导致的)

3. 路径基准的差异

  • -jar启动时,JVM会以当前jar文件所在目录为基准,解析MANIFEST.MF中Class-Path的相对路径
  • -classpath启动时,路径基准是PowerShell的当前工作目录,如果依赖jar的相对路径是基于jar文件而非当前工作目录,就会出现依赖找不到的情况

对应你的场景分析

你的应用依赖的HTTP相关类所在的jar包,应该是通过构建工具(如Maven/Gradle)打包时,自动写入了MANIFEST.MF的Class-Path中。使用-jar启动时这些依赖会被自动加载,而-classpath启动时没有加载这些依赖,导致HTTP工厂无法初始化,最终抛出异常。

内容的提问来源于stack exchange,提问作者Plamen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 18:19:55