Eclipse-java.lang.ClassNotFoundException


95

尝试从Eclipse启动我的JUnit-Test时,出现“ ClassNotFoundException”。从控制台运行“ MVN测试”时,一切正常。另外,Eclipse中没有报告任何问题。

我的项目结构如下:

  • 父项目(pom包装)
    • Web项目(战争包装-我的JUnit测试在这里)
    • Flex项目
    • 配置项目

编辑:如何找不到该类?这是一个简单的HelloWorld-Application,没有特殊的库。

这是我的JUnit的运行配置: 替代文本http://www.walkner.biz/_temp/runco​​nfig.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("", ""));
    }
}

3
尝试运行不包含JUnit的简单HelloWorld类时遇到相同的错误...更确切地:java.lang.NoClassDefFoundError:HelloWorld原因:java.lang.ClassNotFoundException:HelloWorld
swalkner 2009年

尝试反映一个类时,抛出ClassNotFoundException。当您尝试在常规方法调用中使用该类时,将引发NoClassDefFoundError。
akf

您可以显示测试类的代码吗?
2009年

您是否已自动打开或关闭构建?
乔恩

自动建立功能已开启
swalkner

Answers:


194

我已经多次遇到这种情况,经过大量尝试,我找到了解决方案。

检查项目的构建路径,并为每个文件夹启用特定的输出文件夹。遍历项目的每个源文件夹,并设置maven将使用的输出文件夹。

例如,您的Web项目src/main/javatarget/classes在Web项目下,测试类target/test-classes也应在Web项目下,依此类推。

使用此配置将使您能够在Eclipse中执行单元测试。

仅提供一个建议,如果您的Web项目的测试需要资源下的一些配置文件,请确保将该文件夹包括为源文件夹并进行正确的构建路径配置。

希望能帮助到你。


1
嗨,卡洛斯,非常感谢您的建议。不幸的是,但这没有帮助。我将/ src / main / java(目标/类)和/ src / test / java(目标/测试类)以及src / main / resources(applicationContext.xml,一些属性-目标/类)添加到了源文件夹中)。相同的问题-从Eclipse以JUnit-test启动src / test / java / UserDaoTest.java时,出现“找不到类UserDaoTest java.lang.ClassNotFoundException:UserDaoTest”。至少,这与原始错误消息有些不同……
swalkner's Julner

5
正确的方法是,检查UserDaoTest类是否在文件系统中的相应输出文件夹中(您可能知道,Eclipse确实编译了所有源文件并将其放置到指定的输出文件夹中,以便进行能够启动测试)。如果该类未出现在输出文件夹中,请检查此特定文件夹的构建路径的包含/排除过滤器。祝好运。
卡洛斯,2009年

对我来说,这并不能解决问题。原来,这是一个AspectJ问题。如果您使用的是AspectJ,请尝试删除并阅读对我
有用

1
有同样的问题。我认为这是一个蚀项目-Maven-git问题。但这并没有真正缩小范围,而是擦除了所有元数据文件夹(.project,.whatever ...),删除了该项目,仅在maven项目对我有用的情况下才重新导入。我还发现不知道eclipse-junit可以做的事情:突出显示测试方法并选择RunAs-Junit仅运行特定的测试方法,而不是整个测试!没有更多@Ignore的地方和GUI快捷方式!
bgs 2012年

面对同样的问题,我只是使用了Eclipse-> Project-> clean并成功了。MVN清理无效。
Nutan

46

卡洛斯的方法有所帮助! Eclipse-java.lang.ClassNotFoundException

尝试检查junit运行配置的类路径:

  1. 打开您的运行配置
  2. 单击要启动的jUnit-Test
  3. 转到类路径选项卡
  4. 尝试添加文件夹(单击用户条目,单击高级,单击添加文件夹,单击确定,然后在输出文件夹中搜索您的测试类(在projektproperties java构建路径下找到的那些文件夹,源)

为我工作。


2
这不是很奇怪吗?它对我有用,但是目标类目录是该项目的构建类路径的一部分。需要添加特定的类没有多大意义。
何塞·穆阿尼斯

我认为此操作不一定会添加所需的目录,而不会触发要重新加载的内容。成功运行后,您可能会立即删除新添加的目录,并且该目录应该可以正常运行。另外,上面的评论是正确的。可能还想赞扬卡洛斯的参考奖。
凌晨

我发现另一个SO问题的答案对此问题有更大帮助:stackoverflow.com/a/5718520/901641
ArtOfWarfare 2013年

16

您的构建类路径正确,因此可以进行编译。您的JUnit的类路径需要检查。转到“运行”菜单,然后选择“打开运行对话框”。在其中,您应该会在左侧看到一棵树,其中可以选择JUnit。打开该节点并找到并选择测试。在右窗格中,您将看到类路径的选项卡。看一下以确保将找到要实例化测试的类。

编辑:

这似乎是maven的问题,在发行版更改了默认Eclipse输出文件夹后,它的行为。我已经看到解决方案描述了

  • 在jre之上将maven放入bootclasspath中,或者
  • 跑步能mvn clean test达到目的或
  • 刷新您所有的eclipse项目,从而导致重建以解决问题
  • 去您的项目并选择Maven-> Update Configuration解决问题

对于前三个,有重复出现该问题的报告。最后一个对我来说看起来最好,但是如果不起作用,请尝试其他方法。

这里这里是一些信息


1
不幸的是,“ Maven =>更新配置”根本解决不了问题。它删除了构建路径配置...还是意味着其他配置不好?
swalkner's

就像@swalkner指出的那样:Maven =>更新配置将破坏构建路径配置。由于某些原因,我无法理解该插件将设置排除过滤器,我必须在运行命令后手动将其删除
Stefan Haberl 2012年

“转到“运行”菜单,然后选择“打开运行对话框”。嗯?那在哪里?
Berit Larsen

4

问题可能是您的构建文件夹中缺少类文件。一种解决方案是清理项目并重建它。


4

启用[x]Run配置Classpath选项卡使用临时JAR来指定classpath(以避免classpath长度限制)对我来说很成功。

如果您的项目很大,并且您与其他同级项目有很多依赖关系,而您对maven的依赖关系很大,那么您可能会遇到classpath长度限制,这似乎是唯一的解决方案(除了使目录到本地maven repo更短之外(我们已经开始了)在c:/ m2)

在此处输入图片说明


3

这里有许多令人费解的建议。

在通过拖动'n'拖放来移动资源或执行类名的重构之后,我在Maven项目中多次遇到此问题。

如果发生这种情况,只需将问题测试用例(.java)通过终端/文件浏览器复制(而不移动)到right-click -> DeleteEclipse中的另一个位置,并在有选项的情况下选择在磁盘上删除,将复制的文件移动/复制到原始文件位置,然后在Eclipse中选择您的项目,然后按F5刷新资源。

这是快速简便的操作,并且每次都为我永久解决了该问题。


我很想问问这是永久性地还是每次都解决了您的问题……但是我明白了您的意思,而且,令人惊讶的是,这对我来说是成功的窍门。
Amos M. Carpenter

3

我有完全相同的问题,但我发现了!转到您的项目文件,右键单击它,然后单击Refresh或单击F5。然后尝试运行它。如果仍然无法正常工作,那就算了吧,因为我遇到了完全相同的问题,这只意味着您的Eclipse版本是垃圾。



2

萨钦(Sachin)的权利:即使使用正确的类路径,“问题”选项卡仍将显示某些依赖项或资源/项目中的错误需要修复,以便在创建或更改测试类时maven自动构建和创建类。 。

“嗨,

它很老的Jul(那年),但是我有同样的问题。

实际问题发现eclipse无法为java文件生成类文件,classpath是正确的。

查看问题选项卡,并检查您的项目是否缺少某些内容/文件。您可以创建一个新的proj并逐个添加文件并进行构建,直到停止编译和创建类为止(检查类的工作区/ proj / bin / package /文件夹)

它奇怪但真实的ecplise未能通过编译,因为20个Java文件中有4个正在使用单个丢失的图像。结果没有一个Java文件被编译。

CLASSPATH在这里不是问题。”


2

我们有一个确切的例外(在Win7上使用SpringSource Tools,tomcat),原因是我们已经将文件名(重命名为文件)从SubDomain.java重构为Subdomain.java(D与d),尽管SpringSource被显示新名称Subdomain.java。解决方案是删除该文件(通过SpringSource),然后以Subdomain.java为名再次创建该文件,然后复制粘贴其先前的内容。就那么简单。


我一直运行junit测试用例,直到运行升级Windows之前检查PC兼容性的程序。看来是要破坏某些东西,我无法再次运行JUnit测试用例。(并且所有现有答案均无效)
CoffeDeveloper 2015年

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通过按Delete或单击红色的X,从中删除条目。

缓存的运行配置必须搞砸了。


1
在浪费了太多时间之后,我最终完成了上述步骤。然后,我做出了一个英勇的决定,即删除所有运行测试配置,现在即使在新的运行配置中清楚地显示了项目(在其下具有Maven依赖项)的情况下,在类路径中也找不到我的测试。我一直忘记日食有多脆弱。之后,无法使用Eclipse运行任何测试(在我可以选择特定测试之前-可以)。最后,我尝试了下面的KomodoDave建议。这样就解决了问题……使您不得不跳过这个思想(一系列的最新内容。)的循环
贾斯汀

1

从eclipse中删除项目(不是从硬盘中删除),这在某种程度上是清理工作区并将项目重新导入到eclipse中,这再次对我有用。


1

通常,在运行Java应用程序java工具无法找到类文件时会发生此问题。

通常在maven项目中,我们会看到此问题,因为Eclipse-Maven同步问题。解决此问题:Maven->更新配置


0

您是否尝试过右键单击项目根目录,选择“属性”,并确保CLASSPATH是正确的?如果我没记错的话,这就是您的做法。

关于Eclipse运行单元测试的方式,是否需要以特殊方式将junit JAR添加到运行时CLASSPATH中?

我使用IntelliJ,因此没有这些问题。

我自己检查Eclipse,但我更喜欢不在桌面上使用它。


好的,无需引起Eclipse与IntelliJ的讨论;我想在Eclipse中运行它...我检查了Java Build Path-Java JDK在那儿,并且我的HelloWorld示例不需要任何其他东西...我认为这与“构建路径上的源文件夹” ...我将它们设置为程序包开始的文件夹...我认为这是正确的。
swalkner

除了JDK之外,您还需要其他东西-这就是HelloWorld.class的路径,对吗?“构建路径上的源文件夹”-听起来更好。无需假设,可以做个实验家来尝试。Eclipse会告诉您是否正确。
duffymo,2009年

0

嗯,看起来有些奇怪,请尝试在类顶部使用以下注释来运行它:

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

让我知道你如何处理它。

检查您是否也自动启用了构建。如果要确保正确编译测试类,请清除Maven目标文件夹(以及Eclipse可能正在使用的任何bin文件夹)。您是否也在使用m2eclipse,因为我发现它有点问题。


非常感谢您的回答,但是:它也不起作用;首先,我必须包含spring-test.jar,然后另一个依赖关系未完全满足。我不明白为什么它不能在同一包中与简单的helloworld类一起使用。在那儿,我不需要像您建议的那样的“ hack” ...“ classpath”或类似的东西肯定有问题,但是我不知道要在哪里/检查什么...
swalkner 09年

0

解决我的问题的方法是相似的:库无效。如果查看项目的.classpath文件,将看到带有键/值kind =“ lib”的classpathentry标签。我的一些是不正确的。

在关闭验证设置之前,我没有发现这一点。也就是说,JSP文件中存在如此多的错误等,以致于类路径错误不明显(甚至可能出现)。结果,没有任何内容被编译到目标输出文件夹中,但是没有有用的错误提示。


0

请从Windows>首选项> Java>已安装的JRE指向正确的JDK。

不要指向jre,不要指向正确的JDK。我指向了JDK 1.6U29,并刷新了该项目。

此后,问题消失了,并且jUnit Tests正常运行。

谢谢,-
塔帕斯


0

最近,我在Eclipse中遇到了相同的错误,即,无论如何更改配置,Eclipse IDE都找不到Unit测试类。从这里和其他网站的先前文章中学习,我已经对类路径和源信息进行了双重检查和三重检查,并在“运行配置”和“ Java构建路径”中上下移动了源文件夹和库。 ”配置窗口,并且我还清理了Project并对其进行了重建,但是这些技巧都不适合我。特定的Java项目是一个旧的ANT编译项目,并且Eclipse库中包含许多jar。

然后,我更改了单元测试类以添加一个main()方法,然后右键单击它以将Java Application代替JUnit测试“运行为”,突然之间,Eclipse似乎醒来并正确识别了该类。之后,我将其切换回单元测试应用程序,并且仍在工作。

这似乎是Eclipse中的错误,我猜大量的库(> 260)可能会混淆JVM定位我的JUnit类的能力。


0

我也遇到了这个问题,并且能够为我的案子提供足够的解决方案。如果您的Eclipse项目的项目根目录中有一个.classpath文件(请在Navigator视图而不是Package Explorer视图中查看),请确保Maven类路径出现在JRE Con​​tainer类路径之前。

<?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 Build Path来切换Order和Export。如果您的项目具有.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

Eclipse内部的JUnit测试也给了我NoClassDefFoundError。从命令行运行“ mvn clean test”会在几个jar上给我以下错误:无效的LOC标头(错误的签名)从本地m2存储库中删除这些jar并运行“ mvn clean test”再次解决了我的问题。


0

我有同样的问题。我所做的就是

一世)。生成的Eclipse工件

mvn clean eclipse:eclipse

ii)。刷新项目并重新运行junit测试。应该工作正常。


0

此外,请双击蚀“ Web Deployment Assembly”对话框。

可以找到:项目属性->部署程序集。

最近,我有一个eclipse插件修改了我的一个Web项目,它神秘地添加了〜将Maven测试目录/ src / test / java,/ src / test / resources添加到了Deployment Assembly。哎呀!

这就是为什么当我仅将maven直接构建并部署到tomcat,没有ClassNotFoundExceptions时,我的项目运行良好的原因,但是,当我通过Eclipse进行部署时,Whammo!我开始获取ClassNotFoundExceptions,因为正在部署TestCode。

埃里克


0

这意味着您的pom.xml存在未解决的问题。打开问题视图即可相应解决。然后,您将能够成功运行测试用例,而不会遇到classnotfoundexception。


0

更改Java构建路径中类路径工件的顺序可以为我解决。

  1. 右键单击项目,然后转到“项目构建”路径。
  2. 转到“订购和导出”选项卡,然后将JRE系统库移至源代码之后。

这应该解决它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.