【发布时间】:2025-12-13 11:00:01
【问题描述】:
我有一个 jar 文件 foobar.jar 包含以下两个类:
public class Foo {
public static void main(String[] args) {
System.out.println("Foo");
}
}
另一个类是这样的:
import javax.batch.api.chunk.ItemProcessor;
public class Bar implements ItemProcessor {
public static void main(String[] args) {
System.out.println("Bar");
}
@Override
public Object processItem(Object item) throws Exception {
return item;
}
}
如果我使用以下命令执行程序,程序会按预期运行并打印Foo:
$ java -cp foobar.jar Foo
Foo
$
但是如果我尝试使用Bar类中的main方法启动程序,JVM会打印一个启动错误并退出:
$ java -cp foobar.jar Bar
Error: Could not find or load main class Bar
$
这与我尝试使用不在 jar 中的类启动程序的错误相同,例如
$ java -cp foobar.jar BarNotThere
Error: Could not find or load main class BarNotThere
$
为什么会出现此错误?可以启动Foo.main 方法并且我能够从jar 中反编译Bar 类的事实证明,该类应该在类路径中可用。我意识到这可能与接口 ItemProcessor 不在类路径上有关。但在这种情况下我不应该得到java.lang.ClassNotFoundException 吗?
【问题讨论】:
-
请注意*.com/questions/18093928/… 部分解决了这个问题。我遇到了这个问题,并试图用所说的问题来解决它。但起初我无法解决它,因为超类不在类路径上的问题是一种边缘情况。这就是我将这个特殊案例添加为新 Q/A 的原因。
标签: java jvm classpath classnotfoundexception classloading