Gatling构建Fat Jar后无法生成HTML报告问题排查
问题:Gatling Fat Jar无法生成HTML报告,报错找不到ComponentLibrary实现
运行Gatling构建的Fat Jar时,功能正常但无法生成HTML报告,报错如下:
Parsing log file(s)... Parsing log file(s) done in 0s. Generating reports... Exception in thread "main" java.lang.ExceptionInInitializerError at io.gatling.charts.report.ReportsGenerator.generateFor(ReportsGenerator.scala:56) at io.gatling.app.RunResultProcessor.generateReports(RunResultProcessor.scala:61) at io.gatling.app.RunResultProcessor.processRunResult(RunResultProcessor.scala:35) at io.gatling.app.Gatling$.start(Gatling.scala:102) at io.gatling.app.Gatling$.fromArgs(Gatling.scala:54) at io.gatling.app.Gatling$.main(Gatling.scala:42) at io.gatling.app.Gatling.main(Gatling.scala) Caused by: java.lang.IllegalStateException: Couldn't find a ComponentLibrary implementation at io.gatling.charts.component.ComponentLibrary$.<clinit>(ComponentLibrary.scala:30) ... 7 more
当前build.sbt配置:
import sbtassembly.AssemblyKeys.assembly enablePlugins(GatlingPlugin) scalaVersion := "2.13.13" scalacOptions := Seq( "-encoding", "UTF-8", "-release:8", "-deprecation", "-feature", "-unchecked", "-language:implicitConversions", "-language:postfixOps") // 3.10.5 val gatlingVersion = "3.10.5" libraryDependencies += "io.gatling.highcharts" % "gatling-charts-highcharts" % gatlingVersion //% "test,it" libraryDependencies += "io.gatling" % "gatling-test-framework" % gatlingVersion //% "test,it" libraryDependencies += "io.github.gatling-cql" % "gatling-cql" % "3.9.0-1" libraryDependencies += "com.esri.geometry" % "esri-geometry-api" % "1.2.1" libraryDependencies += "org.apache.tinkerpop" % "gremlin-core" % "3.5.3" libraryDependencies += "org.apache.tinkerpop" % "tinkergraph-gremlin" % "3.5.3" libraryDependencies += "com.datastax.oss" % "java-driver-core" % "4.14.1" libraryDependencies += "com.datastax.oss" % "java-driver-query-builder" % "4.14.1" libraryDependencies += "com.datastax.oss" % "java-driver-mapper-runtime" % "4.14.1" mainClass in assembly := Some("com.example.CassandraSimulation2") assemblyMergeStrategy in assembly := { case PathList("META-INF", "native", "libnetty_tcnative_linux_x86_64.so") => MergeStrategy.last case PathList("META-INF", _*) => MergeStrategy.discard case "reference.conf" => MergeStrategy.concat case _ => MergeStrategy.first }
排查情况
- 在sbt Shell中运行时,报告可正常生成
- Fat Jar内部已包含
io.gatling.charts.highcharts.component.ComponentLibraryImpl和io.gatling.charts.component.ComponentLibrary类
问题原因
Gatling通过Java ServiceLoader机制加载ComponentLibrary的实现类,需要读取META-INF/services/io.gatling.charts.component.ComponentLibrary配置文件,该文件中声明了实现类的全路径。但当前的assemblyMergeStrategy直接丢弃了所有META-INF下的文件,导致这个关键配置文件缺失,ServiceLoader无法找到实现类,从而触发报错。
解决方案
修改assemblyMergeStrategy,保留META-INF/services目录下的服务配置文件,调整后的配置如下:
assemblyMergeStrategy in assembly := { case PathList("META-INF", "native", "libnetty_tcnative_linux_x86_64.so") => MergeStrategy.last case PathList("META-INF", "services", _*) => MergeStrategy.filterDistinctLines // 合并服务配置文件,避免重复条目 case PathList("META-INF", _*) => MergeStrategy.discard // 其他非必要META-INF文件仍丢弃 case "reference.conf" => MergeStrategy.concat case _ => MergeStrategy.first }
重新构建Fat Jar后,运行时就能正确加载ComponentLibraryImpl,生成HTML报告。
内容的提问来源于stack exchange,提问作者Pavel Orekhov
相关产品推荐
相关产品推荐

