You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows 10环境下无法执行Karate Feature文件求助

问题:Eclipse执行Karate Feature文件时出现NoClassDefFoundError

问题描述

在Eclipse IDE中通过「Run As」>「Cucumber Feature」执行Karate Feature文件时失败,报错:

Exception in thread "main" java.lang.NoClassDefFoundError: jdk/nashorn/api/scripting/ScriptObjectMirror

已尝试以下调整JDK版本的方法,但均无效:

  • 修改项目属性中Java编译器的JDK合规级别为1.7、1.8、14、15
  • 在偏好设置中修改已安装JRE及执行环境为对应版本
  • 在运行配置中修改Runtime JRE执行环境为对应版本

补充信息

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
 
    <groupId>org.sam.kdsl.pract</groupId>
    <artifactId>myproject</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
 
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
        <maven.compiler.version>3.8.1</maven.compiler.version>
        <!--<maven.surefire.version>2.22.2</maven.surefire.version>-->
        <maven.surefire.version>3.0.0-M1</maven.surefire.version>      
        <karate.version>0.9.5</karate.version>
    </properties>    

    <dependencies>         
        <dependency>
            <groupId>com.intuit.karate</groupId>
            <artifactId>karate-junit5</artifactId>
            <version>${karate.version}</version>
            <scope>test</scope>
        </dependency>
        
        <dependency>
            <groupId>com.intuit.karate</groupId>
            <artifactId>karate-apache</artifactId>
            <version>${karate.version}</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>io.cucumber</groupId>
            <artifactId>cucumber-java</artifactId>
            <version>7.12.0</version>
        </dependency>             
    </dependencies>

    <build>
        <testResources>
            <testResource>
                <directory>src/test/java</directory>
                <excludes>
                    <exclude>**/*.java</exclude>
                </excludes>
            </testResource>
        </testResources>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>${maven.compiler.version}</version>
                <configuration>
                    <encoding>UTF-8</encoding>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <compilerArgument>-Werror</compilerArgument>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>${maven.surefire.version}</version>
                <configuration>
                    <argLine>-Dfile.encoding=UTF-8</argLine>
                </configuration>
            </plugin>          
        </plugins>        
    </build>       
</project>

Java版本

J:\My Drive\API\Karate-DSL\karate-dsl1>echo %JAVA_HOME%
C:\Program Files\Java\jdk1.8.0_261

Maven版本

J:\My Drive\API\Karate-DSL\karate-dsl1>mvn --version
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: C:\maven\apache-maven-3.6.3\bin\..
Java version: 1.8.0_261, vendor: Oracle Corporation, runtime: C:\Program Files\Java\jdk1.8.0_261\jre
Default locale: en_US, platform encoding: Cp1252
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"

Eclipse控制台错误日志

command: J:/My Drive/API/Karate-DSL/kdsl/myproject/src/test/java/examples/users/users.feature --glue classpath: --plugin pretty --monochrome
21:01:45.065 [main] INFO  com.intuit.karate.Runner - waiting for parallel features to complete ...
Karate version: 0.9.5
======================================================
elapsed:   0.03 | threads:    1 | thread time: 0.00 
features:     0 | ignored:    0 | efficiency: 0.00
scenarios:    0 | passed:     0 | failed: 0
======================================================

Exception in thread "main" java.lang.NoClassDefFoundError: jdk/nashorn/api/scripting/ScriptObjectMirror
    at com.intuit.karate.JsonUtils.<clinit>(JsonUtils.java:108)
    at com.intuit.karate.core.Engine.saveStatsJson(Engine.java:439)
    at com.intuit.karate.Runner.parallel(Runner.java:356)
    at com.intuit.karate.Runner$Builder.parallel(Runner.java:181)
    at com.intuit.karate.cli.Main.main(Main.java:66)
    at cucumber.api.cli.Main.main(Main.java:34)
Caused by: java.lang.ClassNotFoundException: jdk.nashorn.api.scripting.ScriptObjectMirror
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
    ... 6 more

Feature文件

Feature: sample karate test script
  for help, see: https://github.com/karatelabs/karate/wiki/IDE-Support

  Background:
    * url 'https://jsonplaceholder.typicode.com'

  Scenario: get all users and then get the first user by id
    Given path 'users'
    When method get
    Then status 200

    * def first = response[0]

    Given path 'users', first.id
    When method get
    Then status 200

  Scenario: create a user and then get it by id
    * def user =
      """
      {
        "name": "Test User",
        "username": "testuser",
        "email": "test@user.com",
        "address": {
          "street": "Has No Name",
          "suite": "Apt. 123",
          "city": "Electri",
          "zipcode": "54321-6789"
        }
      }
      """

    Given url 'https://jsonplaceholder.typicode.com/users'
    And request user
    When method post
    Then status 201

    * def id = response.id
    * print 'created id is: ', id

    Given path id
    # When method get
    # Then status 200
    # And match response contains user

解决方案

核心原因分析

  1. 依赖版本冲突:Karate 0.9.5基于Cucumber 1.x开发,手动引入的Cucumber 7.12.0属于高版本,两者类结构不兼容,导致类加载混乱。
  2. 运行时JDK不匹配:错误栈中出现java.base/jdk.internal.loader.BuiltinClassLoader(Java 9+专属类加载器),说明Eclipse实际用高版本JDK执行测试,而Karate 0.9.5依赖Java 8自带的Nashorn引擎,该引擎在Java 11及以后被移除,因此抛出类找不到错误。

方案1:升级Karate到最新稳定版(推荐)

Karate 1.x及以上版本已完全移除Nashorn依赖,且不再依赖Cucumber,彻底避免版本冲突。修改pom.xml:

<properties>
    <java.version>1.8</java.version>
    <maven.compiler.version>3.8.1</maven.compiler.version>
    <maven.surefire.version>3.0.0-M1</maven.surefire.version>
    <karate.version>1.4.1</karate.version> <!-- 替换为最新稳定版 -->
</properties>

<dependencies>
    <dependency>
        <groupId>com.intuit.karate</groupId>
        <artifactId>karate-junit5</artifactId>
        <version>${karate.version}</version>
        <scope>test</scope>
    </dependency>
    <!-- 移除cucumber-java依赖,Karate 1.x已内置测试执行能力 -->
    <!-- karate-apache已整合到karate-junit5中,可移除单独依赖 -->
</dependencies>

方案2:修复现有依赖并统一运行时JDK

若坚持使用Karate 0.9.5:

  1. 删除冲突依赖:移除pom.xml中的cucumber-java依赖,Karate 0.9.5自带兼容的Cucumber版本。
  2. 强制Eclipse使用Java 8:
    • 打开「Window > Preferences > Java > Installed JREs」,仅保留并勾选JDK 1.8.0_261,删除其他JDK。
    • 打开运行配置(Run Configurations),选择对应的Cucumber运行配置,切换到「JRE」标签页,选择JDK 1.8.0_261,勾选「Use this JRE」。
    • 右键项目 →「Maven > Update Project」,勾选「Force Update of Snapshots/Releases」后确认。
  3. 执行mvn clean test验证Maven能正常运行测试,再在Eclipse中重新执行Feature文件。

内容的提问来源于stack exchange,提问作者sampath

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 06:47:03