maven-surefire-plugin失败并显示错误“无法在64位JVM上加载32位SWT库”

时间:2015-05-21 11:23:36

标签: java unit-testing swt eclipse-rcp tycho

我正在开发Eclipse RCP。我正在使用Jenkins作为CI服务器来构建系统并运行单元测试。我可以在Eclipse IDE中运行我的单元测试而没有任何问题,但是当Jenkins尝试在构建作业中执行相同操作时,我收到以下错误消息:

[INFO] --- maven-surefire-plugin:2.18.1:test (test) @ net.morcate.console.scripting ---
[INFO] Surefire report directory: /var/lib/jenkins/jobs/Console-Devel/workspace/sssb-console/net.morcate.console.scripting/target/surefire-reports

-------------------------------------------------------
 T E S T S
-------------------------------------------------------

Running net.morcate.console.scripting.views.browser.FileServerStatusListenerTest

Tests run: 10, Failures: 0, Errors: 10, Skipped: 0, Time elapsed: 1.353 sec <<< FAILURE! - in net.morcate.console.scripting.views.browser.FileServerStatusListenerTest
StatusChange_With_Status_INITIALIZING_Should_NOT_UpdateBrowser(net.morcate.console.scripting.views.browser.FileServerStatusListenerTest)  Time elapsed: 1.315 sec  <<< ERROR!
java.lang.UnsatisfiedLinkError: Cannot load 32-bit SWT libraries on 64-bit JVM
    at org.eclipse.swt.internal.Library.loadLibrary(Library.java:263)
    at org.eclipse.swt.internal.Library.loadLibrary(Library.java:240)
    at org.eclipse.swt.internal.C.<clinit>(C.java:21)
    at org.eclipse.swt.widgets.Display.<clinit>(Display.java:138)
    at sun.reflect.GeneratedSerializationConstructorAccessor7.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at org.objenesis.instantiator.sun.SunReflectionFactoryInstantiator.newInstance(SunReflectionFactoryInstantiator.java:40)
    at org.objenesis.ObjenesisBase.newInstance(ObjenesisBase.java:59)
    at org.mockito.internal.creation.jmock.ClassImposterizer.createProxy(ClassImposterizer.java:111)
    at org.mockito.internal.creation.jmock.ClassImposterizer.imposterise(ClassImposterizer.java:51)
    at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:54)
    at org.mockito.internal.MockitoCore.mock(MockitoCore.java:45)
    at org.mockito.Mockito.mock(Mockito.java:921)
    at org.mockito.internal.configuration.DefaultAnnotationEngine.processAnnotationOn(DefaultAnnotationEngine.java:61)
    at org.mockito.internal.configuration.DefaultAnnotationEngine.createMockFor(DefaultAnnotationEngine.java:36)
    at org.mockito.internal.configuration.DefaultAnnotationEngine.process(DefaultAnnotationEngine.java:85)
    at org.mockito.internal.configuration.InjectingAnnotationEngine.process(InjectingAnnotationEngine.java:40)
    at org.mockito.MockitoAnnotations.scan(MockitoAnnotations.java:112)
    at org.mockito.MockitoAnnotations.initMocks(MockitoAnnotations.java:95)
    at org.mockito.internal.runners.JUnit45AndHigherRunnerImpl$1.withBefores(JUnit45AndHigherRunnerImpl.java:27)
    at org.junit.runners.BlockJUnit4ClassRunner.methodBlock(BlockJUnit4ClassRunner.java:268)
    at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
    at org.mockito.internal.runners.JUnit45AndHigherRunnerImpl.run(JUnit45AndHigherRunnerImpl.java:37)
    at org.mockito.runners.MockitoJUnitRunner.run(MockitoJUnitRunner.java:62)
    at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:283)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:173)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153)
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:128)
    at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:203)
    at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:155)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103)

两台计算机都是Linux Ubuntu 14.04LTS - 64位。所以,我的猜测是我的CI服务器中存在一些配置问题。

这是我在主pom文件中的内容,但我没有说任何用于运行单元测试的架构:

<plugin>
    <groupId>${tycho-groupid}</groupId>
    <artifactId>target-platform-configuration</artifactId>
    <version>${tycho-version}</version>
    <configuration>
        <target>
            <artifact>
                <groupId>scripts.console</groupId>
                <artifactId>net.morcate.console.target</artifactId>
                <version>1.0.0-SNAPSHOT</version>
                <!-- This is the target file to be used to build the console. -->
                <classifier>consoleTest</classifier>
            </artifact>
        </target>
        <resolver>p2</resolver>
        <environments>
            <environment>
                <os>win32</os>
                <ws>win32</ws>
                <arch>x86</arch>
            </environment>
            <environment>
                <os>win32</os>
                <ws>win32</ws>
                <arch>x86_64</arch>
            </environment>
            <environment>
                <os>macosx</os>
                <ws>cocoa</ws>
                <arch>x86_64</arch>
            </environment>
            <environment>
                <os>linux</os>
                <ws>gtk</ws>
                <arch>x86</arch>
            </environment>
            <environment>
                <os>linux</os>
                <ws>gtk</ws>
                <arch>x86_64</arch>
            </environment>
            <environment>
                <os>solaris</os>
                <ws>gtk</ws>
                <arch>x86</arch>
            </environment>
            <environment>
                <os>solaris</os>
                <ws>gtk</ws>
                <arch>sparc</arch>
            </environment>
        </environments>
    </configuration>
</plugin>

如果更改了<environment>元素的顺序,并且我将第一个用于linux gtk x86_64,那么测试将按预期执行。所以问题是:如何设置环境以在我的pom文件中运行测试?

1 个答案:

答案 0 :(得分:1)

Tycho surefire测试运行时的环境为automatically derived(优先级递减):

  • 在Maven settings.xml中配置的属性
  • 系统属性和
  • 在POM中配置的项目属性。

但是,似乎您没有使用tycho-surefire-plugin,但您已手动配置maven-surefire-plugin来运行测试。

要解决此问题,您可能只需要从POM中删除maven-surefire-plugin配置,并确保使用打包类型eclipse-test-plugin。该打包类型自动包括使用Tycho的surefire插件执行测试。