加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – SBT:我可以基于另一个动态添加库依赖项吗?

发布时间:2020-12-16 10:00:07 所属栏目:安全 来源:网络整理
导读:我正在尝试构建一个插件,它在特定库(aspectj weaver JVM代理)上添加运行时依赖项,如果项目库依赖项包含某组其他库(其中一个需要运行时方面编织的Kamon库)之一,那么然后我可以在创建Docker镜像时引用下载的依赖文件(使用sbt-docker). Kamon将aspectj weaver指
我正在尝试构建一个插件,它在特定库(aspectj weaver JVM代理)上添加运行时依赖项,如果项目库依赖项包含某组其他库(其中一个需要运行时方面编织的Kamon库)之一,那么然后我可以在创建Docker镜像时引用下载的依赖文件(使用sbt-docker).

Kamon将aspectj weaver指定为“提供”依赖项,但AFAICT指定那些依赖于其中一个Kamon库的项目不能传递.

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

这可能吗?是否有其他设置可以覆盖以实现此目的?

我的备份是以某种方式从我的插件中的任务下载那个aspectj jar.是否有一些我可以使用的SBT子系统,以便jar文件被解析(或下载到)本地Ivy仓库?

解决方法

我用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文件的新任务来设置运行,重新启动和我用sbt-docker生成的Docker镜像中所需的-javaagent:…选项.

仍然好奇这是否是最好的方式来做到这一点.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读