Исключение NoClassDefFoundError при использовании внешней библиотеки в проекте плагина EMF

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

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

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

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

Заранее спасибо!
Майкл

Изменить: ниже моего файла 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

3 ответа

Решение

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

  1. Импортируйте файлы JAR, используя "Импорт -> Файловая система"
  2. Добавьте JAR-файл (ы) в раздел classpath вкладки времени выполнения Manifest/plugin.xml.
  3. Нажмите "Новый...", чтобы добавить "." библиотека обратно в путь к классам
  4. Убедитесь, что двоичная сборка экспортирует новые JAR-файлы на вкладке Build
  5. Нажмите сохранить
  6. Выберите базовый проект в представлении проводника проекта, щелкните правой кнопкой мыши и выберите "Инструменты PDE -> Обновить путь к классу". Это добавит недавно добавленные JAR-файлы в путь к классам проекта.

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

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

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

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

Получаете ли вы 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 не обновляются в процессе генерации кода.

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

Другие вопросы по тегам