在 SBT 中无需编译即可获取完整的类路径

Get full classpath without compilation in SBT

我需要一段使用 SBT 的代码,可能是内部代码,它在不调用编译的情况下获取 SBT 项目的完整类路径。通常我会使用“Runtime / fullClasspath”,但这需要先编译项目。有没有办法在不触发编译的情况下获取完整的类路径?我认为 build.sbt 单独确定了类路径,编译(理论上)是不必要的。

我在SBT gitter channel 上问过,那里也提到使用dependencyClasspath。 dependencyClasspath 不需要编译根项目,但它确实需要编译所有依赖项。所以这对我来说还没有解决。我正在寻找 运行 根项目所需的完整类路径,而不编译其组成部分。

我对任何解决此问题的方法都很感兴趣,所以如果有任何牵强附会的解决方法,也欢迎使用。

我现在拥有的一个例子:

Global / printMainClasspath := {
    val paths = (rootProject / fullClasspath).value
    val joinedPaths = paths
        .map(_.data)
        .mkString(pathSeparator)
    println(joinedPaths)
}

这部分起作用,它创建了一个打印完整类路径的任务“printMainClasspath”。但是如果我在 sbt shell 中调用它,它会先编译代码。我希望在不调用项目的完整编译的情况下打印类路径。理想情况下,只编译所有组成项目的所有 build.sbt。有办法吗?

val dryClasspath = taskKey[Seq[File]]("dryClasspath")

dryClasspath := {
  val data = settingsData.value
  val thisProj = thisProjectRef.value
  val allProjects = thisProj +: buildDependencies.value.classpathTransitiveRefs(thisProj)
  val classDirs = allProjects.flatMap(p => (p / Runtime / classDirectory).get(data))
  val externalJars = (Runtime / externalDependencyClasspath).value.map(_.data)
  classDirs ++ externalJars
}