在 sbt 中添加仅编译时依赖项

Posted

技术标签:

【中文标题】在 sbt 中添加仅编译时依赖项【英文标题】:Add a compile time only dependency in sbt 【发布时间】:2014-02-26 05:29:25 【问题描述】:

我想向一个仅用于编译的 sbt 项目添加一个依赖项。它也不应该在运行时类路径上,也不应该在已发布的 POM 中以任何形式可见。

这个想法是添加一个仅存根的库 (OrangeExtensions),以便项目可以在任何平台上编译,而不仅仅是 OS X。

有没有可能是这样的:

libraryDependencies += "com.yuvimasory" % "orange-extensions" % "1.3.0" % ???

?

【问题讨论】:

如果你的代码依赖于OrangeExtensions(没有它就无法编译),我会说它在运行时也是必需的。 @RadoBuransky OrangeExtensions 只是 Apple 在 OS X 上由 Java 提供的库的存根版本。当不在 Mac 上时,我围绕它设计的 API 不会调用这个 API。为了在非 Mac 上编译项目,您需要存根。显然存根只是一个编译帮助。 您可以使用“provided”,但它会显示出来。 【参考方案1】:

您可以为此创建一个自定义dependency configuration(实际上,当您在项目中使用私有宏时,这变得非常普遍,我希望 SBT 提供一个)。

build.sbt:

// a 'compileonly' configuation
ivyConfigurations += config("compileonly").hide

// some compileonly dependency
libraryDependencies += "commons-io" % "commons-io" % "2.4" % "compileonly"

// appending everything from 'compileonly' to unmanagedClasspath
unmanagedClasspath in Compile ++= 
  update.value.select(configurationFilter("compileonly"))

该依赖不会出现在publish和朋友生成的pom.xml中。

几乎有这样的配置可用:provided 配置。除了provided 最终在pom.xml 中作为provided 范围的依赖项。另外,provided 的意思是“运行时本身在运行时提供这个”,而不是“在运行时不需要这个”。

【讨论】:

这不适用于我使用 'dependsOn(macrosProject % "compileonly")' 的 SBT 宏项目(否则 as per the docs)。有什么想法为什么不呢?子项目在编译时不可用。 在使用宏工作时,这适用于我的某些库(scala-reflections),但不适用于其他库(snakeyaml)。我不知道为什么,但我最终使用 pomPostProcess 来绕过落后者,请参阅:(***.com/a/13880582/455581)。希望这可以帮助其他人在排除此类时被编译时错误阻塞。 注意 sbt1.0 需要一个大写的配置项。使用 ` val CompileOnly = config("compileonly"); ivyConfigurations += CompileOnly.hide;` 见:***.com/a/35486527/622016

以上是关于在 sbt 中添加仅编译时依赖项的主要内容,如果未能解决你的问题,请参考以下文章

sbt / maven是否包含jar文件中的完整依赖项?

使用 org.apache.hadoop/* 依赖项离线编译 sbt 的问题

Sbt Plugin 添加依赖到 project/build.sbt

添加 scala-compiler.jar 作为运行时依赖项

SBT dependsOn RootProject:不编译依赖项

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