2012-07-06 83 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失敗。有可能我需要添加一些更多的依賴關係,一切都會起作用。

相關問題