我目前正在从Flyway中删除Spring依赖项。在将来,虽然可能需要其他类型的依赖项来支持用户子集(例如JBoss VFS支持)。
哪种支持可选依赖项的最佳方法(Maven POM中的optional = true)?
解决方案的质量将是:
答案 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就是一个很好的例子。