ChatGPT解决这个技术问题 Extra ChatGPT

Eclipse - java.lang.ClassNotFoundException

当试图从 Eclipse 中启动我的 JUnit-Test 时,我得到一个“ClassNotFoundException”。从控制台运行“mvn test”时 - 一切正常。此外,Eclipse 中没有报告任何问题。

我的项目结构如下:

父项目(pom-packaging) Web 项目(war-packaging - 我的 JUnit-test 在这里) Flex 项目 配置项目

Web 项目(war-packaging - 我的 JUnit-test 在这里)

弹性项目

配置项目

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

这是我的 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("", ""));
    }
}
尝试运行不包含 JUnit 的简单 HelloWorld 类时出现相同的错误...更确切地说:java.lang.NoClassDefFoundError: HelloWorld Caused by: java.lang.ClassNotFoundException: HelloWorld
尝试反映类时会引发 ClassNotFoundException。当您尝试在普通方法调用中使用该类时,将引发 NoClassDefFoundError。
你能展示你的测试类的代码吗?
您是否自动打开或关闭构建?
自动构建已打开

A
AdrieanKhisbe

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

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

例如,您的网络项目的 src/main/java 应该在网络项目下有 target/classes,测试类应该在网络项目下也有 target/test-classes 等等。

使用此配置将允许您在 eclipse 中执行单元测试。

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

希望能帮助到你。


嗨,卡洛斯,非常感谢您的建议。但不幸的是,它没有帮助。我将 /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-test 时,我得到“Class not found UserDaoTest java.lang.ClassNotFoundException: UserDaoTest”。至少,这与原始错误消息有点不同......
你是在正确的方式,检查 UserDaoTest 类是否在你的文件系统中的相应输出文件夹中(你可能知道,Eclipse 确实编译你的所有源文件并将其放入指定的输出文件夹等,以能够启动测试)。如果该类未出现在输出文件夹中,请检查此特定文件夹的构建路径的包含/排除过滤器。祝你好运。
对我来说,这并没有解决问题。原来这是一个 AspectJ 问题。如果您正在使用 AspectJ,请尝试删除并阅读 AspectJ 功能 - 为我工作
有同样的问题。我认为这是一个 Eclipse 项目 - maven - git 问题。这并没有真正缩小范围,而是擦除所有元数据文件夹(.project,.whatever ...),删除项目并仅作为 maven 项目重新导入对我有用。我还发现了一些不知道 eclipse-junit 可以做的事情:突出显示测试方法并选择 RunAs-Junit 只运行特定的测试方法,而不是整个测试!不再有到处都是 @Ignore 和 gui 快捷方式!
面临同样的问题,我只是使用 Eclipse -> Project -> clean 并且它有效。 mvn clean 没有用。
C
Community

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

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

打开你的运行配置 点击你想开始的 jUnit-Test 进入类路径选项卡 尝试添加一个文件夹(点击用户条目,点击高级,点击添加文件夹,点击确定并在输出文件夹中搜索你的测试类(你在 projektproperties java build path, source 下找到的那些))

为我工作。


这不是很奇怪吗?它对我有用,但目标类目录是项目构建类路径的一部分。您需要添加特定的类没有多大意义。
我认为此操作不一定会添加所需的目录,而是触发重新加载的内容。成功运行后,您可能会立即删除新添加的目录,它应该可以正常工作。另外,上面的评论是对的。可能还想对 Carlos 引用的推荐进行投票。
我发现另一个 SO 问题的答案对这个问题更有帮助:stackoverflow.com/a/5718520/901641
a
akf

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

编辑:

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

将 maven 放入 jre 工作之上的 bootclasspath 中,或者

运行 mvn clean test 可以解决问题或

刷新所有 Eclipse 项目,导致重建修复了问题

转到您的项目并选择 Maven->Update Configuration 解决问题

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

herehere 是一些信息


不幸的是,“Maven => 更新配置”根本没有解决问题……反之亦然;它删除了构建路径配置...或者这是否意味着其他一些配置不好?
正如@swalkner 指出的那样:Maven => 更新配置将破坏构建路径配置。由于某些原因让我无法理解,插件将设置排除过滤器,我在运行命令后总是必须手动删除这些过滤器
“转到“运行”菜单并选择“打开运行对话框”。哈??那在哪里?
u
user3018906

启用 [x] 使用临时 JAR 来指定类路径(以避免类路径长度限制)在运行配置的类路径选项卡中对我有用。

如果您的项目很大,并且您有很多来自其他兄弟项目和 maven 依赖项的依赖项,您可能会遇到类路径长度限制,这似乎是唯一的解决方案(除了缩短本地 maven repo 的目录(我们的已经开始在 c:/m2)

https://i.stack.imgur.com/tVFx9.png


E
EvilFish

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


K
KomodoDave

这里有很多复杂的建议。

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

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

这既快速又容易,每次都为我永久解决了这个问题。


我很想问它是永久解决您的问题,还是每次都解决...但是我明白您的意思,而且,令人惊讶的是,这对我有用。
佚名

这是我解决问题的方法。当然,很多事情都可能导致它发生。对我来说,是 Maven2(不是 Eclipse 的插件)将 eclipse 配置文件设置为使用不同的构建器(aspectJ),但我在 eclipse 中没有插件。/

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

干杯拉蒙巴克兰


k
kisna

Sachin 的权利:即使类路径正确,问题选项卡也会显示某些依赖项或资源/项目有错误需要修复,以便 maven 在您创建或更改测试类时自动构建和创建类.

“你好,

它非常古老的 7 月(哪一年),但我遇到了同样的问题。

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

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

它奇怪但真实,ecplise 在编译中失败,因为 20 个 java 文件中有 4 个正在使用丢失的单个图像。结果没有编译任何java文件。

CLASSPATH 在这里不是问题。”


R
Romie

我们遇到了确切的例外(在 Win7 上使用 SpringSource 工具、tomcat),原因是我们将文件名(重命名为文件)从 SubDomain.java 重构为 Subdomain.java(D 与 d),尽管 SpringSource 以某种方式发生了冲突显示新名称 Subdomain.java。解决方案是删除文件(通过 SpringSource)并在名称 Subdomain.java 下再次创建它并复制粘贴其以前的内容。就那么简单。


我总是运行 junit 测试用例,直到在升级 windows 之前运行检查 PC 兼容性的程序。这似乎破坏了一些东西,我无法再次运行 JUnit 测试用例。 (并且所有现有的答案都不起作用)
j
jonsca

我有完全相同的问题,但我想通了!转到您的项目文件并右键单击它,然后单击 Refresh 或按 F5。然后尝试运行它。如果它仍然不起作用,那么就忘记它,因为我遇到了完全相同的问题,这只是意味着你的 Eclipse 版本是垃圾。


R
RutgerDOW

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


N
Nick

点击 project->properties->Java build path->Source 并检查每个 src 文件夹是否仍然有效存在或最近被删除。更正任何丢失的路径或不正确的路径并重建并运行测试。它将解决问题。


S
Siddharth

我所做的只是属性-> Java 构建路径-> 订单和导出-> 启用所有未选中的框-> 一直向上移动 Junit


u
user2246725

试过了

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 生命周期 >> 测试


G
Gray

我已经尝试了此页面上的所有解决方案:刷新项目、重建、清理所有项目、重新启动 Eclipse、重新导入(甚至)项目、重建 maven 并刷新。没有任何效果。起作用的是将课程复制到一个运行良好的新名称 - 奇怪但真实。

在忍受了一段时间后,我只是通过以下方式修复了它:

通过 Run 菜单 Select Run Configurations 选择与您的单元测试关联的运行配置。通过按删除或单击红色 X 从运行配置中删除条目。

缓存的运行配置一定是搞砸了。


在浪费了太多时间之后,我最终完成了上述步骤。然后我做出了一个英勇的决定,删除了所有运行测试配置,现在在类路径中找不到我的任何测试,即使新的运行配置清楚地显示了其中的项目(下面有 maven 依赖项)。我一直忘记日食是多么脆弱。之后,无法使用 Eclipse 运行任何测试(在我可以选择特定测试之前 - 好的)。最后,我尝试了下面的 KomodoDave 建议。那个固定的东西......令人惊讶的是你必须通过这个 ide 跳过循环(最新的一个系列......)
V
Vikram

我有同样的问题。我所做的只是,

一世)。生成的 Eclipse 工件

mvn clean eclipse:eclipse

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


S
Sahitya M

在运行 Web 应用程序时,我们大多数人都会得到这个异常。当您收到此错误时,您已将 .class 文件放在正确的文件夹中。

在 Web 应用程序中,所有 .class 文件都应位于 WEB-INF\Classes 文件夹中。如果您在 Eclipse 中运行 Web 应用程序,请按照以下步骤操作

第 1 步:右键单击项目文件夹并选择属性 第 2 步:单击“Java 构建路径”,您将看到不同的选项卡,如“源”、“项目”、“库”等 第 3 步:选择源文件夹。在此您将看到您的项目详细信息 第 4 步:在“源”文件夹中,您将看到默认输出文件夹选项。在这里,您必须在 WEB-INF 下提供 classes 文件夹。只需给出 projectname/WebContent/WEB-INF/classes 之类的路径,结构取决于您的应用程序,请记住这里您无需创建“classes”文件夹。 Eclipse 将为您创建它。第 5 步:单击“确定”并进行项目清理和构建。这就是你的应用程序现在将运行。


w
wanfke

我解决了 Bulit path--->libraries--->add library--->Junit check junit4


P
Premraj

通常在运行 java 应用程序 java 工具找不到类文件时会出现此问题。

大多数情况下,在 Maven 项目中,我们看到这个问题是因为 Eclipse-Maven 同步问题。解决这个问题:Maven->更新配置


A
Adligo

我建议尝试将其添加到 VM 参数中;

-verbose:class -verbose:module -Xdiag

然后你可以从 Eclipse 调试它,它应该打印出一些消息:

java.lang.ClassNotFoundException: org.adligo.somewhere.Foo
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    at java.base/java.lang.Class.forName0(Native Method)
    at java.base/java.lang.Class.forName(Class.java:398)
    at java.base/sun.launcher.LauncherHelper.loadMainClass(LauncherHelper.java:760)
    at java.base/sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:655)

由此您可以在 LancherHelper.java 760 上设置断点来调试 Eclipse Lanucher 本身。就我而言,我注意到用户类路径似乎为空,即使我在 Lanuch 配置中有很多 jars。


S
SATHIYA BALAKRISHNAN

确保您的测试班以前工作过,但您突然面临问题。然后清理您的项目并再次构建它。确保项目已在构建路径中配置,如上文所述。


H
HoRn

好吧,您基本上可以通过创建一个新项目来解决这个问题。

关闭项目(将代码保存在计算机上的另一个文件夹中)。创建一个新项目(添加一个新的最终目录,不要选择默认目录)。重新制作之前的项目,添加之前保存的代码。

发生这种情况可能是因为您创建了一个项目并且没有选择目录/文件夹或类似的东西。我希望对你有所帮助!


T
Tapas Adhikary

请从 Windows > Preferences > Java > Installed JRE 指向正确的 JDK。

不要指向jre,指向一个合适的JDK。我指向 JDK 1.6U29 并刷新了项目。

此后,问题消失了,jUnit 测试工作正常。

谢谢,-小吃


H
HZhang

我最近在 Eclipse 中遇到了同样的错误,即无论我如何更改配置,Eclipse IDE 都找不到单元测试类。从这里和其他网站上的以前的帖子中学习,我已经仔细检查了类路径和源信息,并在“运行配置”和“Java 构建路径”中上下移动了源文件夹和库" 配置窗口,我还清理了项目并重建了它,但这些技巧对我都不起作用。特定的 Java 项目是一个旧的 ANT 编译项目,并且在 Eclipse 库中包含很多 jar。

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

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


B
Betlista

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

<?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 构建路径中更改了排序,您将看到排序不受影响并且问题将继续发生。

在你做出改变之后,一个 project->clean 永远不会伤害事情。


B
Betlista

确保您的测试启动配置不包含以下行,或者尝试启用自动 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"/>

S
Satpal

我尝试了我在这篇长文中读到的所有内容,令人难以置信的是,对我有用的是,而不是单击测试类并选择 Run as JUnit test,单击测试方法并以 JUnit test 身份运行.我不知道为什么?


H
Hari Hara Earlapati

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


S
Sai Killi

更改 Java 构建路径中的类路径工件的顺序为我解决了这个问题。

右键单击项目并转到项目构建路径。转到 Order and Export 选项卡并将 JRE 系统库移动到源之后。

这应该解决它。


M
Mahendra Rathod

JMockit/JUnit 集成不支持 JUnit 4.4。仅支持 4.5 或更高版本。