Java3D - некоторые классы не найдены, но путь к классам установлен правильно

У меня есть класс, который использует Java3D, который успешно компилируется, хотя когда я пытаюсь его запустить, он говорит: Exception in thread "main" java.lang.NoClassDefFoundError: javax/media/j3d/Canvas3D,

Со следующей трассировкой стека:

        at java.lang.Class.getDeclaredMethods0(Native Method)
        at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
        at java.lang.Class.getMethod0(Unknown Source)
        at java.lang.Class.getMethod(Unknown Source)
        at sun.launcher.LauncherHelper.getMainMethod(Unknown Source)
        at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
Caused by: java.lang.ClassNotFoundException: javax.media.j3d.Canvas3D
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)

Вещи, которые я уже пробовал:

  1. Я даже не мог его скомпилировать, пока не скопировал jar-файлы Java3D в /jre/lib/ext/.

  2. У меня есть последняя версия Java, Java3D, и я использую Notepad++, и я попытался переустановить Java3D.

  3. Я правильно установил classpath/path.

  4. Ошибок в коде нет.

  5. Я могу запускать обычные Java-приложения, которые я создал.

  6. Я пытался использовать classpath при запуске приложения (java -classpath blahblah ApplicationName).

  7. Я проверил внутри банки, и классы (включая Canvas3D) определенно там.


person Hsenfow    schedule 14.03.2013    source источник
comment
какой IDE ты используешь?eclipse??   -  person Biswajit    schedule 14.03.2013


Ответы (1)


Не все, что вы говорите, правда.

ЕСЛИ классы находятся в банках и ЕСЛИ вы правильно установили путь к классам, ТО вы не получите это сообщение.

Я подозреваю, что вы перепутали путь сборки с путем к классам (который в основном связан со временем выполнения, где путь сборки связан со временем компиляции). Не зная более подробной информации о вашей среде выполнения, трудно сказать что-то более конкретное.

Меня всегда удивляет, как кто-то с проблемой, которую он не может решить, так определенно утверждает, что все эти вещи устроены «правильно»: откуда вы знаете? Разве проблема не свидетельствует об обратном, по крайней мере достаточно для небольшого сомнения?

person arcy    schedule 14.03.2013
comment
Я поместил расположение jar-файлов Java3D (несколько местоположений) в переменные среды classpath и path, и я вполне уверен, что они верны. Что конкретно вам нужно знать о моей среде выполнения? Я бы дал вам все детали, которые у меня есть, но я не уверен, что вам нужно. Biswajit, я использовал Eclipse, хотя сейчас перестал его использовать. Вместо этого я использую Notepad ++, потому что он не выполняет эту раздражающую функцию автозаполнения. Также спасибо Бенджамину Грюнбауму за улучшение внешнего вида моего поста. - person Hsenfow; 14.03.2013
comment
(вздох) У нас едва ли достаточно информации, чтобы знать, что спрашивать. Вы упомянули блокнот, значит, вы используете интерфейс командной строки? В этом случае нам нужна ОС, каталог по умолчанию, расположение исходных файлов и файлов классов, значение пути к классам и строки с NoClassDefError вверху. Короче говоря, нам нужно знать среду, в которой вы работаете, и то, что происходит, в деталях, как это происходит, а не вашу интерпретацию этого с утверждениями, что все это правильно. - person arcy; 15.03.2013
comment
Извините, если я показался высокомерным, я просто считал, что сделал все, что требовалось. Да, я использую командную строку в Windows 7 64-разрядной версии Home Premium. Я не уверен, что вы имеете в виду под каталогом по умолчанию, хотя я собираюсь предположить, что вы имеете в виду место, где установлена ​​Java, то есть C:\program files (x86)\java\, там установлены Java 7, Java3D и JRE. . У меня есть файл класса и файл Java в папке на моем рабочем столе с копией CMD, которую я использую, потому что это проще. Линии, которые выплескиваются, находятся выше в моем вопросе. Я снова прокомментирую, так как у меня не осталось символов. - person Hsenfow; 15.03.2013
comment
Значение classpath: .;C:\Program Files (x86)\Java\jre6\bin\;C:\Program Files (x86)\Java\jre7\lib\ext\QTJava.zip;C:\Program Files (x86)\Java\Java3D\1.5.1\bin\;C:\Program Files (x86)\Java\Java3D\1.5.1\lib\ext\;C:\Program Files (x86)\Java\jdk1. 6.0_22\jre\lib\ext\ (кстати, я не могу сделать форматирование здесь) Что я делаю, чтобы столкнуться с ошибкой: я загружаю CMD.exe, набираю javac ‹file›, он успешно компилируется, затем я набираю java ‹file(просто имя файла)›, затем показывает ошибку выше. Спасибо. - person Hsenfow; 15.03.2013
comment
а в какой папке находится файл .jar, содержащий canvas3d? или у вас есть файл класса где-нибудь? похоже, у вас есть среда выполнения jre6 и библиотека QTJava в среде выполнения jre7; это, по крайней мере, сбивает с толку и, возможно, проблематично (если библиотека зависит от java7, вам не нужен java6 в этом пути). кроме того, QTJava представляет собой zip-файл; хотя вы МОЖЕТЕ назвать свой файл .jar таким образом, я бы подозревал, что это НЕ банка, а на самом деле это zip-файл, который вместо этого СОДЕРЖИТ банку. Вы можете посмотреть на его содержимое; если он содержит .jar, это может быть вашей проблемой. - person arcy; 15.03.2013
comment
Если быть точным, Canvas3D находится по адресу: C:\Program Files (x86)\Java\Java3D\1.5.1\lib\ext -> файл j3dcore rar -> javax\media\j3d\Canvas3D.class. Сейчас я уберу Java 6 из пути к классам. У меня он даже не установлен. - person Hsenfow; 15.03.2013
comment
когда вы используете командную строку, вы обязательно находитесь в каталоге, т.е. если вы введете команду pwd или cd, он покажет вам каталог. Многие (многие) команды, включая javac и java, используют этот каталог в качестве отправной точки для работы. Если вы введете javac A.java, он ожидает, что A.java находится в этом каталоге. Он называется вашим каталогом по умолчанию. - person arcy; 15.03.2013
comment
Я никогда не видел файл RAR, который был бы флягой; это почти наверняка сжатый файл, содержащий вашу банку. Вы можете загрузить эквивалентный zip-файл и распаковать его с помощью Windows или получить распаковщик RAR и распаковать его таким образом, но вам нужен файл .jar в пути к классам, а не сжатый файл, содержащий jar. Кроме того, вы должны иметь имя файла jar в пути к классам, а не в каталоге, в котором находится файл jar. - person arcy; 15.03.2013
comment
CMD.exe находится в той же папке, что и мой класс и java-файл, который находится на моем рабочем столе. Я установил JRE 7, но это не имеет значения (я также добавил JRE 7 в путь к классам). Кроме того, в моем предыдущем комментарии я сказал файл j3dcore rar, я должен был сказать файл jar. Это не rar-файл. - person Hsenfow; 15.03.2013
comment
Теперь у меня есть последние версии JDK и JRE (оба 64-битные), они начинают загружаться, затем я получаю эту ошибку: Исключение в потоке main java.lang.UnsatisfiedLinkError: нет j3dcore-ogl в java.library.path на java.lang. ClassLoader.loadLibrary(неизвестный источник) в java.lang.Runtime.loadLibrary0(неизвестный источник) в java.lang.System.loadLibrary(неизвестный источник) в javax.media.j3d.NativePipeline$1.run(NativePipeline.java:231) в java.security.AccessController.doPrivileged (собственный метод) - person Hsenfow; 15.03.2013
comment
Вам нужен только один из jre и jdk. jdk включает jre. Я думаю, что ошибка означает, что существует DLL (файл библиотеки Windows, родной, а не java), требуемый подпрограммой java, которую вы вызвали (имеет смысл для 3D-библиотеки), и у вас должна быть эта DLL на любом java.library.path. НЕ имеет значения, где находится CMD.EXE (он должен быть в пути), каталог по умолчанию связан с окном CMD, которое вы используете для ввода команд. - person arcy; 15.03.2013
comment
Я добавил местоположение j3dcore-ogl.dll в переменную среды пути к классам, и теперь это работает. Спасибо за помощь. - person Hsenfow; 15.03.2013