从 Spring Boot 应用程序启动的 Cucumber 未在 jar 中找到胶水类

Posted

技术标签:

【中文标题】从 Spring Boot 应用程序启动的 Cucumber 未在 jar 中找到胶水类【英文标题】:Cucumber launched from Spring Boot app not finding the glue classes in the jar 【发布时间】:2019-09-06 12:25:04 【问题描述】:

我们有一个 Spring Boot 应用程序,我们想从这个应用程序中开始执行 Cucumber 功能。 每当用户单击 spring 应用程序中的按钮时,调用就会进入一个类 (CucumberTestService),我们开始执行 Cucumber 功能。

这是我们感兴趣的源代码结构:

    - src
        -main
            -com
                -bino
                    -panel
                        -server
                            -reference
                                -cucumber
                                    -steps
                                        -SendMessagesDefs.java
                                    -CucumberTestService.java

我们准备CucumberTestService中的参数:

   String[] args = new String[]
                "--strict",
                "--glue",
                "com.bino.panel.server.reference.cucumber.steps",
                "--plugin",
                "pretty",
                "/CUCUMBER-FEATS/" + feature + ".feature",
                "--plugin",
                "json:" + reports_path + "/cucumber-reports-" + feature + "/Cucumber.json",
                "--plugin",
                "junit:" + reports_path + "/cucumber-reports-" + feature + "/Cucumber.xml",
                "--plugin",
                "html:" + reports_path + "/cucumber-reports-" + feature,
                "--plugin",
                "usage:" + reports_path + "/cucumber-reports-" + feature + "/cucumber-usage.json",
                "--plugin",
                "pretty:" + reports_path + "/cucumber-reports-" + feature + "/cucumber-pretty.txt"
        ;

然后我们尝试以以下方式启动它 - 就像它在 cucumber.api.cli.Main 中启动的那样:

    run(args, Thread.currentThread().getContextClassLoader());

现在这在我们的 IDE(Eclipse 和 IntelliJ)中运行良好,但是当我们将它打包到 spring boot jar 中时它停止工作。

对于部署,整个应用程序捆绑在一个 jar 中,并具有以下结构:

    - BOOT-INF
        -classes
            -com
                -bino
                    -panel
                        -server
                            -reference
                                -cucumber
                                    -steps
        -lib
    - META-INF
        MANIFEST.ML
    - org
        -springframework
            -boot
                -loader

当尝试执行它时,Cucumber 似乎找不到胶水参数中定义的实现:

1 Scenarios (1 undefined) 7 Steps (7 undefined) 0m0.000s

我们花了相当长的时间调查这个问题,得出的结论是 Cucumber 无法找到 从 Spring Boot jar 执行此路径 "com.bino.panel.server.reference.cucumber.steps" 中的类。 但是当从 IDE(Eclipse、IntelliJ)执行相同的代码时,它们会被正确找到。

关于我们如何“帮助”Cucumber & Spring 找到 spring boot jar 中的胶水类的任何建议?

使用的 Jar 版本(取自我们的 build.gradle 文件):

    - compile group: 'io.cucumber', name: 'gherkin', version: '6.0.14'
    - compile(group: 'info.cukes', name: 'cucumber-java8', version: '1.2.5')
    - compile(group: 'io.cucumber', name: 'cucumber-junit', version: '4.2.6')
    - compile(group: 'io.cucumber', name: 'cucumber-picocontainer', version: '2.4.0')

Spring Boot 版本为2.1.3

非常感谢任何帮助/建议/想法!非常感谢!

【问题讨论】:

检查:github.com/cucumber/cucumber-jvm/issues/… 感谢您的回复!我们确实在 Windows 环境中工作。我们确实检查了这个问题,但不知何故,更多的指导会很有用。会不会也和这个github.com/cucumber/cucumber-jvm/issues/1540有关? 不太可能,因为您是从 spring-jar 加载的。请仔细阅读门票。您只能通过 ApplicationContext 访问 spring-jar 中的资源。 也许这是一个附带问题,但我们意识到我们没有使用最新版本的 jars(在每个版本的上方都指定了它)。但是 cucumber-core-1.2.5.jar 是在 2016-09-12 发布的,目前最新版本是 4.3.0;我们试图为所有依赖项获取最新的 jar,但这不起作用——它们似乎不兼容。是否有所有黄瓜和小黄瓜相关罐子的罐子兼容性表? 我会强烈推荐使用 maven、gradle 甚至 appache ivy 进行依赖管理。但是如果你必须手动完成,你仍然可以手动解析 pom.xml 文件。它们在 Maven 中心上可用。 【参考方案1】:

使用 Gradle,将 Cucumber 工件(即功能、步骤实现等)放入子项目中,例如 my-cucumber-tests,与 Spring Boot 应用程序分开。

然后在 Spring Boot 应用的 build.gradle 中,添加:

bootJar 
  // make backend, features, and steps available to Cucumber at runtime
  requiresUnpack '**/my-cucumber-tests-*.jar', '**/cucumber-java-*.jar'

【讨论】:

以上是关于从 Spring Boot 应用程序启动的 Cucumber 未在 jar 中找到胶水类的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot - 从 2.2.5 升级到 2.5.7 后,应用程序无法启动

从 Spring Boot 应用程序启动的 Cucumber 未在 jar 中找到胶水类

java spring boot在启动之前从db中获取值

Spring Boot启动流程代码断点分析

确定正确的 Spring Boot 启动器

自定义 Spring Boot 启动器不应用属性