Мой код компилируется в Eclipse, но я получаю ClassNotFound во время выполнения, как я могу это исправить?

Что может привести к тому, что jar будет успешно добавлен в проект Java Eclipse, но затем во время выполнения некоторые классы из этого jar не будут найдены с исключениями ClassNotFound?


person Michael Jay    schedule 19.04.2009    source источник


Ответы (4)


Переменная CLASSPATH во время выполнения, вероятно, установлена ​​неправильно, или вы пропустили добавление некоторых классов в файл jar.

person ojblass    schedule 19.04.2009
comment
Я расстегнул банку и просмотрел ее — я вижу там класс. Что касается пути к классам, я думал, что Eclipse автоматически позаботится об этом, когда вы добавляете банку в свой проект на вкладке «Библиотеки» пути сборки Java —> именно здесь я добавил ее, используя «Добавить внешнюю банку». Итак, вы говорите, что этого недостаточно - я не могу доверять Eclipse, чтобы знать, что это также нужно добавить в путь к классам? - person Michael Jay; 19.04.2009
comment
Java — сложный зверь, поэтому использование вами слова «ссылка» в вопросе отбрасывает обсуждение. По своей сути jar-файл — это просто zip-файл. В зависимости от того, как вы импортируете классы и структуру каталогов вашего файла jar, добавления файла jar верхнего уровня может быть просто недостаточно... Являются ли эти классы случайно анонимными внутренними классами? - person ojblass; 19.04.2009
comment
@Майкл, как ты запускаешь приложение? - person matt b; 19.04.2009
comment
Существует четкая разница между предоставлением доступа к JAR во время компиляции и во время выполнения. - person matt b; 19.04.2009
comment
Нет, рассматриваемый класс не является анонимным внутренним классом - просто ваш простой ванильный вид. Как бы то ни было, это фреймворк Google Guice, а класс называется com.google.inject.Module. Я просто пытался добавить эту структуру в проект с открытым исходным кодом, который требовал этого, но не предоставил его как часть своего собственного источника. Я провел целый день, пытаясь по-разному заставить эти два построить. Но это помимо того, что на основе новой информации, которую я вам дал, это, вероятно, не CLASSPATH? - person Michael Jay; 19.04.2009
comment
В разделе «Конфигурации запуска» я вижу guice.jar в разделе «Путь к классам», а также на вкладке «Источник» («Путь поиска источника»). - person Michael Jay; 19.04.2009
comment
Когда вы добавили файл .zip в свое приложение, вам, вероятно, пришлось щелкнуть его правой кнопкой мыши и сделать что-то, что изменило способ разрешения классов командой javac. Главный вопрос на самом деле тот, который задает Мэтт... как вы пытаетесь его запустить? Место, в которое вы его импортировали, может быть важным. Также попробуйте взять тот же zip-файл и добавить его к пути к классу, когда вы запускаете банку. - person ojblass; 19.04.2009
comment
ЭТО СРАБОТАЛО!!! СВЯТАЯ БОЖЬЯ МАТЕРЬ!! Хорошо, я предположил, что в обозревателе проектов я вижу тот же набор jar-файлов, который используется для запуска проекта, но нет, это было бы слишком просто. После того, как я добавил те же банки на вкладке Run Configurations/Classpath/Bootstrap Entries, это сработало. Я не могу отблагодарить вас за вашу помощь с этим. Почти забросил весь проект. - person Michael Jay; 19.04.2009
comment
Однако это любопытная вещь. Теперь файлы jar перечислены дважды на вкладке Classpath - один раз в разделе записей начальной загрузки (новое дополнение, которое заставило его работать) и один раз в пользовательских записях (где он был указан все время). Пользовательские записи, кажется, исходят из настроек проекта, которые вам нужны для компиляции. Но это сработало только после того, как я продублировал банки в записях начальной загрузки. Не уверен, что понимаю, почему мне нужно было «дублировать» записи jar. - person Michael Jay; 19.04.2009
comment
Я думаю, что записи загрузочного ремешка могут быть помещены в файл jar в какой-то специальной области, которая проверяется... Java прошла долгий путь с тех пор, как я использовал IDE... см. комментарий под ответом Джона. Я управляю многими процессами сборки и склонен ошибаться в настройках eplicity, а не обращать внимания на функции, которые заставляют вещи работать по волшебству. Я предполагаю, что материал начальной загрузки входит в какое-то мистическое свойство jar, которое заполняется. - person ojblass; 19.04.2009
comment
Ваша идея о записях начальной загрузки, добавляющих метаданные в банку, является интересной теорией. Я добавил новый вопрос, чтобы узнать, есть ли у кого-нибудь еще какая-либо информация по этому поводу, поскольку мои исследования в Google не нашли многого. stackoverflow.com/questions/764725/ - person Michael Jay; 19.04.2009

@ojblass почти наверняка прав. Просто чтобы расширить его, вы можете создать дамп файла jar с помощью инструмента jar(1) и посмотреть, есть ли там класс. У меня были сюрпризы от Eclipse, когда определение проекта не понимало, что должно было войти в файл jar, который я создавал для запуска с java -jar.

person Charlie Martin    schedule 19.04.2009
comment
По этой теме мне очень хочется узнать, могу ли я экспортировать то, что, по мнению eclipse, проект должен быть построен как... Я ненавижу безголовые сборки... - person ojblass; 19.04.2009
comment
Я расстегнул банку и просмотрел ее — я вижу там класс. Что касается пути к классам, я думал, что Eclipse автоматически позаботится об этом, когда вы добавляете банку в свой проект на вкладке «Библиотеки» пути сборки Java —> именно здесь я добавил ее, используя «Добавить внешнюю банку». Итак, вы говорите, что этого недостаточно - я не могу доверять Eclipse, чтобы знать, что это также нужно добавить в путь к классам? - person Michael Jay; 19.04.2009
comment
@oj, я вообще ненавижу IDE. @Майкл, расскажи нам, как ты запускаешь программу. Если это с «java -jar», то он должен работать, что заставляет меня подозревать, что вы работаете из командной строки с -classpath или не сказали Eclipse запускать как файл jar, и Eclipse генерирует форму -classpath. - person Charlie Martin; 19.04.2009
comment
Кроме того, если вы можете запустить материал в eclipse, возможно, было бы неплохо взглянуть на определения Run As... для некоторых подсказок. - person ojblass; 19.04.2009
comment
@ojblass - В разделе «Конфигурации запуска» я вижу guice.jar в разделе «Путь к классам», а также на вкладке «Источник» («Путь поиска источника»). - person Michael Jay; 19.04.2009
comment
@Charlie, честно говоря, я даже не знаю, java -jar или -classpath. Я только что настроил Run Configurations и нажал кнопку Run. - person Michael Jay; 19.04.2009
comment
@Michael, есть настройка проекта, позволяющая сделать настройки пути к классам явными. Я не могу точно сказать вам, где именно, так как у меня здесь не установлен Eclipse (см. выше, я ненавижу IDE), но ЕСЛИ вы запускаете его в Eclipse И получаете эту ошибку, ТОГДА у вас что-то не так в вашем проекте настраивать. - person Charlie Martin; 19.04.2009
comment
Спасибо, Чарли. Получил это работает. После того, как я добавил банки в свою конфигурацию времени выполнения (на самом деле это похоже на дублирующиеся записи!), Это сработало. Сделал ошибку, думая, что мои настройки компиляции также используются во время выполнения. Я просто предположил, что Eclipse достаточно умен, чтобы перенести эту информацию в настройки запуска. Спасибо за ваш отзыв. - person Michael Jay; 19.04.2009
comment
Eclipse 3.5M6 может создать исполняемый jar-файл с поддерживающими jar-файлами из конфигурации запуска. Очень удобно. - person Thorbjørn Ravn Andersen; 19.04.2009

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

person John Ellinwood    schedule 19.04.2009
comment
Не будет ли он просто брать первый найденный из пути к классам? - person ojblass; 19.04.2009
comment
Вы бы так подумали, но я полагаю, что столкнулся по крайней мере с загрузчиком классов, используемым в Sybase Jaguar, который избавился бы от дублированных записей пути к классам вместо того, чтобы брать первый - person John Ellinwood; 19.04.2009
comment
Мне придется удалить это... Вы знаете, это может объяснить какую-то хакерскую работу, которую мне пришлось выполнить для проекта JDBC... Клянусь, мои глаза кровоточили в то время. - person ojblass; 19.04.2009
comment
Теперь, когда это работает благодаря всеобщей помощи, мне интересно, почему это не работало раньше, потому что теперь файлы jar перечислены дважды на вкладке пути к классам - один раз под записями начальной загрузки и один раз под записями пользователя. Пользовательские записи, кажется, исходят из настроек проекта, которые вам нужны для компиляции. Но это действительно сработало только после того, как я продублировал банки в записях начальной загрузки. Не уверен, почему это будет. Любые идеи по этому поводу? - person Michael Jay; 19.04.2009
comment
Я думаю, что бутстрап добавляет некоторую метаинформацию в банки... уши, войны и банки имеют внутри себя файлы или свойства, которые автоматически проверяются во время выполнения... Я избегаю IDE и небольших гнид по умолчанию до такой степени, что это становится религией. Я явно избегаю любых тонкостей, которые дает мне IDE, и делаю свой код как во время компиляции, так и во время выполнения настолько явным, что он граничит с утомительным - person ojblass; 19.04.2009

У меня возникла эта ошибка из-за отсутствия разрешения. Оказывается, проверка того, подключены ли вы к Интернету (т. е. доступность) и разрешение на использование Интернета, являются отдельными разрешениями (живи и учись).

Отсутствие разрешения привело к сбою приложения с ошибкой ClassNotFound при попытке запустить тест доступности.

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

person Hunter-Orionnoir    schedule 21.10.2014