Eclipse - java.lang.ClassNotFoundException

102
当我试图从Eclipse启动我的JUnit测试时,我遇到了一个“ClassNotFoundException”。从控制台运行“mvn test”时,一切正常。在Eclipse中也没有报告任何问题。
我的项目结构如下:
- 父项目(pom-packaging)
- Web项目(war-packaging-我的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
当我尝试运行一个不包含JUnit的简单HelloWorld类时,我遇到了相同的错误... 更确切地说:java.lang.NoClassDefFoundError: HelloWorld Caused by: java.lang.ClassNotFoundException: HelloWorld - swalkner
当尝试反射一个类时,会抛出ClassNotFoundException异常。当您尝试在普通方法调用中使用该类时,会抛出NoClassDefFoundError异常。 - akf
你能展示一下你的测试类代码吗? - akf
非常感谢Carlos。我的问题已经解决。 Carlos的帖子链接: https://dev59.com/iXNA5IYBdhLWcg3wNa6T#1062435 - user689711
非常感谢Carlos。我的问题已经解决。 Carlos的帖子链接: https://dev59.com/iXNA5IYBdhLWcg3wNa6T#1062435 - user689711
显示剩余3条评论
44个回答

201

我遇到过这种情况好几次,经过多次尝试后找到了解决方案。

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

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

使用这种配置将允许您在Eclipse中执行单元测试。

还有一个建议,如果您的Web项目的测试需要一些存储在资源文件夹下的配置文件,请确保将该文件夹作为源文件夹包含在内,并进行正确的构建路径配置。


1
你好Carlos,非常感谢你的建议。但是很遗憾,它并没有帮助我。我将/src/main/java(target/classes)和/src/test/java(target/test-classes)添加到源文件夹中,以及src/main/resources(applicationContext.xml,一些属性-target/classes)。同样的问题-当我从Eclipse启动我的src/test/java/UserDaoTest.java作为JUnit测试时,我得到了“Class not found UserDaoTest java.lang.ClassNotFoundException: UserDaoTest”的错误消息。至少,这与原始错误消息有点不同... - swalkner
5
你走在正确的道路上,检查一下UserDaoTest类是否已经编译到你文件系统内对应的输出文件夹中了(如你所知,Eclipse会将所有源代码编译后存放到指定的输出文件夹中,其中包括能够运行测试的代码)。如果这个类没有出现在输出文件夹中,那就检查一下该文件夹的构建路径是否设置正确。祝你好运! - Carlos
对我来说,这并没有解决问题。事实证明这是一个AspectJ的问题。如果你正在使用AspectJ,请尝试移除并重新读取AspectJ的功能 - 这对我有用。 - Stefan Haberl
1
有同样的问题。我认为这是一个eclipse项目 - maven - git问题。这并没有真正缩小范围,但清除所有元数据文件夹(.project,.whatever...),删除项目并仅作为maven项目重新导入对我有用。我还发现了一些我不知道eclipse-junit可以做的事情:突出显示测试方法并选择RunAs-Junit只运行特定的测试方法,而不是整个测试!不再到处使用@Ignore和GUI快捷方式! - bgs
遇到了同样的问题,我只是使用了Eclipse -> Project -> clean,然后它就可以工作了。Mvn clean没有起作用。 - Nutan
我遇到了类似的问题,但这个方法并没有解决。如果有人有同样的问题,也许我的解决方法对他们有帮助。最终成功的方法是:项目名称中存在一个不允许的字符(在我这里是一个冒号),把它移除后就可以了。 - ElliotThomas

47

Carlos的方法帮了我大忙!Eclipse - java.lang.ClassNotFoundException

尝试检查JUnit运行配置文件的classpath:

  1. 打开运行配置文件
  2. 点击你要启动的Junit测试
  3. 进入classpath选项卡
  4. 尝试添加一个文件夹(点击用户条目,点击高级,点击添加文件夹,点击确定并搜索你的测试类输出文件夹(可以在项目属性的Java Build Path下找到))

这样对我很有效。


2
这不是很奇怪吗?对我来说它起作用了,但目标类目录是项目的构建类路径的一部分。需要添加特定的类并没有太多意义。 - Jose Muanis
我认为这个操作并不一定会添加所需的目录,而是触发重新加载某些内容。在成功运行后,您可以立即删除新添加的目录,然后它应该像平常一样工作。另外,上面的评论是正确的。可能也要点赞Carlos的评论。 - awied
我发现另一个SO问题的答案对这个问题更有帮助:https://dev59.com/BG025IYBdhLWcg3w7qjL#5718520 - ArtOfWarfare

17

你的构建类路径是正确的,这就是为什么你可以编译。需要检查JUnit的类路径。转到“运行”菜单并选择“打开运行对话框”。在那里,您应该看到左侧带有JUnit选项的树形结构。打开该节点并找到并选择您的测试。右侧窗格中将显示一个类路径选项卡。请查看以确保您尝试实例化的类可以被找到。

编辑:

这似乎是与Maven及其行为有关的问题,因为发布更改了默认的Eclipse输出文件夹。我看到一些解决方案描述如下:

  • 将Maven放入高于JRE的引导类路径中,或者
  • 运行mvn clean test可以解决问题,或者
  • 刷新所有Eclipse项目,导致重新构建解决问题,
  • 进入您的项目并选择 Maven->Update Configuration 解决此问题

在前三种情况下,有报道称此问题会再次发生。最后一种方法对我来说最好,但如果它不起作用,请尝试其他方法。

这里这里有一些信息。


1
不幸的是,“Maven => 更新配置”根本不能解决问题...相反,它会删除构建路径配置...或者这是否意味着其他某些配置有问题? - swalkner
正如@swalkner所指出的那样:Maven => 更新配置将破坏构建路径配置。由于某种我无法理解的原因,插件会设置排除过滤器,我总是需要在运行命令后手动删除它们。 - Stefan Haberl
去“运行”菜单,选择“打开运行对话框”。咦?那在哪里? - Berit Larsen

8

运行配置Classpath 标签页 中启用 [x] 使用临时 JAR 指定类路径(以避免类路径长度限制) 对我很有用。

如果你的项目非常庞大,并且有许多来自其他同级项目和 Maven 依赖项的依赖项,那么你可能会遇到类路径长度限制,这似乎是唯一的解决方案(除了将目录更改为较短的本地 Maven 存储库(我们的已经从 c:/m2 开始)。

输入图像描述


5

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


3

这里有许多复杂的建议。

在使用Maven项目时,经常会遇到拖放文件或更改类名后出现问题的情况。

如果发生这种情况,请通过终端/文件浏览器将问题测试用例(.java)复制到另一个位置(而不是移动),在Eclipse中进行右键单击->删除操作,并选择在磁盘上删除选项,将复制的文件移动/复制回原始文件位置,然后在Eclipse中选择您的项目并按F5刷新资源即可。

这样做快速且简单,并且每次都可以永久解决问题。


我很想问一下,这个解决方案是永久的还是每次都有效...但我明白你的意思,令人惊讶的是,这对我也起作用了。 - Amos M. Carpenter

2

Sachin是正确的: 即使路径正确,问题标签也会显示某些依赖项或资源/项目存在错误,需要修复才能让maven在您创建或更改测试类时自动构建并创建类。

“嗨,

这是非常久远的Jul(哪一年),但我遇到了同样的问题。

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

查看问题标签,检查您的项目是否缺少某些文件。您可以创建一个新项目,逐个添加文件并构建它们,直到停止编译和创建类(检查workspace/proj/bin/package/文件夹中的类)。

很奇怪,但是真的,因为20个java文件中有4个使用了缺失的单个图像,导致没有一个java文件被编译。

CLASSPATH在这里不是问题。”


2
我们遇到了完全相同的异常(使用SpringSource工具、Tomcat,在Win7上), 原因是我们重构了一个文件名(将SubDomain.java重命名为Subdomain.java,大小写不同),但是SpringSource显示的是新的名称Subdomain.java。解决方案是通过SpringSource删除该文件,然后再使用名称Subdomain.java创建并粘贴以前的内容即可。就这么简单。

我一直在运行JUnit测试用例,直到我运行了检查PC兼容性的程序,以便升级Windows。那似乎破坏了某些东西,我无法再次运行JUnit测试用例。(而且所有现有的答案都不起作用) - CoffeDeveloper

2

我在Eclipse中运行JUnit测试时也遇到了NoClassDefFoundError错误。 从命令行运行“mvn clean test”时,我发现几个JAR文件出现以下错误: invalid LOC header (bad signature) 从本地m2存储库中删除这些JAR文件并再次运行“mvn clean test”解决了我的问题。


2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接