Я написал два простых Java-класса (один из них содержит main (), а другой вызывается main ()).
Class # 1 (содержит main ()):
package daniel347x.outerjar;
import daniel347x.innerjar.Funky;
public class App
{
public static void main( String[] args )
{
Funky.foo();
}
}
Класс # 2 (вызывается функцией main ()):
package daniel347x.innerjar;
public class Funky
{
public static void foo()
{
System.out.println( "Funky!" );
}
}
Указанные выше классы появляются в разных корневых папках проекта и используют Maven в качестве системы сборки (каждый проект имеет свой собственный POM).Файл pom.xml для основного проекта содержит правильную запись для добавления daniel347x.outerjar.App
в качестве основного класса, и он правильно включает в себя зависимость от daniel347x.innerjar
.Оба проекта успешно встраиваются в файлы JAR.
Я использую NetBeans, чтобы обернуть их как проекты Maven (фактически, я использовал NetBeans для создания обоих проектов).Когда я запускаю основной проект из NetBeans, он запускается успешно, и я вижу Funky!
в качестве вывода.
Однако, когда я пытаюсь запустить основной класс прямо из командной строки Windows (cmd.exe), передавая JAR-файл, содержащий Funky
в пути к классам командной строки, следующим образом:
java -classpath "P:\_Dan\work\JavaProjects\JarFuckup\innerjar\target\innerjar-1.0-SNAPSHOT.jar" -jar "P:\_Dan\work\JavaProjects\JarFuckup\outerjar\target\outerjar-1.0-SNAPSHOT.jar"
... Я получаю страшные NoClassDefFoundError
:
Exception in thread "main" java.lang.NoClassDefFoundError: daniel347x/innerjar/Funky
at daniel347x.outerjar.App.main(App.java:7)
Я тщательно подтвердил, что в указанном выше * JAR-файле innerjar
, содержащем Funky
, структура пути daniel347x\innerjar
, а в папке innerjar
- файл Funky.class
- и этот файл выглядитисправить в редакторе HEX, где я вижу строки ASCII, представляющие имя класса.
Тот факт, что класс не может быть найден, не поддается моему пониманию Java, которое, как я думал, позволяет передавать файлы JARв качестве параметра -classpath
, и он сможет находить классы внутри этих файлов JAR.
Этот очень базовый момент заставляет меня сбиться с толку - ответ, объясняющий, что я делаю неправильно, был бы оченьоценили.