Eclipse - java.lang.ClassNotFoundException

Posted

技术标签:

【中文标题】Eclipse - java.lang.ClassNotFoundException【英文标题】: 【发布时间】:2010-11-06 09:09:56 【问题描述】:

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

我的项目结构如下:

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

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

这是我的 JUnit 的运行配置: alt text 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("", ""));
    

【问题讨论】:

我在尝试运行一个不包含 JUnit 的简单 HelloWorld 类时遇到同样的错误......更准确地说:java.lang.NoClassDefFoundError: HelloWorld Caused by: java.lang.ClassNotFoundException: HelloWorld跨度> ClassNotFoundException 在尝试反映类时抛出。当您尝试在普通方法调用中使用该类时,将引发 NoClassDefFoundError。 你能展示你的测试类的代码吗? 你是否开启或关闭了自动构建? 自动构建已开启 【参考方案1】:

对于 Hybris 项目,我通过在构建路径中应用以下更改来解决此问题。我选择了项目并点击了应用并关闭。

【讨论】:

【参考方案2】:

如果这些在 Eclipse 中不起作用,请尝试: Alt + Shift + X,您会在屏幕右下方看到 5 个选项。选择 Java 应用程序,它就会工作

【讨论】:

【参考方案3】:

嗯,你基本上可以通过新建一个项目来解决这个问题。

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

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

【讨论】:

【参考方案4】:

确保您的测试班以前工作过,但您突然面临问题。然后清理您的项目并重新构建它。确保项目已按照上述文章在构建路径中进行配置。

【讨论】:

【参考方案5】:

我建议尝试将此添加到 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。

【讨论】:

【参考方案6】:运行配置类路径选项卡

启用[x]使用临时JAR指定类路径(以避免类路径长度限制)我的诀窍。

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

【讨论】:

【参考方案7】:

我正在使用 gradle 和 eclipse,今天面临同样的挑战,并尝试了多种解决方法,但唯一帮助我的方法是运行命令 gradlew clean

附: => 不要将“构建”与上述命令结合起来。

帮助我,试试你的运气。

【讨论】:

【参考方案8】:

将项目作为 Maven 测试运行,然后作为 JUnit 测试运行。

【讨论】:

【参考方案9】:

我遇到了同样的问题,对我来说问题是不同的。它的出现是因为一些 Maven 依赖项没有下载。

a. I went through properties -> Java Buildpath -> Maven Dependencies and identified the missed libraries. 
b. Removed the missed libraries artifacts from pom.xml
c. Downloaded the libraries and added them explicitly.

【讨论】:

【参考方案10】:

这个问题一般是在运行java应用程序java工具找不到类文件时出现的。

主要是在 maven 项目中,我们看到这个问题是因为 Eclipse-Maven 同步 问题。解决这个问题:Maven->更新配置

【讨论】:

【参考方案11】:

转到构建路径 -> 源并切换到所有源文件夹的“是”选项“忽略可选编译问题”。

【讨论】:

【参考方案12】:

我在运行 junit 测试时看到了 Eclipse - java.lang.ClassNotFoundException。 我删除了一个添加到项目中的外部 jar 文件。从 Eclipse 中删除此 jar 文件对项目的引用后。我可以运行 Junit 测试。

【讨论】:

如果外部 jar 文件对应用程序很重要并且对于应用程序的某些功能是必需的怎么办?我不确定这是一个可行的解决方案。【参考方案13】:

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

【讨论】:

【参考方案14】:

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

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

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

【讨论】:

【参考方案15】:

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

【讨论】:

【参考方案16】:

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

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

这应该可以解决它。

【讨论】:

【参考方案17】:

这意味着您的 pom.xml 有未解决的问题。打开问题视图相应地解决。这样你就可以成功运行测试用例而不会遇到classnotfoundexception。

【讨论】:

【参考方案18】:

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

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

例如,您的 web 项目的 src/main/java 应该在 web 项目下有 target/classes,测试类应该在 web 项目下也有 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 没用。【参考方案19】:

此外,请仔细检查 eclipse“Web 部署程序集”对话框。

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

最近我有一个 eclipse 插件修改了我的一个 web 项目,它添加了 ~mysterious~ 将 maven 测试目录 /src/test/java、/src/test/resources 添加到部署程序集。呜呜呜!!!

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

埃里克

【讨论】:

【参考方案20】:

我遇到了同样的问题。我所做的只是,

我)。生成的 Eclipse 工件

mvn clean eclipse:eclipse

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

【讨论】:

【参考方案21】:

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

【讨论】:

【参考方案22】:

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

【讨论】:

【参考方案23】:

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

【讨论】:

【参考方案24】:

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

【讨论】:

【参考方案25】:

我也遇到了这个问题,并且能够为我的案例提出足够的解决方案。如果您的 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 构建路径中更改了排序,您将看到排序不受影响并且问题将继续发生。

而一个项目->在你做出改变后,清理永远不会伤害任何事情。

【讨论】:

【参考方案26】:

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

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

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

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

【讨论】:

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

试过

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

【讨论】:

【参考方案28】:

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

【讨论】:

【参考方案29】:

Carlos 方法有帮助! Eclipse - java.lang.ClassNotFoundException

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

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

为我工作。

【讨论】:

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

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

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

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

【讨论】:

以上是关于Eclipse - java.lang.ClassNotFoundException的主要内容,如果未能解决你的问题,请参考以下文章

java.lang.Class

Java反射——java.lang.Class 类简介

Struts2:java.lang.NoSuchFieldException: resourceEntries at java.lang.Class.getDeclaredField(Class.j

Java中的java.lang.Class API 详解

深入研究java.lang.Class类

Xamarin Android java.lang.InstantiationException:java.lang.Class 没有零参数构造函数