将fractals.jar作为Java库使用时运行FractalsTest报找不到主类错误
问题根源
你运行命令时的类路径配置不全,JVM无法找到你刚编译生成的FractalsTest.class文件。
Java类加载的规则是:只要你手动通过-classpath参数指定类路径,JVM就会完全忽略默认的类搜索逻辑,仅从你明确列出的路径下查找所有需要加载的类。你之前写的运行命令为java -classpath fractals.jar FractalsTest,这段配置等价于告诉JVM“只需要从fractals.jar这个压缩包内查找类”,完全没有把存放FractalsTest.class的当前桌面目录纳入搜索范围,自然会抛出Could not find or load main class FractalsTest、ClassNotFoundException: FractalsTest的异常。
正确的运行命令
你需要将两个类来源都加入类路径列表,让JVM既能找到自己写的FractalsTest类,又能找到fractals.jar里的依赖类:
- 需要纳入搜索范围的路径1:存放
FractalsTest.class的当前目录,用.符号指代 - 需要纳入搜索范围的路径2:存放分形程序依赖类的
fractals.jar
不同操作系统的多路径分隔符不同,对应命令为:
- Windows系统:路径分隔符为英文分号
;,执行命令如下
>java -classpath ".;fractals.jar" FractalsTest
- Linux/macOS系统:路径分隔符为英文冒号
:,执行命令如下
$ java -classpath ".:fractals.jar" FractalsTest
容易混淆的操作误区
- 不要默认编译阶段的类路径规则可以沿用到运行阶段:
javac编译源码时,会自动将当前目录加入类路径搜索范围;但java运行程序时,只要手动指定了-classpath参数,就会覆盖掉默认的“从当前目录搜索类”的规则,必须手动将当前目录显式加入类路径列表。 - 不要混用可运行jar的启动模式:
java -jar fractals.jar是专门执行带Main-Class清单配置的可运行jar的模式,这种模式下JVM的类加载范围被严格限制在jar包内部,不会读取外部的自定义类,自然找不到你写的FractalsTest。
内容的提问来源于stack exchange,提问作者Lee。
相关产品推荐
相关产品推荐

