У меня есть файл 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
, JVM печатает ошибку запуска и завершает работу:
$ java -cp foobar.jar Bar
Error: Could not find or load main class Bar
$
Это та же ошибка, что и при попытке запустить программу, используя класс, который не находится в банке, например
$ java -cp foobar.jar BarNotThere
Error: Could not find or load main class BarNotThere
$
Почему я получаю эту ошибку? Тот факт, что метод Foo.main
можно запустить, и я могу декомпилировать класс Bar
из jar, доказывает, что класс должен быть доступен в пути к классам. Я понимаю, что это может иметь какое-то отношение к интерфейсу ItemProcessor
, не находящемуся в пути к классам. Но не должен ли я получить java.lang.ClassNotFoundException
в этом случае?