如何解决具有不同包装常春藤类型的sbt中的依赖关系?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何解决具有不同包装常春藤类型的sbt中的依赖关系?相关的知识,希望对你有一定的参考价值。

在我的例子中,我需要解决一个依赖,其工件没有传统的jar作为包装类型,而是maven-plugin(更具体地说,我感兴趣的工件是Maven插件)。在Maven土地上,这是通过<packaging> XML标签指定的。

当我添加插件时,我的项目依赖于sbt构建,sbt成功更新了项目,但已解析的依赖项不在类路径中。如何让sbt将工件添加到我的类路径中,以便依赖于这种依赖的代码编译?

我用来将maven插件添加到构建中的代码:

libraryDependencies += "net.alchim31.maven" % "scala-maven-plugin" % "3.3.1"
答案

有两个原因导致sbt没有将所需的工件添加到类路径中,因此编译失败。

第一个原因是,默认情况下,sbt只识别包装类型有限的工件(jarbundle和更多)。为了告诉sbt我们对包装类型为maven-plugin的工件感兴趣,我们需要通过以下方式明确告诉我们需要哪些工件:

libraryDependencies += ("net.alchim31.maven" % "scala-maven-plugin" % "3.3.1")
  .withExplicitArtifacts(Vector("scala-maven-plugin", "maven-plugin", "jar"))

一旦我们完成了这个,我们可以通过在consoleProject中运行以下代码来确认sbt确实得到了我们的工件:

Keys.update.in(myScope).in(myProject).eval.allFiles
  .find(_.getAbsolutePath.contains("net"))

请注意,myScope必须是CompileTestRuntime(通常是Compile)并且myProject必须是您已声明依赖项目的项目的引用。如果一切顺利,上一次操作的结果将是Some(...) ,表明该工件确实已被解决和检测到。

但是,我们还没有完成。如果我们运行myProject/dependencyClasspath,这次来自sbt shell,我们将不会在那里看到我们的工件。这是第二步所需的步骤:我们需要将新的包装类型添加到classpathTypes,以便sbt将工件添加到我们的编译类路径中。

classpathTypes += "maven-plugin"

完成所有这些后,我们应该运行myProject/dependencyClasspath并看到我们的工件存在。

但故事还没有结束,我们进入“虫子”领域。 Sbt不会自动将classpathTypes中的打包类型添加到pom配置中,该配置负责声明pom文件中的依赖项。请注意,否则您的应用程序将因ClassNotFoundException或类似问题而失败,因为并非所有依赖工件都已解析和分类。

因此,为了拥有一个有效的应用程序,您需要自己完成:

makePomConfiguration :=
  makePomConfiguration.value.withIncludeTypes(classpathTypes.value)

事实上,这不是默认情况下完成的,它只是1.x中的sbt错误。

以上是关于如何解决具有不同包装常春藤类型的sbt中的依赖关系?的主要内容,如果未能解决你的问题,请参考以下文章

如何在SBT中发布之前检查工件是否存在

我们应该如何解决 Spark 的 sbt 文件中的本地依赖关系

Maven插件和依赖关系与IT的关系

使用外部常春藤进行 sbt 构建

常春藤无法解决

常春藤解决某些用户失败