2010-02-24 7 views
2

Я постараюсь дать как можно больше подробностей здесь, простите меня, если кто-то не имеет значения. У меня есть два проекта в затмении. Проект 1: com.myworkplace.parent, с кодом в одноименном пакете. Проект 2: com.myworkplace.child, с кодом в одноименном пакете (я переместил свой код в этот пакет из пакета по умолчанию, если это имеет значение). Насколько я могу судить, они расположены в моей папке рабочего пространства и структурированы так, как вы ожидали.Eclipse classpath и NoClassDefFoundError

Я добавил ребенка к пути построения родительского элемента в eclipse с помощью Java Build Path -> Projects -> Add. Файл .classpath Родителя содержит запись:

<classpathentry combineaccessrules="false" kind="src" path="/com.myworkplace.child"/> 

Я добавить ссылку на класс com.myworkplace.child.Child в родителю, импортировать его, скомпилировать его без ошибок, запустить и получить:

java.lang.NoClassDefFoundError: com/myworkplace/child/Child 

Что дает?

Редактировать: Родительское приложение представляет собой приложение RCP, возможно, OSGI (я действительно мало знаю о RCP и связанных с ним вещах.) Некоторые поисковые запросы заставляют меня думать, что это может иметь какое-то отношение к этому.

ответ

6

Поскольку ваше приложение является приложением RCP, существует разница между путём класса eclipse, который используется во время редактирования кода и пути класса OSGi, который используется во время выполнения. Похоже, вам нужно добавить плагин com.myworkplace.child в список зависимостей плагина com.myworkplace.parent.

Откройте файл plugin.xml или META-INF/manifest.mf в родительском проекте. Eclipse должен открыть редактор плагинов PDE (редактор на основе форм для базовых файлов конфигурации). Перейдите на вкладку «Зависимости» внизу и добавьте дочерний плагин в список «Необходимые плагины» в левой части формы. В качестве альтернативы вы можете добавить пакет com.myworkplace.child в список «Импортированный пакет» справа. Разница между ними выходит за рамки этого ответа, но вы можете прочитать об этом в документах eclipse сейчас, когда вы (надеюсь) двигаетесь в правильном направлении.

+0

Это правильно. Если после этого это не сработает, щелкните правой кнопкой мыши на проекте в навигаторе и выберите параметр «Обновить класс». –

+0

Правильно, родительский плагин RCP.Ребенок не имеет и не имеет ничего общего с RCP. Поэтому я не могу добавить его через необходимые плагины. Загадочно, он также отсутствует в списке пакетов, которые можно импортировать. Мне удалось запустить приложение без ошибок одним методом: экспортировать дочерний элемент в виде баннера и добавить его во вкладку времени выполнения свойств плагина. Некрасиво. Во всяком случае, это достаточно хороший ответ для принятия. – jsn

+1

@jsn Просто дружеская рекомендация рассмотреть что-то, не зная специфики вашей ситуации: вам следует рассмотреть возможность преобразования дочернего проекта в плагин. Единственное различие заключается в добавлении файла META-INF/manifest.mf (или добавление нескольких особых записей OSGi в этот файл, если у вас их уже есть). Детский проект по-прежнему будет полностью использоваться в качестве отдельного (не OSGi) jar-файла для других целей, и он сделает более элегантную интеграцию с родительским RCP-приложением. – ChrisH

0

Если ваш код запущен на сервере приложений, вам необходимо правильно настроить путь к классу для этого сервера приложений.

Чтобы сделать это, откройте вкладку «Серверы», дважды щелкните его, нажмите «Открыть конфигурацию запуска» на новой вкладке, которая отображается в основной области редактирования, щелкните вкладку «Класс» и убедитесь, что путь к классу правильный.

+0

Нет, он не работает на сервере приложений – jsn

2

Мы обнаружили, что даже делая все необходимые вещи в проекте rcp eclipse, мы все еще получали такие ошибки. Решение заключалось в том, чтобы удалить каталог рабочей области приложения (по умолчанию он сохранит настройки рабочего пространства в .eclipse, но мы изменили наш код, чтобы использовать другой каталог, который не используется совместно с другими материалами eclipse).

Когда мы удалили этот реестр после восстановления, наше приложение сработало. По-видимому, это хранилище classpath каким-то образом наряду с другими настройками, но мы не исследовали точные детали.

(ПРИМЕЧАНИЕ. Это применимо только в том случае, если вы вызывали метод IWorkbenchConfigurer.setSaveAndRestore, передавая логическое значение «true», что означает, что ваше приложение будет сохранять и восстанавливать различные параметры rcp после завершения работы приложения и последующей перезагрузки .)

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