微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

NoSuchMethodError:cucumber.api.scala.ScalaDsl.$init 在 scala/sbt ugrade 之后

如何解决NoSuchMethodError:cucumber.api.scala.ScalaDsl.$init 在 scala/sbt ugrade 之后

我将 Scala2.11.8 升级2.12.4,将 sbt0.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.sbtbuild.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

我浏览了最热门的谷歌链接,如 thisthis

但没有得到任何有用的东西。

更新:

按照@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 举报,一经查实,本站将立刻删除。