2010-09-15 3 views
2

Я работаю над проектом EMF, где я создал модель ecore из файла mdl. Я создал соответствующий файл gencore и сгенерировал код из файла gencore. Хотя EMF имеет собственный механизм сериализации на основе XMI, я хочу поддержать мой проект собственным механизмом сериализации.Исключение NoClassDefFoundError при использовании внешней библиотеки в проекте плагина EMF

До сих пор я сделал необходимые шаги, и если я использую отладчик, вызываются соответствующие методы. Чтобы читать и записывать представление файла моей модели, я хочу использовать внешнюю библиотеку. Я сделал следующие шаги

  1. Создан каталог Lib/в моем плагине проекте, где я поставил внешнюю библиотеку
  2. Добавлена ​​библиотека в путь сборки проекта
  3. Добавлено каталог, расслоение-классы (Manifest.mf)
  4. Добавлен каталог на bin.includes этого build.properties

Если я пытаюсь запустить свой код, я получаю исключение NoClassDefFoundError, и я не знаю, почему , Я создал конфигурацию запуска, в которой я запускаю проект как приложение eclipse. Итак, у кого-то есть идея, что мне не хватает?

Заранее благодарен!
Майкл

Edit: Ниже мой Manifest.mf файл

Manifest-Version: 1.0 
Bundle-ManifestVersion: 2 
Bundle-Name: de.hs_rm.cs.vs.dsm.OWL 
Bundle-SymbolicName: de.hs_rm.cs.vs.dsm.owl;singleton:=true 
Bundle-Version: 1.0.0 
Bundle-ClassPath: lib/, 
. 
Bundle-Localization: plugin 
Bundle-RequiredExecutionEnvironment: JavaSE-1.6 
Export-Package: owl, 
owl.impl, 
owl.util, 
rdfs, 
rdfs.impl, 
rdfs.util 
Require-Bundle: org.eclipse.core.runtime, 
org.eclipse.emf.ecore;visibility:=reexport 
Bundle-ActivationPolicy: lazy 

, а также мои build.properties

bin.includes = .,\ 
       model/,\ 
       META-INF/,\ 
       plugin.xml,\ 
       plugin.properties,\ 
       lib/ 
jars.compile.order = lib/,\ 
        . 
source.. = src/ 
output.. = bin/ 
source.lib/ = lib/ 
jars.extra.classpath = lib/owlapi-bin.jar 

ответ

1

Это не действительно стопроцентное решение, так как я не знаю, в чем проблема. Я нашел ссылку, где у кого-то была точно такая же проблема (добавлена ​​банка как библиотека, исключение NoClassDefFoundError во время выполнения). До сих пор необходимые шаги:

  1. Импорт JAR с помощью «Import -> Файловая система»
  2. Добавьте JAR-файл (ы) в разделе Путь к классам вкладке Manifest/plugin.xml выполнения
  3. Нажмите «Создать ...», чтобы добавить ».«Библиотека обратно к классам
  4. Проверьте, что бинарная сборка экспортирует новый JAR-файл (ы) на вкладке Построить
  5. Нажмите сохранить
  6. Выберите проект coressponding в окне Project Explorer, щелкните правой кнопкой мыши и выберите» PDE Tools -> Update classpath ". Это добавит новые JAR-файлы (файлы) в путь к классу проекта.

У меня были некоторые проблемы с последним шагом, так как я добавил библиотеку самостоятельно на путь сборки проекта. Каждый раз, когда я делал это затмение, удалял библиотеку из пути сборки, выполняя команду «Обновить класс pathpath». Я повторил шаг шесть без добавления g библиотека на путь сборки сама, и теперь она работает.

Мне кажется немного странным, но теперь он работает. В любом случае, я хотел бы поблагодарить вас за вашу помощь!

С уважением, Майклом

0

Если вы пишете Eclipse, плагины и не обычный старый проект Java вы должны добавить вашей библиотеки в поле пути к классам вкладки Runtime редактора Manifest.mf.

+0

Привет Мануэль, я добавил библиотеку (можно добавить только каталоги) в поле Пути к классам на вкладке выполнения (шаг 3 в моей должности), который создает запись о пачке классов в файле. Я посмотрел на вкладку сборки и добавил библиотеку, но это ничего не меняет. – 2010-09-15 12:04:07

+0

Что такое затмение класса с NoclassDefFoundError? Вы запускаете свой код как приложение Eclipse или java-приложение? Вам не нужно делать шаг 2 вашего вопроса, потому что вы пишете плагин. –

+0

Я запускаю код как приложение eclipse. Класс, который он жалуется, это OWLOntologyManager, который является частью библиотеки OWL-API. В методе doSave и doLoad имеется инициализация в первой строке обоих методов. Я построил тестовый проект, в котором я использую библиотеку, и все работает нормально (так что это не проблема с самой библиотекой). Я также попытался (как тест) использовать другой класс из библиотеки, который вызывает одно и то же исключение. – 2010-09-15 12:11:57

0

Получаете ли вы NoClassDefFoundError при попытке получить доступ к lib или при попытке доступа к модели Ecore? Если это последний случай, проверьте, был ли ваш пакет emf зарегистрирован в файле plugin.xml. Ищите что-то вроде следующей части:

<extension point="org.eclipse.emf.ecore.generated_package"> 
    <package 
     uri="«package URI here»" 
     class="«package class name here»" 
     genModel="«genmodel location here»"/> 
</extension> 

Эта часть может отсутствовать, если plugin.xml был создан до того, как genmodel был использован для генерации, так как ни манифеста, ни plugin.xml обновляется во время процесс генерации кода.

С другой стороны, если доступ к библиотеке вызывает исключение, я попытался бы удалить и повторно добавить зависимость или очистить сборку проекта, но это вряд ли решит исключение.

+0

Исключение возникает, когда я обращаюсь к библиотеке. – 2010-09-15 13:20:10

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