Исключение NoClassDefFoundError при использовании внешней библиотеки в проекте плагина EMF
Я работаю над проектом EMF, где я создал модель ecore из файла MDL. Я создал соответствующий файл gencore и сгенерировал код из файла gencore. Хотя у EMF есть собственный механизм сериализации на основе XMI, я хочу поддержать свой проект с помощью собственного механизма сериализации.
До сих пор я сделал необходимые шаги, и если я использую отладчик, соответствующие методы вызываются. Для чтения и записи в файл представления моей модели я хочу использовать внешнюю библиотеку. Я сделал следующие шаги
- Создал каталог lib/ в моем проекте плагина, куда я положил внешнюю библиотеку
- Добавлена библиотека в путь сборки проекта
- Добавлен каталог в bundle-classpath (Manifest.mf)
- Добавлен каталог в 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 во время выполнения). Пока что необходимы следующие шаги:
- Импортируйте файлы JAR, используя "Импорт -> Файловая система"
- Добавьте JAR-файл (ы) в раздел classpath вкладки времени выполнения Manifest/plugin.xml.
- Нажмите "Новый...", чтобы добавить "." библиотека обратно в путь к классам
- Убедитесь, что двоичная сборка экспортирует новые JAR-файлы на вкладке Build
- Нажмите сохранить
- Выберите базовый проект в представлении проводника проекта, щелкните правой кнопкой мыши и выберите "Инструменты 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 не обновляются в процессе генерации кода.
С другой стороны, если доступ к библиотеке вызывает исключение, я бы попытался удалить и повторно добавить зависимость или очистить сборку проекта, но, похоже, это не поможет устранить исключение.