Eclipse - java.lang.ClassNotFoundException

95

При попытке запустить JUnit-Test из Eclipse я получаю исключение ClassNotFoundException. При запуске "mvn test" с консоли - все работает нормально. Кроме того, в Eclipse нет сообщений о проблемах.

Моя структура проекта следующая:

  • родительский проект (пом-упаковка)
    • Веб-проект (военная упаковка - мой JUnit-тест здесь)
    • Гибкий проект
    • Проект конфигурации

edit: Как не найти класс? Это простое приложение HelloWorld без специальных библиотек.

Вот моя конфигурация запуска JUnit: альтернативный текст http://www.walkner.biz/_temp/runconfig.png


Testclass (но, как я уже сказал, он не работает и с простым HelloWorld ...):

import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import biz.prognoserechnung.domain.User;
import biz.prognoserechnung.domain.UserRepository;
import biz.prognoserechnung.domain.hibernate.UserHibernateDao;

public class UserDaoTest {
/**
 * the applicationcontext.
 */
private ApplicationContext ctx = null;

/**
 * the user itself.
 */
private User record = null;

/**
 * Interface for the user.
 */
private UserRepository dao = null;

@Before
public void setUp() throws Exception {
String[] paths = { "WEB-INF/applicationContext.xml" };
ctx = new ClassPathXmlApplicationContext(paths);
dao = (UserHibernateDao) ctx.getBean("userRepository");
}

@After
public void tearDown() throws Exception {
dao = null;
}

@Test
public final void testIsUser() throws Exception {
Assert.assertTrue(dao.isUser("John", "Doe"));
}

@Test
    public final void testIsNoUser() throws Exception {
    Assert.assertFalse(dao.isUser("not", "existing"));
        Assert.assertFalse(dao.isUser(null, null));
        Assert.assertFalse(dao.isUser("", ""));
    }
}
Swalkner
источник
3
Я получаю ту же ошибку при попытке запустить простой класс HelloWorld без JUnit ... Точнее: java.lang.NoClassDefFoundError: HelloWorld Вызвано: java.lang.ClassNotFoundException: HelloWorld
swalkner
ClassNotFoundException возникает при попытке отразить класс. NoClassDefFoundError выдается, когда вы пытаетесь использовать класс в обычном вызове метода.
AKF
можешь показать код своего тестового класса?
AKF
у вас сборка автоматически включается или выключается?
Джон
автоматически включается
сборка

Ответы:

194

Я сталкивался с этой ситуацией несколько раз и после множества попыток нашел решение.

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

Например, ваш веб-проект src/main/javaдолжен находиться в target/classesрамках веб-проекта, тестовые классы также должны находиться в target/test-classesрамках веб-проекта и т.д.

Использование этой конфигурации позволит вам выполнять модульные тесты в eclipse.

Еще один совет: если для тестов вашего веб-проекта требуются некоторые файлы конфигурации, которые находятся в ресурсах, обязательно включите эту папку в качестве исходной папки и выполните правильную конфигурацию пути сборки.

Надеюсь, поможет.

Карлос
источник
1
Привет, Карлос, большое спасибо за совет. Но, к сожалению, это не помогло. Я добавил / src / main / java (target / classes) и / src / test / java (target / test-classes) в исходные папки, а также src / main / resources (applicationContext.xml, некоторые свойства - target / classes ). Та же проблема - при запуске моего src / test / java / UserDaoTest.java в качестве JUnit-test из Eclipse я получаю «Класс не найден UserDaoTest java.lang.ClassNotFoundException: UserDaoTest». По крайней мере, это немного отличается от исходного сообщения об ошибке ...
swalkner 01
5
Вы на правильном пути, проверьте, находится ли класс UserDaoTest в соответствующей выходной папке в вашей файловой системе (как вы, возможно, знаете, Eclipse компилирует все ваши исходные файлы и помещает их, среди прочего, в указанную выходную папку, чтобы возможность запускать тесты). Если класс не отображается в выходной папке, проверьте фильтры включения / исключения пути сборки для этой конкретной папки. Удачи.
Карлос
Для меня это не устранило проблему. Оказалось, что это проблема AspectJ. Если вы используете AspectJ, попробуйте удалить и прочитать возможности AspectJ - у меня сработало
Stefan Haberl
1
Была такая же проблема. Я думаю, что это проблема проекта eclipse - maven - git. Это на самом деле не сужает его, но стирание всех папок метаданных (.project, .whatever ...), удаление проекта и повторный импорт только как проект maven сработали для меня. Я также обнаружил то, о чем не знал, что может делать eclipse-junit: выделение метода тестирования и выбор RunAs-Junit запускает только этот конкретный метод тестирования, а не весь тест! Больше никаких @Ignoreповсюду и горячих клавиш!
bgs
Столкнулся с той же проблемой, я просто использовал Eclipse -> Project -> clean, и это сработало. Mvn clean не получилось.
Нутан
46

Подход Карлоса помог! Eclipse - java.lang.ClassNotFoundException

Попробуйте проверить путь к классам конфигурации запуска junit:

  1. Откройте свои конфигурации запуска
  2. Щелкните jUnit-Test, который хотите запустить.
  3. перейдите на вкладку classpath
  4. Попробуйте добавить папку (нажмите на записи пользователей, нажмите «Дополнительно», нажмите «Добавить папки», нажмите «ОК» и выполните поиск в выходной папке для ваших тестовых классов (те, которые вы найдете в пути сборки Java projektproperties, источник))

работает для меня.

КофеJunky
источник
2
Разве это не странно? У меня это сработало, но каталог целевых классов является частью пути к классам сборки для проекта. Не имеет особого смысла добавлять определенный класс.
Хосе Муанис,
Я не думаю, что это действие обязательно добавляет необходимый каталог, поскольку вызывает перезагрузку. Скорее всего, вы можете сразу удалить вновь добавленный каталог после успешного запуска, и он должен работать как обычно. Кроме того, комментарий выше правильный. Возможно, вы также захотите проголосовать за упомянутую благодарность от Карлоса.
awied
Я нашел ответ на другой вопрос SO, который поможет решить эту проблему: stackoverflow.com/a/5718520/901641
ArtOfWarfare
16

ваш путь к классам сборки правильный, поэтому вы можете скомпилировать. необходимо проверить путь к классам вашего JUnit. перейдите в меню «Выполнить» и выберите «Открыть диалоговое окно запуска». там вы должны увидеть дерево слева с JUnit в качестве опции. откройте этот узел и найдите и выберите свой тест. на правой панели вы увидите вкладку для пути к классам. убедитесь, что ваш класс, который тест пытается создать, будет найден.

редактировать:

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

  • размещение maven в bootclasspath НАД jre работает, или
  • бег mvn clean testделает свое дело или
  • обновление всех ваших проектов eclipse, вызывающее перестройку, устраняет проблему
  • перейдите в свой проект и выберите Maven-> Обновить конфигурацию, чтобы решить проблему

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

вот и вот некоторая информация

АКФ
источник
1
к сожалению, «Maven => Обновить конфигурацию» вообще не решает проблему ... верно и обратное; он удаляет конфигурации пути сборки ... Или это означает, что какая-то другая конфигурация плохая?
swalkner 01
Точно, как указал @swalkner: Maven => Update configuration разрушит конфигурацию пути сборки. По какой-то причине, которая ускользает от меня, плагин будет устанавливать фильтры исключения, которые мне всегда приходится удалять вручную после запуска команды
Стефан Хаберл
"перейдите в меню" Выполнить "и выберите" Открыть диалог запуска ". А? Где это?
Берит Ларсен
4

Возможно, проблема заключается в отсутствии файла класса в папке сборки. Одно из решений - очистить проект и перестроить его.

EvilFish
источник
4

Включение [х] Использовать временный файл JAR , чтобы указать путь к классам (для ограничения длины избежать CLASSPATH) , внутри вкладки Classpath в конфигурации Run сделал трюк для меня.

Если ваш проект огромен и у вас много зависимостей от других родственных проектов и зависимостей maven, вы можете столкнуться с ограничениями длины пути к классам, и это, кажется, единственное решение (помимо того, что каталог для вашего локального репозитория maven короче (наш уже запускается при ц: / м2)

введите описание изображения здесь

user3018906
источник
3

Здесь есть много замысловатых предложений.

Я несколько раз сталкивался с этой проблемой с проектами Maven после перемещения ресурсов путем перетаскивания или выполнения рефакторинга имен классов.

Если это произойдет, просто скопируйте (не перемещайте) проблемный Test Case ( .java) через терминал / обозреватель файлов в другое место right-click -> Deleteв Eclipse и выберите удаление на диске при наличии соответствующей опции, переместите / скопируйте скопированный файл в исходное расположение файла, затем выберите свой проект в Eclipse и нажмите F5, чтобы обновить ресурсы.

Это быстро и легко сделать, и каждый раз проблема решалась для меня навсегда.

КомодоДэйв
источник
У меня возникает соблазн спросить, решает ли он вашу проблему навсегда или каждый раз ... но я понимаю, что вы имеете в виду, и, что удивительно, это помогло мне.
Амос М. Карпентер
3

У меня была точно такая же проблема, но я ее понял! Перейдите в файл проекта и щелкните его правой кнопкой мыши, затем щелкните Refreshили нажмите F5. Тогда попробуйте запустить его. Если это все еще не работает, просто забудьте об этом, так как у меня была ТОЧНАЯ такая же проблема, и это просто означает, что ваша версия Eclipse - мусор.

Starfox275
источник
2

Это было моим решением проблемы. Конечно, это может произойти по многим причинам. Для меня это было то, что Maven2 (не плагин для Eclipse) настраивал профиль eclipse для использования другого конструктора (aspectJ), но у меня не было плагина в eclipse./

http://rbtech.blogspot.com/2009/09/eclipse-galileo-javalangclassnotfoundex.html

Ура, Рамон Бакленд


источник
2

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

"Здравствуй,

Это очень старый июль (в каком году), но у меня была такая же проблема.

Фактическая проблема обнаружила, что eclipse не смог сгенерировать файл класса для файла java, путь к классам был правильным.

Перейдите на вкладку с проблемами и проверьте, не хватает ли в вашем проекте чего-либо / файла. вы можете создать новый проект и добавлять файлы один за другим и строить их, пока он не перестанет компилировать и создавать классы (проверьте папку workspace / proj / bin / package / для классов)

Как ни странно, но правда, ecplise не соответствовал требованиям, потому что 4 из 20 файлов java использовали одно изображение, которое отсутствовало. и в результате ни один из java-файлов не был скомпилирован.

CLASSPATH здесь не проблема ".

кисна
источник
2

У нас было точное исключение (с использованием SpringSource Tools, tomcat, в Win7), и причина заключалась в том, что мы реорганизовали имя файла (переименовали файл) с SubDomain.java на Subdomain.java (D vs d), и каким-то образом оно столкнулось, хотя SpringSource был показывая новое имя Subdomain.java. Решением было удалить файл (через SpringSource) и снова создать его под именем Subdomain.java и скопировать его прежнее содержимое. Просто как тот.

Romie
источник
Я всегда запускал тестовые примеры junit, пока не запустил программу, которая проверяет совместимость ПК перед обновлением Windows. Казалось, что что-то сломалось, я не могу снова запустить тестовые примеры JUnit. (и все существующие ответы не работают)
CoffeDeveloper
2

Я решаю этот путь Bulit ---> библиотеки ---> добавить библиотеку ---> Junit check junit4

Wanfke
источник
1

нажмите project->properties->Java build path->Sourceи проверьте, что каждая srcпапка все еще существует или недавно удалена. Исправьте любой отсутствующий или неправильный путь, перестройте и запустите тест. Это решит проблему.

неизвестный
источник
1

Все, что я сделал, это Свойства -> Путь сборки Java -> Порядок и экспорт -> Включил все снятые флажки -> полностью переместил Junit вверх.

Сиддхартх
источник
1

Пытался

Link : [here][1]

Open your run configurations
Click on the jUnit-Test you want to start
go to the classpath tab
Try to add a folder (click on user entries, click on advanced, click on add folders,click on ok and search the outputfolder for your test classes(those you find under projektproperties java build path, source))

работал после

Maven 2 LifeCycle >> тест

user2246725
источник
1

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

Потерпев некоторое время, я просто исправил это:

  1. Через Runменю
  2. Выбрать Run Configurations
  3. Выберите конфигурацию запуска, связанную с вашим модульным тестом.
  4. Удаление записи из Run Configurationсписка путем нажатия кнопки «Удалить» или красного значка X.

Что-то, должно быть, напортачило с кэшированной конфигурацией запуска.

Серый
источник
1
После того, как я потратил слишком много времени впустую, я проделал описанные выше шаги. Затем я принял героическое решение удалить все конфигурации запуска тестов, и теперь ни один из моих тестов не может быть найден в пути к классам, хотя новая конфигурация запуска четко показывает проект в нем (с зависимостями maven внизу). Я все время забываю, насколько хрупкое затмение. После этого никакие тесты не могут быть запущены с eclipse (прежде чем я смогу выбрать конкретный тест - хорошо). Наконец, я попробовал предложение KomodoDave ниже. Это исправило ... удивительные петли, через которые вам нужно перепрыгивать с помощью этого идеала (последний из серии ..)
Джастин
1

Удаление проекта из eclipse (не с жесткого диска), которое в некотором роде очищает рабочую область и повторно импортирует проект в eclipse, снова сработало для меня.

Хари Хара Эрлапати
источник
1

Обычно эта проблема возникает при запуске javaинструмента Java-приложения, который не может найти файл класса.

В основном в проекте maven мы видим эту проблему из -за проблемы с синхронизацией Eclipse-Maven . Чтобы решить эту проблему: Maven-> Обновить конфигурацию

Премрадж
источник
0

Пробовали ли вы щелкнуть правой кнопкой мыши корень проекта, выбрать «Свойства» и убедиться, что CLASSPATH верен? Если я правильно помню, вот как вы это делаете.

Что-нибудь о том, как Eclipse выполняет модульные тесты, требующие особого добавления junit JAR в среду выполнения CLASSPATH?

Я использую IntelliJ, поэтому у меня нет этих проблем.

Я бы сам посмотрел Eclipse, но предпочитаю, чтобы он не был на моем рабочем столе.

Duffymo
источник
хорошо, без обсуждения Eclipse vs. IntelliJ; Я бы хотел, чтобы он работал в Eclipse ... и я проверил Java Build Path - Java JDK есть, и мне больше ничего не нужно для моего примера HelloWorld ... Я думаю, что это как-то связано с 'исходные папки на пути сборки' ... Я установил их в папку, в которой начинается мой пакет ... Я полагаю, что это правильно.
swalkner
Вам действительно нужно что-то помимо JDK - это путь к HelloWorld.class, верно? "исходные папки на пути сборки" - звучит лучше. Не нужно предполагать, будь экспериментатором и попробуй. Eclipse сообщит вам, правы ли вы.
duffymo
0

Хм, выглядит немного странно, попробуйте запустить его со следующей аннотацией в верхней части класса:

@RunWith(SpringJUnit4ClassRunner.class)
public class UserDaoTest {
}

и дайте мне знать, как вы с этим справляетесь.

Убедитесь, что у вас также включена автоматическая сборка. Если вы хотите убедиться, что ваши тестовые классы компилируются правильно, очистите целевую папку Maven (и любую папку bin, которую может использовать Eclipse). Вы тоже используете m2eclipse, я нахожу это немного проблематичным.

Джон
источник
большое спасибо за ответ, но тем не менее: тоже не работает; сначала я должен включить spring-test.jar, затем другая зависимость не заполнена. Я не понимаю, почему он не работает с простым классом helloworld в том же пакете. и там мне не нужен "хак" вроде предложенного вами ... что-то не так с "classpath" или чем-то подобным, но я не понимаю, где / что мне нужно проверить ...
swalkner
0

Решение моей проблемы было аналогичным: библиотеки были недействительными. Если вы посмотрите файл .classpath проекта, вы увидите теги classpathentry с ключом / значением kind = "lib". Некоторые из моих были неправильными.

Я не обнаружил этого, пока не отключил настройки проверки. То есть в файлах JSP и т. Д. Было так много ошибок, что ошибки пути к классам не были очевидны (или, возможно, даже не обнаруживались). В результате в конечные выходные папки ничего не компилировалось, но никаких полезных ошибок о причинах не было.

Майк
источник
0

Укажите, чтобы исправить JDK, выбрав Windows> Настройки> Java> Установленная JRE.

Не указывайте на jre, указывайте на правильный JDK. Я указал на JDK 1.6U29 и обновил проект.

В дальнейшем проблема исчезнет, ​​и тесты jUnit работают нормально.

Спасибо,
-Tapas

Тапас адхикари
источник
0

Недавно я столкнулся с той же ошибкой в ​​Eclipse, т. Е. Eclipse IDE не смогла найти класс Unit test независимо от того, как я меняю конфигурации. Изучая предыдущие сообщения здесь и на других веб-сайтах, я дважды и трижды проверил путь к классам и исходную информацию, а также перемещался вверх и вниз по исходной папке и библиотекам как в «Конфигурации запуска», так и в «Пути сборки Java». "config, и я также очистил проект и перестроил его, но ни один из приемов у меня не работает. Конкретный проект Java - это старый проект, скомпилированный в ANT, и в библиотеку Eclipse включено множество jar-файлов.

Затем я изменил класс модульного теста, добавив метод main (), и щелкнул его правой кнопкой мыши на «Запуск от имени» Java-приложения вместо теста JUnit, и внезапно Eclipse, кажется, просыпается и правильно идентифицировал класс. После этого я снова переключил его на приложение для модульного тестирования, и оно все еще работает.

Кажется, это ошибка в Eclipse, я предполагаю, что большое количество библиотек (> 260) может запутать способность JVM найти мой класс JUnit.

Хуню Чжан
источник
0

Меня тоже поразила эта проблема, и я смог найти подходящее решение для своего случая. Если ваш проект Eclipse имеет файл .classpath в корне вашего проекта (смотрите его в представлении Navigator вместо представления Package Explorer), убедитесь, что ваш Maven classpathentry появляется до вашего JRE Container classpathentry.

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER"/>
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
</classpath>

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

И проект-> очистка никогда не повредит вещам после того, как вы внесете изменения.

смч
источник
0

Убедитесь, что ваша конфигурация запуска теста НЕ содержит следующих строк, ИЛИ попробуйте включить автоматическое управление зависимостями Maven.

<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="org.maven.ide.eclipse.launchconfig.classpathProvider"/>
<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.maven.ide.eclipse.launchconfig.sourcepathProvider"/>
thSoft
источник
0

Я перепробовал все, что читал в этом длинном посте, и, что невероятно, у меня сработало, вместо того, чтобы щелкнуть тестовый класс и выбрать Run as JUnit test, щелкнуть метод теста и запустить его от имени JUnit test. Я не имею понятия почему?

змея
источник
0

Тест JUnit изнутри eclipse дал мне также NoClassDefFoundError. Выполнение «mvn clean test» из командной строки дало мне следующую ошибку в нескольких банках: неверный заголовок LOC (плохая подпись) Удаление этих банок из локального репозитория m2 и запуск «mvn clean test» снова решило мою проблему.

RutgerDOW
источник
0

У меня такая же проблема. Все, что я сделал, было,

я). Сгенерированные артефакты Затмения

mvn clean eclipse:eclipse

II). Обновите проект и повторно запустите тест junit. Должно работать нормально.

Викрам
источник
0

Кроме того, ДВОЙНОЙ ПРОВЕРЬТЕ диалоговое окно eclipse «Сборка веб-развертывания».

Его можно найти: Свойства проекта-> Сборка развертывания.

Недавно у меня был плагин eclipse для модификации одного из моих веб-проектов, и он добавил ~ таинственным образом ~ добавил тестовые каталоги maven / src / test / java, / src / test / resources в сборку развертывания. УГГГ !!!

Вот почему мой проект работал нормально, когда я построил и развернул просто maven в tomcat, без ClassNotFoundExceptions ... Однако, когда я выполнил развертывание через Eclipse, Whammo !! Я начинаю получать ClassNotFoundExceptions, потому что TestCode развертывается.

Эрик

Эрик Мэнли
источник
0

Это означает, что в вашем pom.xml есть нерешенные проблемы. Откройте вид проблем и решите соответственно. Тогда вы сможете успешно запустить тестовые примеры, не столкнувшись с classnotfoundexception.

Раджу Рао
источник
0

Изменение порядка артефактов пути к классам в пути сборки Java решило эту проблему.

  1. Щелкните правой кнопкой мыши проект и перейдите к пути сборки проекта.
  2. Перейдите на вкладку Order and Export и переместите системную библиотеку JRE после источников.

Это должно исправить.

Сай Килли
источник