如何解决具有不同包装常春藤类型的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只识别包装类型有限的工件(jar
,bundle
和更多)。为了告诉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
必须是Compile
,Test
或Runtime
(通常是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中的依赖关系?的主要内容,如果未能解决你的问题,请参考以下文章