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
解决方案
核心原因分析
- 依赖版本冲突:Karate 0.9.5基于Cucumber 1.x开发,手动引入的Cucumber 7.12.0属于高版本,两者类结构不兼容,导致类加载混乱。
- 运行时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:
- 删除冲突依赖:移除
pom.xml中的cucumber-java依赖,Karate 0.9.5自带兼容的Cucumber版本。 - 强制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」后确认。
- 执行
mvn clean test验证Maven能正常运行测试,再在Eclipse中重新执行Feature文件。
内容的提问来源于stack exchange,提问作者sampath
相关产品推荐
相关产品推荐

