处理可选依赖项的最佳策略

时间:2012-04-01 19:11:01

标签: java maven dependencies

我目前正在从Flyway中删除Spring依赖项。在将来,虽然可能需要其他类型的依赖项来支持用户子集(例如JBoss VFS支持)。

哪种支持可选依赖项的最佳方法(Maven POM中的optional = true)?

解决方案的质量将是:

  • 最终用户的易用性(如果存在依赖性,则使用功能所需的最少工作量)
  • 开发人员易于使用(处理可选依赖项的代码应尽可能可读且简单明了)
  • 没有不必要的依赖项(如果某些最终用户不需要此功能,则无需引入依赖项)

2 个答案:

答案 0 :(得分:12)

我认为Maven的可选依赖功能非常有限。

http://maven.apache.org/guides/introduction/introduction-to-optional-and-excludes-dependencies.html

默认情况下,可选依赖项不会被拉下(作为传递依赖项)。但是,如果您的用户需要使用这些可选功能,则必须在POM中明确声明缺少的依赖项。

就个人而言,我不清楚这对用户有何帮助....我想POM中的可选依赖项会记录代码所依赖的版本。然而,并非所有用户都会阅读POM,所有他们将看到的是“NoClassDef Found”错误: - (

我最后的观察是,这是一种罕见的情况,其中像ivy这样的依赖管理器提供了更大的灵活性。常春藤有一个叫做“配置”的概念。模块作者可以组合不同的依赖关系组合,例如“with-spring”或“without-spring”。

答案 1 :(得分:1)

可以选择:

  • 将项目保留在一个模块中;并使用可选的依赖项。
  • 将项目拆分为多个模块;其中每个模块对任何库都有(非可选)依赖;

我认为在大多数情况下,第一个更有意义:用户需要找出更少的工件。通常,他们必须在他们的pom中添加更少的新依赖项。除非支持第三方项目的代码很大,否则这将有助于改善maven下载时间(减少往返次数)。使用后一种方法,您可以发现自己处于用户定义了自己的一组版本的尴尬境地,但仅限于某些第三方依赖项。

我更喜欢在pom中看到可选的依赖项(我有时会查看它构建的版本)。确实有些人可能看不到。我认为网站上的复制和粘贴pom片段是最好的解决方案。例如,如果您有一个关于Spring集成的页面,您可以将相关的pom片段放在该页面上。

我建议将非自由依赖项(或任何不易解析的东西)保存在单独的maven模块中,以便贡献者始终能够构建主要工件。 (我在Quartz中遇到了这个问题,IIRC对Oracle JDBC jar有一个可选的依赖)。

编辑:如果您担心用户看到NoClassDefFoundErrors,在尝试使用它之前检查该类是否可以解决是不会有任何损害的。例如,您可以发现异常,并抛出一条更有意义的错误消息,指出用户指向文档。 SLF4J就是一个很好的例子。

相关问题