【问题标题】:UnsatisfiedLinkError with maven-surefire-pluginUnsatisfiedLinkError with maven-surefire-plugin
【发布时间】:2016-03-05 02:47:29
【问题描述】:

使用 maven-surefire-plugin 运行单元测试时,会出现此错误:

java.lang.UnsatisfiedLinkError: 无法在 64 位 JVM 上加载 32 位 SWT 库

我知道如何在我的 IDE 中解决这个问题,我只需要在测试的运行配置中选择正确的运行时 JRE。但是,在 TeamCity 构建服务器上运行测试时,会出现上述错误。

是否有任何确定性或 TeamCity 选项来配置运行时 JRE?

这是我当前的万无一失的配置:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <configuration>
    <skipTests>false</skipTests>
    <includes>
      <include>**/*Test.java</include>
    </includes>
    <parallel>methods</parallel>
    <threadCount>10</threadCount>
  </configuration>
</plugin>

【问题讨论】:

    标签: java maven unit-testing teamcity maven-surefire-plugin


    【解决方案1】:

    TeamCity 中配置 Maven 构建步骤时,选择具有适当“位数”的目标 JDK(在您的情况下为 x86):

    至少您的一个构建代理应具有已发现且可用的 32 位 JDK。您可以通过 Agents -> Connected -> -> Agent Parameters -> Environment Variables 检查特定代理是否属于这种情况。这是JDK_* 变量及其值的示例:

    JDK_14       C:\Program Files (x86)\Java\jdk1.4.2_19
    JDK_15       C:\Program Files\Java\jdk1.5.0_22
    JDK_15_x64   C:\Program Files\Java\jdk1.5.0_22
    JDK_16       C:\Program Files (x86)\Java\jdk1.6.0_45
    JDK_16_x64   C:\Program Files\Java\jdk1.6.0_45
    JDK_17       C:\Program Files (x86)\Java\jdk1.7.0_76
    JDK_17_x64   C:\Program Files\Java\jdk1.7.0_76
    JDK_18       C:\Program Files\Java\jdk1.8.0_40
    JDK_18_x64   C:\Program Files\Java\jdk1.8.0_40
    

    这里,JDK_18JDK_18_x64 具有相同的值意味着代理没有找到 32 位 1.8 JDK。

    【讨论】:

    • &lt;jvm&gt;${env.JDK_18}/bin/java&lt;/jvm&gt; 修复了 TeamCity 上的问题,但现在本地构建失败。我尝试使用&lt;environmentVariables&gt; 在我的surefire 配置中设置变量,但它不起作用。
    • 有没有办法在本地设置不同的路径,让 TeamCity 用代理的JDK_18 环境变量覆盖它?
    • @user1438038:我们的想法是保持pom.xml 不变,而是更改 TeamCity Maven 构建步骤参数。为了使您的构建成功,您需要修改其中一个,而不是两个。 Fabien Thouraud 的答案是关于更改 pom。我的是关于 TeamCity 微调。
    • 好的,感谢您直言不讳。我设法复制了我的构建配置,将构建步骤从模板中分离出来,并根据需要更改了目标 JDK。已接受答案。
    【解决方案2】:

    你可以使用jvm标签来指定使用哪个JVM:

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
            <jvm>${env.MY_JAVA_HOME}/bin/java</jvm>
            <skipTests>false</skipTests>
            <includes>
                <include>**/*Test.java</include>
            </includes>
            <parallel>methods</parallel>
            <threadCount>10</threadCount>
        </configuration>
    </plugin>
    

    此示例假设您有一个 MY_JAVA_HOME 环境变量。

    【讨论】:

    • jvm 选项很好,只要我知道本地机器上的 JRE 路径。但是如何选择安装在 TeamCity 构建服务器上的合适 JRE?
    • 据我所知,除非您定义指向非默认 Java 的特定环境变量,否则您无法直接访问 2 个 Java 安装。如果您不知道 64 位 JRE 安装在哪里,我没有解决方案。相反,您可以通过编辑buildAgent.properties TeamCity 配置文件来添加环境变量。
    • 给定的配置,特别是includes 正是 Maven surefire-plugin 的默认配置...所以不需要显式配置。
    猜你喜欢
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 2014-06-28
    • 2020-11-09
    • 2017-09-01
    • 2012-02-11
    • 2011-03-31
    • 1970-01-01
    相关资源
    最近更新 更多