如果项目libraryDependencies包含一组其他库(需要运行时aspectj编织的Kamon库之一)中的一个,我正在尝试构建一个插件,它可以在特定库( aspectj weaver JVM代理)上添加一个运行时依赖项,这样我就可以在创建Docker镜像时引用下载的依赖文件(使用sbt-docker)。
Kamon将aspectj编织器指定为“提供的”依赖项,但AFAICT不能从依赖于这些Kamon库之一的项目中过渡地获得这些依赖项。
问题是我不能在我的插件中覆盖libraryDependencies,因为当时实际的项目还没有添加任何依赖项,所以我得到了一个空列表。因此,在项目设置了libraryDependencies之后,但在SBT开始下载依赖项之前,我必须以某种方式添加此依赖项。
这个是可能的吗?有没有其他可以覆盖的设置来实现这一点?
我的备份是自己从插件中的任务下载aspectj jar。有没有什么SBT子系统可以用来解决这个问题,这样jar文件就可以解析到(或下载到)本地的Ivy存储库?
发布于 2015-06-26 02:12:17
我用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文件,在run、re-start和我使用sbt-docker生成的Docker映像中设置必要的-javaagent:...选项。
我仍然想知道这是不是最好的方法。
https://stackoverflow.com/questions/31053276
复制相似问题