Затемнення - java.lang.ClassNotFoundException


95

При спробі запустити JUnit-Test з Eclipse, я отримую "ClassNotFoundException". При запуску "mvn-тесту" з консолі - все працює нормально. Крім того, у Eclipse не повідомляється про будь-які проблеми.

Моя структура проекту така:

  • батьківський проект (pom-упаковка)
    • Веб-проект (військова упаковка - мій JUnit-тест тут)
    • Проект Flex
    • Конфігураційний проект

редагувати: Як можна не знайти клас? Це простий додаток HelloWorld без спеціальних бібліотек.

Ось конфігурація запуску мого JUnit: alt text http://www.walkner.biz/_temp/runconfig.png


Тестовий клас (але, як я вже сказав; він не працює і з простим 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("", ""));
    }
}

3
Я отримую ту ж помилку при спробі запустити простий клас HelloWorld без включеного JUnit ... Точніше: java.lang.NoClassDefFoundError: HelloWorld Викликано: java.lang.ClassNotFoundException: HelloWorld
swalkner

ClassNotFoundException викидається при спробі розміркувати над класом. NoClassDefFoundError видається, коли ви намагаєтесь використовувати клас у звичайному виклику методу.
akf

Ви можете показати код свого тестового класу?
akf

у вас автоматично вмикається або вимикається збірка?
Джон

автоматична збірка ввімкнена
swalkner

Відповіді:


194

Я кілька разів стикався з такою ситуацією, і після багатьох спроб знайшов рішення.

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

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

Використання цієї конфігурації дозволить вам виконувати модульні тести в затемненні.

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

Сподіваюся, це допомагає.


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

5
Ви на правильному шляху, перевірте, чи є клас UserDaoTest у відповідній папці виводу у вашій файловій системі (як ви вже знаєте, Eclipse збирає всі ваші вихідні файли та поміщає їх у вказану папку виводу, серед інших можливість запускати тести). Якщо клас не відображається у вихідній папці, перевірте фільтри включення / виключення шляху збірки для цієї конкретної папки. Удачі.
Карлос 02

Для мене це не вирішило проблему. Виявилося, що це питання AspectJ. Якщо ви використовуєте AspectJ, спробуйте видалити та прочитати можливості AspectJ - працював для мене
Stefan Haberl

1
Був той самий випуск. Я думаю, що це проект затемнення - maven - git. Це насправді не звужує, але стирає всі папки метаданих (.project, .whatever ...), видаляє проект і повторно імпортує лише як проект maven, який працював у мене. Я також виявив щось невідоме, що eclipse-junit міг зробити: виділення методу тестування та вибір RunAs-Junit запускає лише той конкретний метод тестування, а не весь тест! Більше немає @Ignoreповсюди та швидких комбінацій клавіш!
bgs

Зіткнувшись з тією ж проблемою, я просто використовував Eclipse -> Project -> clean, і це спрацювало. Mvn чистий не спрацював.
Нутан,

46

Підхід Карлоса допоміг! Затемнення - java.lang.ClassNotFoundException

Спробуйте перевірити шлях до класу конфігурації запуску junit:

  1. Відкрийте конфігурації запуску
  2. Клацніть на jUnit-Test, який ви хочете розпочати
  3. перейдіть на вкладку шлях до класу
  4. Спробуйте додати папку (клацніть на записи користувача, клацніть на розширені, клацніть на додавання папок, клацніть на ok і знайдіть у папці виводу свої тестові класи (ті, які ви знайдете під projektproperties java build path, джерело))

працює для мене.


2
Це не дуже дивно? Це спрацювало для мене, але директорія цільових класів є частиною шляху побудови класів для проекту. Не має сенсу, що вам потрібно додати певний клас.
Хосе Муаніс,

Я не думаю, що ця дія обов’язково додає необхідний каталог настільки, наскільки запускає щось для перезавантаження. Швидше за все, ви можете негайно видалити щойно доданий каталог після успішного запуску, і він повинен працювати як зазвичай. Крім того, коментар вище є правильним. Можливо, захочеться також проголосувати рекомендацію від Карлоса.
бою

Я знайшов відповідь на інше питання SO , щоб бути більш корисним з цією проблемою: stackoverflow.com/a/5718520/901641
ArtOfWarfare

16

ваш шлях до класу побудови правильний, саме тому ви можете скомпілювати. шлях до вашого JUnit потрібно перевірити. перейдіть до меню "Виконати" та виберіть "відкрити діалогове вікно запуску". там ви повинні побачити дерево ліворуч із опцією JUnit. відкрийте цей вузол і знайдіть і виберіть свій тест. на правій панелі ви побачите вкладку для шляху до класу. подивіться, щоб переконатися, що ваш клас, який тест намагається створити, буде знайдений.

редагувати:

здається, це проблема з maven і його поведінка після випуску змінила стандартні вихідні папки Eclipse. я бачив рішення, описані де

  • розміщення maven у завантажувальному шляху над НАШИМ jre працює, або
  • біг mvn clean testробить трюк або
  • оновлення всіх ваших проектів затемнення, спричинення відновлення, вирішує проблему
  • перейти до свого проекту та вибрати Maven-> Update Configuration вирішити проблему

з першими трьома повідомлення про те, що проблема повторювалася. останній мені здається найкращим, але якщо він не працює, будь ласка, спробуйте інші.

ось і ось трохи інформації


1
на жаль, "Maven => Конфігурація оновлення" не вирішує проблему взагалі ... зворотне вірно; він видаляє конфігурації шляху збірки ... Або це означає, що якась інша конфігурація погана?
swalkner

Саме так, як зазначив @swalkner: Maven => Конфігурація оновлення зіпсує конфігурацію шляху збірки. З якоїсь причини, яка ухиляється від мене, плагін встановить фільтри виключення, які мені завжди доводиться видаляти вручну після запуску команди
Stefan Haberl,

"перейдіть до меню" Виконати "та виберіть" відкрити діалогове вікно запуску ". Де це?
Беріт Ларсен

4

Проблема може бути відсутнім файлом класу у вашій папці збірки. Одне з рішень - очистити проект і відновити його.


4

Увімкнення [x] Використовуйте тимчасовий JAR, щоб вказати шлях до класу (щоб уникнути обмежень довжини шляху до класу ) на вкладці « Шлях до класу » конфігурації « Запуск» зробив для мене фокус.

Якщо ваш проект величезний, і у вас багато залежностей від інших братських проектів та залежностей maven, ви можете досягти обмежень довжини класу, і це, здається, є єдиним рішенням (крім того, щоб зробити каталог для вашого локального репозиторію maven коротшим (наш уже починається) при c: / м2)

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


3

Тут є багато заплутаних пропозицій.

Я неодноразово стикався з цією проблемою у проектах Maven після переміщення ресурсів шляхом перетягування або виконання рефакторингу імен класів.

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

Зробити це швидко і легко, і кожен раз назавжди вирішувало проблему.


У мене є спокуса запитати, чи вирішено проблему назавжди чи щоразу ... але я розумію, що ви маєте на увазі, і, що дивно, це зробило для мене фокус.
Амос М. Карпентер,

3

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


2

Це було моє рішення проблеми. Звичайно, багато речей можуть спричинити це. Для мене це було тим, що Maven2 (не плагін для Eclipse) встановлював профіль eclipse для використання іншого конструктора (аспектJ), але у мене не було плагіна в eclipse. /

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

Вітаємо Рамона Бакленда


2

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

"Привіт,

Це дуже старий липень (який рік), але у мене була та сама проблема.

Фактична проблема виявила, що eclipse не зміг створити файл класу для файлу Java, шлях до класу був належним.

Перегляньте вкладку проблеми та перевірте, чи не бракує у вашому проекті чогось / файлу. ви можете створити новий proj і додавати файли по одному і будувати їх, поки він не припинить компіляцію та створення класів (перевірте робочу область / proj / bin / package / folder для класів)

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

CLASSPATH тут не є проблемою ".


2

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


Я завжди запускав тести junit, поки не запускав програму, яка перевіряє сумісність ПК перед оновленням Windows. Здається, це щось зламало, я не можу знову запускати тестові кейси JUnit. (і всі існуючі відповіді не працюють)
CoffeDeveloper

2

Я вирішую цей шлях Bulit ---> бібліотеки ---> додаю бібліотеку ---> Junit перевірка junit4


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 >> тест


1

Я спробував усі рішення на цій сторінці: оновити проект, відновити, очистити всі проекти, перезапустити Eclipse, повторно імпортувати (навіть) проекти, відновити maven та оновити. Нічого не працювало. Що вдалося, це копіювання класу на нову назву яка працює чудово - химерно, але правдиво.

Потерпивши це деякий час, я просто виправив це:

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

Щось повинно бути зіпсовано з кешованою конфігурацією запуску.


1
Через занадто багато втраченого часу я закінчив робити вищевказані кроки. Потім я прийняв героїчне рішення видалити всі конфігурації запуску тесту, і тепер жоден з моїх тестів не може бути знайдений у шляху до класу, хоча нова конфігурація запуску чітко відображає проект у ньому (із залежностями maven внизу). Я постійно забуваю, наскільки крихким є затемнення. Після цього не можна було проводити тести з eclipse (до того, як я міг вибрати певний тест - добре). Нарешті, я спробував пропозицію KomodoDave нижче. Це виправило речі ... дивовижні петлі, через які вам доведеться перестрибнути з цією ідеєю (остання з серії ..)
justin

1

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


1

Зазвичай ця проблема виникає під час запуску програми Java java, яка не може знайти файл класу.

В основному в проекті maven ми бачимо цю проблему, оскільки проблема синхронізації Eclipse-Maven . Щоб вирішити цю проблему: Maven-> Оновити конфігурацію


0

Ви пробували клацнути правою кнопкою миші на корені проекту, вибравши "властивості" та переконавшись, що CLASSPATH правильний? Якщо я правильно пам’ятаю, ви так це робите.

Щось про те, як Eclipse запускає модульні тести, що вимагає від вас особливого додавання junit JAR до середовища виконання CLASSPATH?

Я використовую IntelliJ, тому цих проблем у мене немає.

Я б перевірив Eclipse сам, але вважаю за краще не мати його на робочому столі.


добре, не ведучи до дискусії Eclipse проти IntelliJ; Я хотів би, щоб він працював у Eclipse ... і я перевірив шлях побудови Java - там є 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 працюють нормально.

Дякую,
-Тапас


0

Нещодавно я зіткнувся з такою ж помилкою в Eclipse, тобто Eclipse IDE не зміг знайти клас Unit test, як би я не змінював конфігурації. Навчаючись з попередніх публікацій тут та на інших веб-сайтах, я двічі перевіряв та потрою перевіряв шлях до класу та інформацію про джерело, а також переміщувався вгору та вниз у вихідній папці та бібліотеках як у "Запустити конфігурацію", так і в "Java Build Path". "config windows, і я також очистив проект і відновив його, але жодна з цих хитрощів не працює для мене. Конкретний проект Java - це старий проект, скомпільований ANT, який містить безліч банок, включених до бібліотеки Eclipse.

Потім я змінив клас модульного тесту, щоб додати метод main (), і клацніть правою кнопкою миші, щоб "Запустити як" Java-програму замість JUnit-тесту, і раптом Eclipse, здається, прокинувся і правильно визначив клас. Згодом я повернув його назад на програму Unit test, і вона все ще працює.

Здається, це помилка в Eclipse, я припускаю, що велика кількість бібліотек (> 260) може переплутати здатність JVM знаходити мій клас JUnit.


0

Мене також вразило це питання, і я зміг знайти достатнє рішення для своєї справи. Якщо у вашому проекті Eclipse є файл .classpath у корені вашого проекту (перегляньте його у поданні Навігатора замість подання Провідника пакетів), переконайтесь, що ваш 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 Build Path, ви побачите, що порядок не впливає, і проблема буде продовжувати виникати.

І проект-> чистота ніколи не зашкодить речам після внесення змін.


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"/>

0

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


0

Тест JUnit із внутрішнього затемнення дав мені також NoClassDefFoundError. Запуск 'mvn clean test' з командного рядка дав мені наступну помилку в декількох банках: недійсний заголовок LOC (погана підпис) Видалення цих банок з локального сховища m2 та запуск 'mvn clean test' знову вирішило мою проблему.


0

У мене була така ж проблема. Все, що я зробив, було,

і). Створені артефакти Eclipse

mvn clean eclipse:eclipse

іі). Оновіть проект і повторіть свій тест юніта. Повинна працювати нормально.


0

Крім того, ДВОЙТИ ПЕРЕВІРІТЬ діалогове вікно eclipse "Web Deployment Assembly".

Це можна знайти: Властивості проекту -> Асамблея розгортання.

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

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

Ерік


0

Це означає, що у вашому pom.xml є невирішені проблеми. Відповідно відкрийте подання проблем. Тоді ви зможете успішно запускати тестові кейси, не стикаючись з classnotfoundexception.


0

Зміна порядку артефактів шлях до класу у Шляху побудови Java вирішила це для мене.

  1. Клацніть правою кнопкою миші на проекті та перейдіть до шляху побудови проекту.
  2. Перейдіть на вкладку Замовлення та експорт та перемістіть системну бібліотеку JRE до джерел.

Це повинно це виправити.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.