类未找到异常:org.eclipse.xtext.junit_2.4.3.v201309030823无法找到junit.framework.TestCase。

16
我对这个错误感到困惑:

java.lang.NoClassDefFoundError: junit/framework/TestCase
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:792)
    at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.defineClass(DefaultClassLoader.java:188)
    at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.defineClassHoldingLock(ClasspathManager.java:638)
...
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.loadClass(RemoteTestRunner.java:693)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.loadClasses(RemoteTestRunner.java:429)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:452)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.pde.internal.junit.runtime.RemotePluginTestRunner.main(RemotePluginTestRunner.java:62)
    at org.eclipse.pde.internal.junit.runtime.CoreTestApplication.run(CoreTestApplication.java:23)
...
Caused by: java.lang.ClassNotFoundException: junit.framework.TestCase cannot be found by org.eclipse.xtext.junit_2.4.3.v201309030823
    at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:501)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:421)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:412)
    at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 78 more
当我运行我的 Xtext DSL 的插件测试时(即在内部启动新的 Eclipse 平台时),我遇到了异常。这发生在我的任何代码被执行之前。
当我查看插件依赖关系时,我可以看到 org.junit_4.11.0.v201303080030.jar 在类路径上,而且我还看到 /.../workspace/.metadata/.plugins/org.eclipse.pde.core/.external_libraries/org.junit_4.11.0.v201303080030/junit.jar 因此,OSGi 肯定能够解析此依赖项。
Xtext 2.4.3 是否与 JUnit 4.11 兼容,或者我必须将我的 Eclipse 安装降级到 JUnit 4.10?

这是什么时候发生的?你现在使用的是开普勒吗? - Eugene
我已经下载了 Eclipse Kelper JEE SR1 (4.3.1)。我的目标平台是使用 Xtext 2.4.3 存档更新站点和 MWE2 2.4.1 构建的。 - Aaron Digulla
4个回答

8

两点

第一点

检查你的项目属性 -> Java Build Path -> Libraries(选项卡)。JUnit 应该在其中,尽管这通常会在构建中显示出来。

检查你的项目的运行配置 -> JUnit -> Classpath(选项卡)。JUnit 应该在你的项目的用户条目下。

第二点

检查你是否拥有以下插件

org.eclipse.xtext.xbase.junit
org.junit (3.8.2)
org.junit (4.8.2)

[编辑] 这让我走上了正确的轨道。要修复错误,请确保在目标平台中安装了 org.junit 3.8!

解释:上述错误意味着Eclipse本身无法启动。似乎JUnit运行器依赖于JUnit 3.8,如果没有它,整个平台将无法初始化。

可以通过查看堆栈跟踪来确定您是否有相同的问题:它是否包含 RemotePluginTestRunner.main

要修复此错误,请将org.junit 3.8捆绑包添加到您的目标平台。


我正在使用JUnit 4。库选项卡列出了两个JUnit JAR文件。一个是来自我的目标平台的org.junit_4.11.0.*.jar,另一个是workspace/.metadata/.plugins/org.eclipse.pde.core/.external_libraries/org.junit_4.11.0.v201303080030/junit.jar。我认为后者是由JUnit插件测试启动器添加的。 - Aaron Digulla
插件测试在“运行配置”中没有类路径选项卡。但我检查了插件选项卡,在那里,我只看到了来自我的目标平台的org.eclipse.jdt.junit.runtime_3.4.400.v20130514-0733.jar。我手动添加了org.eclipse.jdt.junit4.runtime_1.1.300.v20130514-0733.jar,但错误仍然相同 :-( - Aaron Digulla
1
你是正确的。尽管 org.eclipse.xtext.junit4 导入了 org.junit 4.5.0,但是 org.eclipse.xtext.junit(注意末尾缺少“4”)似乎依赖于 JUnit 3.8。在添加了旧的、过时的 JUnit bundle 后,插件测试开始运行了。 - Aaron Digulla

2
在您的项目中创建一个带有以下代码的类 -
import static org.junit.Assert.*;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;


public class TestJunitLib {

@Before
public void setUp() throws Exception {
}

@After
public void tearDown() throws Exception {
}

@Test
public void test() {
    fail("Not yet implemented");
}

}

如果在保存时eclipse显示编译器错误,请按Ctrl + 1(快速修复)并选择以下之一-

a)将jUnit 4库添加到构建路径中 b)修复项目设置

如果a未出现,则表示您的eclipse安装缺少jUnit 4插件。 在这种情况下,您可以通过搜索如何在eclipse中安装jUnit来解决问题。


这个可以工作。我的问题是,当目标平台中没有org.junit 3.8 bundle时,Eclipse本身无法启动。 - Aaron Digulla
我正在尝试运行Eclipse JUnit插件测试。请查看我对已接受答案的编辑。 - Aaron Digulla

1
你的pom.xml文件可能存在未解决的问题。打开问题视图并相应地解决它们。然后,理想情况下,你将能够成功运行测试用例,而不会遇到ClassNotFound异常。

正如我在被接受的答案中所解释的那样,这与Maven无关。错误发生在启动Eclipse本身时。因此,在问题视图中没有任何内容。 - Aaron Digulla

0

查看更多详细信息的两个可能位置:

  1. 反编译您提到的jar文件(使用jar tvfjavap -classpath并指定JAR),并检查其依赖项
  2. 检查eclipse.ini以查找可能需要修复的一些初始化变量。

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