2012-07-06 44 views
1

我被这个完全搞糊涂了,并且大吃一惊。据我了解,应该工作,但我不知道为什么。因为java.lang.NoClassDefFoundError而导致Tycho测试失败:junit/framework/AssertionFailedError

我有一个tycho构建,只是在eclipse worksbench中运行一些测试。然而,我所有的测试都会因为这种例外而失败:

java.lang.NoClassDefFoundError: junit/framework/AssertionFailedError 
at org.grails.ide.eclipse.commands.test.AbstractCommandTest.tearDown(AbstractCommandTest.java:112) 
at junit.framework.TestCase.runBare(TestCase.java:140) 
at junit.framework.TestResult$1.protect(TestResult.java:110) 
at junit.framework.TestResult.runProtected(TestResult.java:128) 
at junit.framework.TestResult.run(TestResult.java:113) 
at junit.framework.TestCase.run(TestCase.java:124) 
at junit.framework.TestSuite.runTest(TestSuite.java:243) 
at junit.framework.TestSuite.run(TestSuite.java:238) 
at junit.framework.TestSuite.runTest(TestSuite.java:243) 
at junit.framework.TestSuite.run(TestSuite.java:238) 
at org.springsource.ide.eclipse.commons.tests.util.ManagedTestSuite.run(ManagedTestSuite.java:231) 
at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:83) 
at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:53) 
at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:123) 
at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:104) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:164) 
at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:110) 
at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:175) 
at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcess(SurefireStarter.java:123) 
at org.eclipse.tycho.surefire.osgibooter.OsgiSurefireBooter.run(OsgiSurefireBooter.java:84) 
at org.eclipse.tycho.surefire.osgibooter.AbstractUITestApplication$1.run(AbstractUITestApplication.java:35) 
at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) 
at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:135) 
at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3529) 
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3182) 
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$9.run(PartRenderingEngine.java:1022) 
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) 
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:916) 
at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:86) 
at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:585) 
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) 
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:540) 
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149) 
at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:124) 
at org.eclipse.tycho.surefire.osgibooter.UITestApplication.runApplication(UITestApplication.java:31) 
at org.eclipse.tycho.surefire.osgibooter.AbstractUITestApplication.run(AbstractUITestApplication.java:114) 
at org.eclipse.tycho.surefire.osgibooter.UITestApplication.start(UITestApplication.java:37) 
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) 
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110) 
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79) 
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:353) 
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:180) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:629) 
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:584) 
at org.eclipse.equinox.launcher.Main.run(Main.java:1438) 
at org.eclipse.equinox.launcher.Main.main(Main.java:1414) 

Caused by: java.lang.ClassNotFoundException: junit.framework.AssertionFailedError 
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:247) 
... 54 more 

这对我没有意义。 org.junitorg.junit4是运行测试的软件包的依赖关系,以及包含AbstractCommandTest的软件包。这些测试在我的工作区内运行时通过,那么为什么maven/tycho无法加载junit类?

我很高兴提供更多信息,如链接到github回购,如果这将有所帮助。


编辑:提供了更多的细节

GitHub的回购是在这里:https://github.com/grails/grails-sts-tests

你可以看到它是一个仅运行一些测试一个简单的,单一的插件。测试套件由来自其他存储库中插件的测试组成,这些存储库被指定为依赖关系。请注意,位于其他存储库中的测试插件在另一个CI服务器上运行,并且没有NoClassDefFoundError问题。我查看了其他CI服务器,并没有注意到任何不同(不幸的是,此CI服务器不能公开访问,所以我无法分享到它的链接)。

显示问题哈德森构建工作是在这里:http://hudson.grails.org/job/grails-sts-tests-2.0.x/17/console

+0

请尝试提供一些关于如何配置Tycho /测试项目的更多详细信息。根据我的经验,Tycho的构建错误往往不是由于对其默认插件模型的一些轻微误解造成的。 – 2012-07-09 21:05:45

+0

谢谢。提供更多细节。 – 2012-07-09 21:19:24

+0

只要未找到或无法加载类的依赖关系,就会抛出java.lang.NoClassDefFoundError。既然你说插件在另一个CI服务器上编译,我会怀疑它运行在不同的JVM版本上。你能粘贴完整的堆栈跟踪吗? – melix 2012-07-10 07:28:54

回答

0

事我会做的检查:

  1. 检查的NoClassDefFoundError的原因。像UnSupportedClassVersionError和ExceptionINinitializationError是最常见的各种原因。
  2. 使用JVM选项-verbose:class可以获取类加载日志,并从所需类的预期工件中加载检查类。
+0

OSGi引发NoClassDefFoundError,因为在测试包的类加载器中找不到该类。我刚刚添加了-verbose:class选项,我正在浏览日志。到目前为止没有什么有趣的... – 2012-07-10 19:34:30

0

我在一个Android项目上运行junit测试时遇到了类似的问题,该项目依赖于几个第三方jar,结果问题是其中一个依赖jar使用jdk v1.5和其他所有东西是1.6。我更新了一个图书馆到一个新的版本,它是用1.6编译的,然后错误消失了。

不知道如果同样的问题,或者您可以配置第谷或更新它,但它可能是值得一试.....

1

我们有非常类似的问题。原因在于junit框架试图创建和使用自定义类加载器,而这对于Eclipse插件类加载器来说并不合适。我们现在遵循一些指导来运行Tycho的单元测试。

  1. 你的单元测试是在一个插件片段中。单元测试片段依赖于JUnit。
  2. 你的pom应该关闭使用系统类加载器进行单元测试。这是导致junit测试类丢失的原因。
  3. 然后你使用与标准插件相同的包装(准确地说,eclipse-plugin)。

所以一个简单的POM(我们)是这样的:

<?xml version="1.0" encoding="UTF-8"?> 
<project 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" 
xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <modelVersion>4.0.0</modelVersion> 
    <parent> 
    <artifactId>master</artifactId> 
    <groupId>mgws</groupId> 
    <version>0.0.1-SNAPSHOT</version> 
    <relativePath>../../mgws/build-environment/pom.xml</relativePath> 
    </parent> 
    <groupId>mgws</groupId> 
    <artifactId>mgws.spectral.test</artifactId> 
    <version>1.0.0-SNAPSHOT</version> 
    <packaging>eclipse-plugin</packaging> 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-surefire-plugin</artifactId> 
     <version>2.12</version> 
     <executions> 
      <execution> 
      <id>JUnitTest</id> 
      <goals> 
       <goal>test</goal> 
      </goals> 
      <phase>install</phase> 
      <configuration> 
       <useSystemClassLoader>false</useSystemClassLoader> 
      </configuration> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 
</project> 

这使得单元测试框架使用Eclipse插件的类加载器,现在它找到的所有类。

+0

我很惊讶。为什么不使用tycho-surefire-plugin运行测试? tycho-surefire-plugin的配置部分看起来完全不同。但是,感谢useSystemClassLoader提示。我现在正在尝试。 – 2012-07-10 22:07:01

+0

不幸的是,没有好的。 – 2012-07-10 22:11:47

+0

我们有要求将单元测试作为非插件测试运行。我不记得为什么,已经有好几年了。 – Zagrev 2012-07-11 14:55:23

0

仍然没有人能够回答这个问题,但感谢您的信息,即使它没有直接有用。

我已经取得了一些进展。我现在有60个测试中有45个通过。我只是增加了一些额外的依赖像这样在第谷 - 神火-pluign配置区域:

   <dependencies> 
        <dependency> 
         <type>p2-installable-unit</type> 
         <artifactId>org.junit</artifactId> 
         <version>0.0.0</version> 
        </dependency> 
        ... 
       </dependencies> 

不幸的是,余下的测试仍然使用相同的NoClassDefFoundError失败。有可能我需要添加一些更多的依赖关系,一切都会起作用。

相关问题