【发布时间】:2022-07-02 12:24:18
【问题描述】:
我的 Scala 项目在 slf4j 上有一个 libraryDependency,因为我使用 API 进行日志记录。我还想在从 sbt 或 IntelliJ 运行时查看日志输出,包括 runMain 的应用程序和来自 sbt 的 testOnly 单元测试。因此在 logback-classic 上还有一个 libraryDependency。但是,由于以下约定,我不希望发布第二个依赖项。当有人使用我发布的库时,不应该自动引入传递依赖。应该怎么做?我不想向用户解释如何手动排除传递依赖,因为他们可能正在使用任意数量的不同工具。但是,如果可能的话,logback-classic 应该继续包含在组装好的 jar 中。似乎 exclude() 不是答案。
“诸如库或框架之类的嵌入式组件不应声明对任何 SLF4J 绑定/提供程序 [如 logback-classic] 的依赖,而应仅依赖 slf4j-api。当库声明对特定绑定的传递依赖时,该绑定被强加于最终用户否定 SLF4J 的目的。请注意,声明对绑定的非传递依赖,例如用于测试,不会影响最终用户。
【问题讨论】:
-
我建议你阅读this article。它适用于 maven,但 sbt 是相似的。
% Test、% Provided依赖或exclude似乎合适,但您可以选择方式。 -
唔。我不认为这些对我有用。涉及应用程序(即对象入口点扩展应用程序),我希望从 github 下载项目并运行应用程序的人查看日志记录,因此测试似乎不够。似乎已提供意味着项目的用户(来自 github)必须提供日志库(不需要),或者它可以作为非托管资源包含,但最终会出现在已发布的 jar 中(不需要)。非传递性会很好!我认为它可能需要在发布 <<= 中使用某种“(dependencyClasspath)。
-
也许我应该通过 pomPostProcess 修改生成的 POM。我会试试看。
-
pomPostProcess 工作正常,并且在构建 POM 文件时可以过滤掉 logback-classic。但是,当使用 publishLocal 时,尽管设置了 publishMavenStyle := true,但仍会创建一个 ivy.xml 文件。当该本地发布的项目用作依赖项时,似乎会参考 ivy 文件而不是 POM 文件,并且返回对 logback-classic 的依赖项。这不是一个很好的选择,但清理该文件也会很棒。有谁知道如何在创建文件 ivy.xml 时对其进行编辑?到目前为止,ivySbt 还没有奏效。