我试图构建一个插件,如果项目libraryDependencies
包含一组特定的其他库(其中一个库),则会在特定库(aspectj weaver JVM代理)上添加运行时依赖项。需要运行时aspectj编织的Kamon库,这样我就可以在创建Docker镜像时引用下载的依赖文件(使用sbt-docker)。
Kamon将aspectj weaver指定为"提供"依赖但AFAICT那些依赖于其中一个Kamon库的项目无法传递。
问题是我无法覆盖插件中的libraryDependencies
,因为当时实际项目还没有添加任何依赖项,所以我得到一个空列表。因此,在项目设置libraryDependencies
之后但在SBT开始下载依赖项之前,我必须以某种方式添加此依赖项。
这可能吗?是否有其他设置可以覆盖以实现此目的?
我的备份是以某种方式从我的插件中的任务下载那个aspectj jar。是否有一些我可以使用的SBT子系统,以便jar文件被解析(或下载到)本地Ivy仓库?
答案 0 :(得分:3)
我用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文件的新任务在-javaagent:...
,run
以及我生成的Docker镜像中设置必要的re-start
选项SBT-搬运工。
仍然好奇这是否是最好的方法。