从 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 后,应用程序无法启动