在sbt任务中加载依赖类

问题描述 投票:0回答:1

我想在所有 IT 测试之前从 scala 对象运行嵌入式 kafka 作为 Tests.Setup。

所以,我有类似的东西

Test / testOptions += Tests.Setup { loader => 
  loader.loadClass("io.github.embeddedkafka.schemaregistry.EmbeddedKafka$").getMethod("start").invoke(null)

问题是找不到。我检查过

loader.getDefinedPackages
并且没有来自 io.github 的类。 如何从依赖项访问类?

scala reflection sbt
1个回答
0
投票

奇怪的是,测试类加载器无法从依赖项加载类。您应该提供如何添加依赖项和运行测试的更多详细信息。通常,如果您将像

libraryDependencies += "io.github..." %% ... % ...
这样的依赖项添加到(普通)
build.sbt
并运行像
sbt test
这样的测试,那么
Test / testOptions += Tests.Setup { loader =>  loader.loadClass...
中的代码
build.sbt
应该可以工作。

无论如何,您可以添加到

project/build.sbt

libraryDependencies += "io.get-coursier" %% "coursier" % "2.1.9"

并以普通方式书写

build.sbt

Test / testOptions += Tests.Setup { loader =>

  import coursier._

  val files = Fetch()
    .addDependencies(
      Dependency(Module(Organization("io.github..."), ModuleName("..." /*"..._2.13"*/)), "...version..."),
    )
    .run()

  val classLoader = new java.net.URLClassLoader(
    files.map(_.toURI.toURL).toArray,
    loader/*getClass.getClassLoader*//*null*/
  )

  classLoader.loadClass("...").getMethod("...").invoke(...)
}
© www.soinside.com 2019 - 2024. All rights reserved.