【问题标题】:SBT: Can I dynamically add a library dependency based on another one?SBT:我可以动态添加基于另一个库的依赖吗?
【发布时间】:2015-09-12 05:35:15
【问题描述】:

如果项目 libraryDependencies 包含一组特定的其他库之一(需要runtime aspectj weaving),这样我就可以在创建 Docker 映像(使用 sbt-docker)时引用下载的依赖文件。

Kamon 将 aspectj weaver 指定为“提供的”依赖项,但 AFAICT 不能从依赖这些 Kamon 库之一的项目中传递。

问题是我无法在我的插件中覆盖libraryDependencies,因为当时实际项目还没有添加任何依赖项,所以我得到一个空列表。所以我必须在项目设置了libraryDependencies 之后但在 SBT 开始下载依赖项之前添加这个依赖项。

这可能吗?我可以覆盖其他设置来实现此目的吗?

我的备份是以某种方式自己从插件中的任务下载那个aspectj jar。是否有一些 SBT 子系统可供我使用,以便 jar 文件针对(或下载到)本地 Ivy 存储库进行解析?

【问题讨论】:

  • 我不确定,这对你有用吗?在设置它的库依赖项后显式启用项目上的插件。即使这样可行,如果它能自动神奇地工作,那就太好了,我同意。
  • 这行得通。问题是 libraryDependencies 需要由项目设置,因此我无法从插件中检查它,因为它将在项目添加其内容之前运行(在显式启用它之后)。但是allDependencies 是一个计算属性,表示libraryDependenciesbuildDependencies 的组合,因此项目覆盖它的机会很小,让我在update 出现下载之前更改后处理libraryDependencies部门。有点破解,但它的工作原理:)

标签: scala sbt


【解决方案1】:

我使用allDependencies 解决了这个问题。这是(缩写的)代码:

object AspectjWeaverPlugin extends AutoPlugin {
  private val aspectjWeaver = "org.aspectj" % "aspectjweaver" % "1.8.5" % "runtime"
  private val aspectjWeaverLibs = List("kamon-spray", "kamon-akka", "kamon-scala")

  val aspectjWeaverJarFile = taskKey[Option[File]]("The aspectj weaver jar file if it exists on the classpath.")

  override def requires = plugins.JvmPlugin
  override def projectSettings = Seq(
    allDependencies := {
      allDependencies.value ++ libraryDependencies.value.find(module => aspectjWeaverLibs.contains(module.name)).map(_ => aspectjWeaver)
    },
    aspectjWeaverJarFile := {
      val classpath = (managedClasspath in Runtime).value

      classpath.find(_.data.getName == s"${aspectjWeaver.name}-${aspectjWeaver.revision}.jar").map(_.data)
    }
  )
}

现在我可以使用这个带有可选 aspectj weaver jar 文件的新任务,在 runre-start 以及我使用 sbt-docker 生成的 Docker 映像中设置必要的 -javaagent:... 选项。

仍然很好奇这是否是最好的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    • 2013-11-16
    • 1970-01-01
    相关资源
    最近更新 更多