У меня есть файл 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
$
Но если я попытаюсь запустить программу с помощью метода main в классе 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
в таком случае?