Java: простой проект JAR при запуске не может найти импортированный класс во втором простом проекте JAR, хотя второй JAR прошел через -classpath - PullRequest
0 голосов
/ 06 июня 2011

Я написал два простых 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.

Этот очень базовый момент заставляет меня сбиться с толку - ответ, объясняющий, что я делаю неправильно, был бы оченьоценили.

Ответы [ 2 ]

2 голосов
/ 06 июня 2011

Путь к классу игнорируется при использовании опции -jar.Способ запустить ваше приложение будет java -classpath "P:\_Dan\work\JavaProjects\JarFuckup\innerjar\target\innerjar-1.0-SNAPSHOT.jar";"P:\_Dan\work\JavaProjects\JarFuckup\outerjar\target\outerjar-1.0-SNAPSHOT.jar" daniel347x.outerjar.App

0 голосов
/ 06 июня 2011

Возможно, лучшим подходом было бы добавить файл манифеста в Jar, в котором указывается путь к классу зависимых Jar-файлов по относительным путям.Тогда ..

java -jar "P:\_Dan\...\outerjar-1.0-SNAPSHOT.jar"

.. должен сделать это.

Двойной щелчок по основному кувшину также запустит его.Это в основном полезно для графического интерфейса.

...