如何解决sbt中具有不同包装常春藤类型的依赖关系?
在我的例子中,我需要解决一个依赖项,其工件没有传统的jar
作为打包类型,而是maven-plugin
(更具体地说,我感兴趣的工件是Maven插件)。这在Maven land中是通过<packaging>
XML标签指定的。如何解决sbt中具有不同包装常春藤类型的依赖关系?
当我添加插件时,我的项目依赖于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"))
一旦我们做到了这一点,我们可以确认SBT通过运行下面的代码在consoleProject
确实让我们的神器:
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
,看看我们的神器存在。
但故事还没有结束,在这里我们进入“bug”领域。 Sbt不会自动将classpathTypes
中的打包类型添加到负责在pom文件中声明依赖关系的pom配置中。请注意,否则,您的应用程序将因ClassNotFoundException
或类似问题而失败,因为并非所有相关工件都已解析和分类。
所以为了有一个工作的应用程序,你需要自己做:
makePomConfiguration := makePomConfiguration.value.withIncludeTypes(classpathTypes.value)
,这是不是默认设置的事实,它只是在1.x中的SBT错误
以上是 如何解决sbt中具有不同包装常春藤类型的依赖关系? 的全部内容, 来源链接: utcz.com/qa/266423.html