如何解决NoSuchMethodError:cucumber.api.scala.ScalaDsl.$init 在 scala/sbt ugrade 之后
我将 Scala
从 2.11.8
升级到 2.12.4
,将 sbt
从 0.13
升级到 1.4.6
,该项目编译正常并且正在运行,但是当我运行 sbt test
时,它给了我以下错误。
Test MyCucumberIT.initializationError Failed: java.lang.NoSuchMethodError: cucumber.api.scala.ScalaDsl.$init$(Lcucumber/api/scala/ScalaDsl;)V,took 0.001 sec
[error] at integrationtest.stepdefs.HttpStepDefs.<init>(HttpStepDefs.scala:12)
[error] at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
[error] at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
[error] at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
[error] at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
[error] at java.lang.class.newInstance(Class.java:442)
[error] at cucumber.runtime.scala.ScalaBackend$$anonfun$6.apply(ScalaBackend.scala:62)
[error] at cucumber.runtime.scala.ScalaBackend$$anonfun$6.apply(ScalaBackend.scala:62)
[error] at scala.collection.TraversableLike.$anonfun$map$1(TraversableLike.scala:234)
[error] at scala.collection.mutable.ResizableArray.foreach(ResizableArray.scala:59)
[error] at scala.collection.mutable.ResizableArray.foreach$(ResizableArray.scala:52)
[error] at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:48)
[error] at scala.collection.TraversableLike.map(TraversableLike.scala:234)
[error] at scala.collection.TraversableLike.map$(TraversableLike.scala:227)
[error] at scala.collection.AbstractTraversable.map(Traversable.scala:104)
[error] at cucumber.runtime.scala.ScalaBackend.loadglue(ScalaBackend.scala:62)
[error] at cucumber.runtime.Runtime.<init>(Runtime.java:92)
[error] at cucumber.runtime.Runtime.<init>(Runtime.java:70)
[error] at cucumber.runtime.Runtime.<init>(Runtime.java:66)
[error] at cucumber.api.junit.Cucumber.createRuntime(Cucumber.java:80)
[error] at cucumber.api.junit.Cucumber.<init>(Cucumber.java:59)
[error] ...
下面分别是 plugin.sbt
和 build.sbt
:
import sbtassembly.AssemblyPlugin.autoImport.{assemblyMergeStrategy,assemblyOutputPath}
import sbtassembly.AssemblyKeys
organization := "someOrg"
name := "someName"
scalaVersion := "2.12.4"
libraryDependencies ++= {
val AkkaVersion = "2.6.13"
val AkkaHttpVersion = "10.2.4"
val dockerTestKitVersion = "0.9.3"
val cucumberVersion = "1.2.6"
val cucumberOrgId = "info.cukes"
val akkaOrgId = "com.typesafe.akka"
val slickOrgId = "com.typesafe.slick"
val excludeLogBack = ExclusionRule(organization = "ch.qos.logback")
Seq(
akkaOrgId %% "akka-http" % AkkaHttpVersion,akkaOrgId %% "akka-http-spray-json" % AkkaHttpVersion,akkaOrgId %% "akka-slf4j" % AkkaVersion,"MysqL" % "mysql-connector-java" % "5.1.39","org.flywaydb" % "flyway-core" % "4.0.3","com.zaxxer" % "HikariCP" % "2.5.1",slickOrgId %% "slick" % "3.2.1",slickOrgId %% "slick-hikaricp" % "3.2.1",//
"com.typesafe" % "config" % "1.3.0","org.scala-lang.modules" %% "scala-xml" % "1.0.5","com.google.guava" % "guava" % "19.0","net.codingwell" %% "scala-guice" % "4.1.0" excludeAll(
ExclusionRule(organization = "org.scala-lang"),ExclusionRule(organization = "com.google.guava")
),"org.typelevel" %% "cats" % "0.8.1",akkaOrgId %% "akka-http-testkit" % AkkaHttpVersion % "test",cucumberOrgId % "cucumber-junit" % cucumberVersion % "test" exclude("junit","junit"),cucumberOrgId %% "cucumber-scala" % cucumberVersion % "test",cucumberOrgId % "cucumber-core" % cucumberVersion % "test",cucumberOrgId % "cucumber-jvm" % cucumberVersion % "test","junit" % "junit" % "4.12" % "test","org.apache.httpcomponents" % "httpcore" % "4.4.5" % "test","org.apache.httpcomponents" % "httpclient" % "4.5.2" % "test","com.novocode" % "junit-interface" % "0.11" % "test" exclude("org.hamcrest","hamcrest-core"),"org.scalatest" %% "scalatest" % "3.0.0" % "test" excludeAll(
ExclusionRule(organization = "org.scala-lang"),ExclusionRule(organization = "org.scala-lang.modules")
),"com.h2database" % "h2" % "1.4.192" % "test","org.mockito" % "mockito-core" % "1.10.19" % "test","org.pegdown" % "pegdown" % "1.4.2" % "test","com.whisk" %% "docker-testkit-scalatest" % dockerTestKitVersion % "test","com.whisk" %% "docker-testkit-impl-docker-java" % dockerTestKitVersion % "test",// standard logging with ZipKin
"com.typesafe.scala-logging" %% "scala-logging" % "3.9.0",akkaOrgId %% "akka-stream" % AkkaVersion,akkaOrgId %% "akka-protobuf" % AkkaVersion,)
}
(testOptions in Test) += Tests.Argument(TestFrameworks.ScalaTest,"-h","target/html-report")
val gitCommitString = SettingKey[String]("gitCommit")
gitCommitString := git.gitHeadCommit.value.getorElse("Not Set")
lazy val root = (project in file("."))
.enablePlugins(BuildInfoPlugin)
.enablePlugins(JavaAgent)
.settings(
buildInfoKeys := Seq[BuildInfoKey](version,gitCommitString),buildInfoPackage := "buildInfo",buildInfoOptions += BuildInfoOption.ToMap,buildInfoOptions += BuildInfoOption.ToJson,releaseIgnoreUntrackedFiles := true,javaAgents += "io.kamon" % "kanela-agent" % "1.0.9" % "runtime"
)
assemblyMergeStrategy in assembly := {
case PathList(ps @ _*) if ps.last == "Log4j2Plugins.dat" => Log4j2MergeStrategy.plugincache
case file =>
val defaultStrategy = (assemblyMergeStrategy in assembly).value
defaultStrategy(file)
}
assemblyOutputPath in assembly := file(target.value / "some" / name.value + ".jar")
test in assembly := {}
// Docker image generation and publishing to ECR
val currentBranch = Def.setting {
git.gitCurrentBranch.value.replaceAll("/","_")
}
val mainBranch = Def.setting {
currentBranch.value match {
case _@("develop"|"master") => true
case _ => false
}
}
import com.amazonaws.regions.{Region,Regions}
enablePlugins(EcrPlugin)
region in Ecr := Region.getRegion(Regions.US_EAST_1)
repositoryName in Ecr := s"${organization.value}/${name.value}"
localDockerImage in Ecr := s"${(repositoryName in Ecr).value}:local"
repositoryTags in Ecr := {
if(mainBranch.value) {
Seq("latest",version.value)
} else {
Seq(currentBranch.value)
}
}
push in Ecr := ((push in Ecr) dependsOn (createRepository in Ecr,login in Ecr,DockerKeys.docker)).value
enablePlugins(DockerPlugin)
dockerfile in docker := {
// The assembly task generates a fat JAR file
val artifact: File = assembly.value
val artifactTargetPath = s"/app/${artifact.name}"
new Dockerfile {
from("openjdk:8u131-jre-alpine")
add(artifact,artifactTargetPath)
entryPoint("java","-jar",artifactTargetPath)
}
}
buildOptions in docker := BuildOptions(cache = false)
imageNames in docker := Seq(ImageName((localDockerImage in Ecr).value))
// Custom release process
import ReleaseTransformations._
releaseCommitMessage := s"Setting version to ${(version in ThisBuild).value} [ci skip]"
releaseProcess := {
if(mainBranch.value) {
Seq[ReleaseStep](
checkSnapshotDependencies,inquireversions,runTest,setReleaseVersion,commitReleaseVersion,tagrelease,releaseStepTask(AssemblyKeys.assembly),releaseStepTask(push in Ecr),setNextVersion,commitNextVersion,pushChanges
)
} else {
Seq[ReleaseStep](
checkSnapshotDependencies,releaseStepTask(push in Ecr)
)
}
}
resolvers ++= Seq(
// someOrg resolvers
"version99 Empty loggers" at "https://version99.qos.ch",Resolver.bintrayRepo("streetcontxt","maven")
)
lazy val env = System.getenv()
credentials += Credentials(// some creds)
plugin.sbt :
logLevel := Level.Warn
resolvers += "Flyway" at "https://flywaydb.org/repo"
resolvers += Resolver.url(
"idio",url("https://dl.bintray.com/idio/sbt-plugins")
)(Resolver.ivyStylePatterns)
resolvers += Resolver.bintrayIvyRepo("sbt","sbt-plugin-releases")
resolvers += someOrgResolvers
addSbtPlugin("org.scalastyle" %% "scalastyle-sbt-plugin" % "1.0.0")
addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.9.0")
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.5")
//addSbtPlugin("org.idio" % "sbt-assembly-log4j2" % "0.1.1")
addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.7.0")
addSbtPlugin("se.marcuslonnberg" % "sbt-docker" % "1.4.1")
addSbtPlugin("com.github.gseitz" % "sbt-release" % "1.0.8")
addSbtPlugin("com.mintbeans" % "sbt-ecr" % "0.9.0")
addSbtPlugin("com.lightbend.sbt" % "sbt-javaagent" % "0.1.6")
//addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.7.6")
addSbtPlugin("com.typesafe.sbt" % "sbt-git" % "0.9.3")
addSbtPlugin("com.waioeka.sbt" % "cucumber-plugin" % "0.2.1")
build.properties
:
sbt.version = 1.4.7
但没有得到任何有用的东西。
更新:
按照@mp-korstanje 的建议,我将 groupId 更改为 io.cucumber
,将版本更改为 2.0.1
,它启动了套件,但现在一些套件因错误而中止,这是没有意义的:
[error] Test suite someorg.api.route.VersionRoutesTest Failed with java.lang.NoClassDefFoundError: akka/testkit/package$TestDuration$.
[error] This may be due to the ClassLoaderLayeringStrategy (ScalaLibrary) used by your task.
[error] To improve performance and reduce memory,sbt attempts to cache the class loaders used to load the project dependencies.
[error] The project class files are loaded in a separate class loader that is created for each test run.
[error] The test class loader accesses the project dependency classes using the cached project dependency classloader.
[error] With this approach,class loading may fail under the following conditions:
[error]
[error] * Dependencies use reflection to access classes in your project's classpath.
[error] Java serialization/deserialization may cause this.
[error] * An open package is accessed across layers. If the project's classes access or extend
[error] jvm package private classes defined in a project dependency,it may cause an IllegalAccessError
[error] because the jvm enforces package private at the classloader level.
[error]
[error] These issues,along with others that were not enumerated above,may be resolved by changing the class loader layering strategy.
[error] The Flat and ScalaLibrary strategies bundle the full project classpath in the same class loader.
[error] To use one of these strategies,set the ClassLoaderLayeringStrategy key
[error] in your configuration,for example:
[error]
[error] set root / Test / classLoaderLayeringStrategy := ClassLoaderLayeringStrategy.ScalaLibrary
[error] set root / Test / classLoaderLayeringStrategy := ClassLoaderLayeringStrategy.Flat
[error]
[error] See ClassLoaderLayeringStrategy.scala for the full list of options.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。