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
相关产品推荐
相关产品推荐

