2015-09-23 4 views
1

Я нашел довольно много об этой ошибке, но почему-то ни одно из предлагаемых решений не разрешило проблему.java.lang.NoClassDefFoundError при попытке создать экземпляр класса из jar

Я пытаюсь использовать привязки JNA для libgphoto2 под Ubuntu в Eclipse (умеренный опыт работы с Java на Eclipse, я ничего не имею на Ubuntu). Связи, которые я хочу использовать, приведены здесь: http://angryelectron.com/projects/libgphoto2-jna/

Я выполнил шаги, описанные на этой странице, и сделал простой тестовый клиент, который не смог выполнить описанную выше ошибку. Поэтому я уменьшил тестовый клиент, пока единственное, что я пытался сделать, это создать экземпляр объекта GPhoto2, который все еще вызывал ошибку. Тестовый клиент выглядит следующим образом:

import com.angryelectron.gphoto2.*; 

public class test_class 
{ 
    public static void main(String[] args) 
    { 
     GPhoto2 cam = new GPhoto2(); 
    } 

} 

Ошибки, которые я получаю занимают значительно больше места:

Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/jna/Structure 
    at java.lang.ClassLoader.defineClass1(Native Method) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:760) 
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:467) 
    at java.net.URLClassLoader.access$100(URLClassLoader.java:73) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:368) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:362) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:361) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    at test_class.main(test_class.java:12) 
Caused by: java.lang.ClassNotFoundException: com.sun.jna.Structure 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    ... 13 more 

libgphoto2 сам установлен, он запускается из командной строки, я даже заголовки развития и я могу вызывать функции GPhoto2 из python, поэтому проблему там невозможно найти.

Однако, если посмотреть на файлы .class в Eclipse, они не имеют никаких определений. Поэтому я подумал, что это может быть проблемой, тем более, что при создании мусора произошла ошибка, хотя jar был успешно экспортирован, из чего я мог понять, что ошибка касается только генерации документации). Итак, я загрузил источник в затмение и сам построил .jar. В этом случае Eclipse заявила, что во время сборки были предупреждения (хотя ошибок не было), но не показывал мне фактических предупреждений. Если кто-нибудь скажет мне, где, черт возьми, журнал сборки пошел, что уже может что-то помочь. Я искал его везде без успеха, и если я нажимаю «детали» в eclipse, он просто сообщает мне, где были предупреждения, а не то, что они были.

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

Поскольку у меня нет опыта работы со строительными баночками, я сделал небольшую банку helloworld, просто чтобы узнать, могу ли я назвать это из другой программы или если у меня будут подобные ошибки. Он работал без сучка и задоринки. Я даже пытался воспроизвести проблему намеренно, экспортируя ее различными вариантами, но она все еще работала. Я попробовал реэкспортировать библиотеку, которая мне действительно нужна, с настройками, которые работали во время моего эксперимента, но они все равно не будут работать. Я почти застрял. Любые подсказки, которые помогут мне решить эту проблему, будут очень признательны.

+0

Можете ли вы вставить свою версию JDK? – chengpohi

ответ

2

В дополнение к тому, что @Paul Уилан сказал. Возможно, вам повезет, просто получите недостающую банку.

Получить недостающую библиотеку here, установить путь к классу, а затем повторно запустить приложение еще раз и посмотреть, будет ли он работать нормально или нет.

+0

Ваш ответ поставил меня прямо на трек, чтобы заставить его работать :) Я не понимал, что мне нужно связать с JNA в дополнение к привязкам, ваша рекомендация получить файл JAR jar заставила меня попробовать ... и ошибки изменились. Тогда я понял, что JNA также необходимо установить на систему самостоятельно, поэтому я сделал это. И теперь это работает! – UncleBob

1

В какой версии java вы используете com/sun/jna/Structure может работать только с определенными JVM.

В целом, такие упаковки, как солнце. , которые находятся за пределами платформы Java, могут быть разными на платформах ОС (Solaris, Windows, Linux, Macintosh и т. Д.) И могут быть изменены в любое время без уведомления с версиями SDK (1.2, 1.2.1, 1.2.3, и т.д). Программы, содержащие прямые вызовы на солнце. пакеты не являются 100% чистой Java.

Подробнее here

+0

попробуйте использовать JVM oracle и посмотрите, как вы попадаете на –

+0

Спасибо, это немного запутанно ... Я думал, что у меня установлен JVM Oracle. Сама библиотека была построена с openJDK, насколько я знаю ... Мне придется немного изучить мою систему. – UncleBob

1

Вашему банку нужен MANIFEST.MF, который сообщает вашему приложению, где находится библиотека. Создайте файл в проецировании корневой директории в затмении, и добавьте следующие строки:

Manifest-Version: 1.0 
Class-Path: <PATH_TO_LIB__CAN_BE_RELATIVE>.jar  // e.g Class-Path: ../test.jar 
<empty line> 

правой кнопкой мыши проект в затмении, перейдите Export-> next-> next-> next-> Использовать существующий манифест из рабочего пространства, выберите его и нажмите на конец. Это должно сработать.

Другое решение состоит в том, чтобы скомпилировать классы в банку с Maven.

Смежные вопросы