【问题标题】:Getting initialization error "NoClassDefFoundError: cucumber/runtime/io/URLOutputStream" after integrating cucumber.adapter.ExtentCucumberAdapter集成 cucumber.adapter.ExtentCucumberAdapter 后出现初始化错误“NoClassDefFoundError: cucumber/runtime/io/URLOutputStream”
【发布时间】:2019-02-16 07:56:03
【问题描述】:

黄瓜 V. 4.2.3 |硒 V.3.8.1 | JUnit V.4.12 |范围报告 V. 3.1.1

在 RunCuke 中的插件下集成“com.aventstack.extentreports.cucumber.adapter.ExtentCucumberAdapter:”时遇到错误“java.lang.NoClassDefFoundError: cucumber/runtime/io/URLOutputStream” Java文件

package com.jacksparrow.automation.suite.runner;

import org.junit.runner.RunWith;
import cucumber.api.CucumberOptions;
import cucumber.api.junit.Cucumber;

@RunWith(Cucumber.class)
@CucumberOptions(features = "classpath:features/functional/",
                     glue = {"com.jacksparrow.automation.steps_definitions.functional" },
                     tags = { "@guest_plp" },
                   plugin = { "pretty","json:target/cucumber-json/cucumber.json",
                              "junit:target/cucumber-reports/Cucumber.xml", "html:target/cucumber-reports",
                              "com.aventstack.extentreports.cucumber.adapter.ExtentCucumberAdapter:"},
                   strict = false,
                   dryRun = false,
               monochrome = true)

public class FunctionalRunCuke {
}

Error Screen Shot from Eclipse

尝试在 POM.xml 中添加扩展黄瓜适配器,如下所示 -

    <dependency>
            <groupId>com.aventstack</groupId>
            <artifactId>extentreports-cucumber4-adapter</artifactId>
            <version>1.0.5</version>
        </dependency>

        <dependency>
            <groupId>com.aventstack</groupId>
            <artifactId>extentreports</artifactId>
            <version>3.1.1</version>
        </dependency>

        <dependency>
            <groupId>com.vimalselvam</groupId>
            <artifactId>cucumber-extentsreport</artifactId>
            <version>3.1.1</version>
        </dependency>

如果我删除“extentreports-cucumber4-adapter”,则不会出现下面提到的编译时错误 -

    java.lang.NoClassDefFoundError: cucumber/runtime/io/URLOutputStream
        at java.lang.Class.getDeclaredConstructors0(Native Method)
        at java.lang.Class.privateGetDeclaredConstructors(Class.java:2671)
        at java.lang.Class.getConstructor0(Class.java:3075)
        at java.lang.Class.getConstructor(Class.java:1825)
        at cucumber.runtime.formatter.PluginFactory.findSingleArgConstructor(PluginFactory.java:141)
        at cucumber.runtime.formatter.PluginFactory.instantiate(PluginFactory.java:82)
        at cucumber.runtime.formatter.PluginFactory.create(PluginFactory.java:73)
        at cucumber.runtime.formatter.Plugins.createPlugins(Plugins.java:65)
        at cucumber.runtime.formatter.Plugins.<init>(Plugins.java:37)
        at cucumber.api.junit.Cucumber.<init>(Cucumber.java:94)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:104)
        at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:86)
        at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
        at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)
        at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
        at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:33)
        at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createUnfilteredTest(JUnit4TestLoader.java:87)
        at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:73)
        at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:46)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:522)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:760)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:460)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206)
    Caused by: java.lang.ClassNotFoundException: cucumber.runtime.io.URLOutputStream
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        ... 27 more

我在 POM.xml 中添加了以下依赖项

<!-- ********************************()() CUCUMBER & SELENIUM DEPENDENCIES ()()******************************** --> 

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

<dependency>
    <groupId>io.cucumber</groupId>
    <artifactId>cucumber-junit</artifactId>
    <version>4.2.3</version>
    <scope>test</scope>
</dependency>

<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>io.cucumber</groupId>
    <artifactId>datatable</artifactId>
    <version>1.1.12</version>
</dependency>

<dependency>
    <groupId>io.cucumber</groupId>
    <artifactId>cucumber-testng</artifactId>
    <version>4.2.3</version>
</dependency>

<dependency>
    <groupId>io.cucumber</groupId>
    <artifactId>cucumber-picocontainer</artifactId>
    <version>4.2.3</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-java</artifactId>
    <version>3.8.1</version>
</dependency>

    <dependency>
    <groupId>com.aventstack</groupId>
    <artifactId>extentreports</artifactId>
    <version>3.1.1</version>
</dependency>

<dependency>
    <groupId>com.vimalselvam</groupId>
    <artifactId>cucumber-extentsreport</artifactId>
    <version>3.1.1</version>
</dependency>

<dependency>
    <groupId>com.aventstack</groupId>
    <artifactId>extentreports-cucumber4-adapter</artifactId>
    <version>1.0.5</version>
</dependency>

以前有人遇到过这个问题。 Cucumber V 4.2.3 是否支持 extentreports-cucumber4-adapter 插件。如果是这样,那么任何猜测,这里有什么问题导致这个错误。

【问题讨论】:

  • 尝试使用 4.2.0... 这已在 4.2.1 中删除 github.com/cucumber/cucumber-jvm/tree/v4.2.0/core/src/main/java/…
  • 看起来 extentreports-cucumber4-adapter 正在使用内部黄瓜 API。你应该向他们提交一张票。
  • 将 Extent 3.x 与适配器一起使用的原因是什么?该适配器只能与 Extent 4.x 一起使用。您不需要使用 ExtentReports 依赖项,还必须删除 com.vimalselvam 依赖项。
  • 嘿@Grasshopper,当我使用 cucumber v 4.0.0 或 4.2.0 运行它时,它运行成功。
  • @silver 查看link 了解更多详情。使用缺少的类创建了一个自定义 jar。已经测试到 4.3.1,应该也适用于最新版本...

标签: cucumber


【解决方案1】:

之所以出现此问题,是因为您将 ExtentReports 版本 3 与黄瓜适配器一起使用,这仅适用于版本 ExtentReports v4。如果删除依赖项不能解决问题,我建议分享您的 pom.xml。

【讨论】:

  • 现在我只有适配器依赖项是 POM.xml(删除了 com.aventstack 和 com.vimalselvam 依赖项)并且正在生成报告。根据我的理解,如果我们使用适配器,那么我们不需要传递步骤信息以及我们在没有适配器的情况下所做的其他事情,比如刷新范围报告和很多要添加的内容。但是,如果我们想在报告中添加一些消息,有什么方法可以做到
  • 这就是这些适配器背后的理念:让您能够以 0 的配置和设置工作量创建报告。
  • 要添加更多信息,请在 AfterStep 中使用 scenario.write。
  • 好的,我现在明白了。非常感谢@foursyth。正因为您的快速回复,我们现在可以关闭此查询,我会在需要时在其他帖子上分享这些想法。
  • 我也面临这个问题。当我使用 cucumber-core v4.2.2 时。我收到 NoClassDefFoundError cucumber.runtime.io.URLOutputStream。关于使用 v4.2.0 获取 NoClassDefFoundError cucumber.runtime.io.RunnerOptions.
【解决方案2】:

上面的问题可以通过添加下面的依赖来解决

<!-- https://mvnrepository.com/artifact/com.aventstack/extentreports-cucumber4-adapter -->
    <dependency>
        <groupId>com.aventstack</groupId>
        <artifactId>extentreports-cucumber4-adapter</artifactId>
        <version>1.0.8</version>
    </dependency>

【讨论】:

    【解决方案3】:

    @Grasshopper 已经提供了解决方案,但在 cmets 部分。所以,我想我会把它放在主要部分,因为有些用户可能不会浏览所有的 cmets。

    如果我们使用 cucumber-java 版本 > v4.2.0 会出现此错误。因此,如果您使用的是最新版本,请将其降级到 v4.2.0。

    为了您的理解,这是我的 pom 的外观:

        <dependency>
            <groupId>io.cucumber</groupId>
            <artifactId>cucumber-java</artifactId>
            <version>4.2.0</version>
        </dependency>
    
        <dependency>
            <groupId>io.cucumber</groupId>
            <artifactId>cucumber-core</artifactId>
            <version>4.2.0</version>
        </dependency>
    
        <dependency>
            <groupId>io.cucumber</groupId>
            <artifactId>cucumber-junit</artifactId>
            <version>4.2.0</version>
        </dependency>
    

    【讨论】:

    • 有没有不降级的解决方案?虽然这可行,但它是一种解决方法。
    猜你喜欢
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多