马文排斥哲学 maven的发明目的是什么 除了修复库冲突之外,我是否应该排除任何依赖项 好的maven项目架构是什么样子的: 倾向于尽可能地排除 还是根据需要尽量少

马文排斥哲学 maven的发明目的是什么 除了修复库冲突之外,我是否应该排除任何依赖项 好的maven项目架构是什么样子的: 倾向于尽可能地排除 还是根据需要尽量少,maven,architecture,dependency-management,Maven,Architecture,Dependency Management,我不知道设计的原因,但我看到它在以下情况下使用: 我有一个库,它具有junit作为编译时依赖项,因此junit代码泄漏到了我的生产代码中 我有一个使用log4j的库。因为我使用的是slf4j,所以我使用依赖排除来摆脱硬连线日志框架,并使用slf4j-log4j桥接器,这样我最终可以登录到logback 在另一个例子中,我只使用了框架的一些特性,不需要所有的依赖项。因为它们一开始不是可选的,所以我使用了排除来保持我的类路径整洁 一般规则: 用它来摆脱破坏你身材的东西 扔掉你正在用其他东西代替的

我不知道设计的原因,但我看到它在以下情况下使用:

  • 我有一个库,它具有
    junit
    作为编译时依赖项,因此junit代码泄漏到了我的生产代码中
  • 我有一个使用
    log4j
    的库。因为我使用的是
    slf4j
    ,所以我使用依赖排除来摆脱硬连线日志框架,并使用
    slf4j-log4j
    桥接器,这样我最终可以登录到
    logback
  • 在另一个例子中,我只使用了框架的一些特性,不需要所有的依赖项。因为它们一开始不是可选的,所以我使用了排除来保持我的类路径整洁
一般规则:

  • 用它来摆脱破坏你身材的东西
  • 扔掉你正在用其他东西代替的东西
  • 扔掉你知道不需要的东西(可选)

  • 如果这些规则都不适用,那么就不要理会依赖关系;即时依赖关系可能会随着时间的推移而突然改变,它需要一些以前似乎多余的依赖关系,您的代码可能会意外中断。

    我不知道设计的原因,但我看到它在以下情况下使用:

    • 我有一个库,它具有
      junit
      作为编译时依赖项,因此junit代码泄漏到了我的生产代码中
    • 我有一个使用
      log4j
      的库。因为我使用的是
      slf4j
      ,所以我使用依赖排除来摆脱硬连线日志框架,并使用
      slf4j-log4j
      桥接器,这样我最终可以登录到
      logback
    • 在另一个例子中,我只使用了框架的一些特性,不需要所有的依赖项。因为它们一开始不是可选的,所以我使用了排除来保持我的类路径整洁
    一般规则:

  • 用它来摆脱破坏你身材的东西
  • 扔掉你正在用其他东西代替的东西
  • 扔掉你知道不需要的东西(可选)

  • 如果这些规则都不适用,那么就不要理会依赖关系;即时依赖关系可能会随着时间的推移而突然发生变化,它需要一些以前似乎多余的依赖关系,您的代码可能会意外中断。

    除了Aaron的答案之外:

    当依赖项的提供者做了一些错误的事情时,通常需要排除(例如,在他应该做的地方,没有使依赖项成为可选的,包括实际的日志记录后端(而不是api),或者使用了错误的作用域)

    唯一的例外是日志框架。看看亚伦的答案


    因此,如果您有特定的理由排除依赖项,请不要排除依赖项。

    除了Aaron的答案之外:

    当依赖项的提供者做了一些错误的事情时,通常需要排除(例如,在他应该做的地方,没有使依赖项成为可选的,包括实际的日志记录后端(而不是api),或者使用了错误的作用域)

    唯一的例外是日志框架。看看亚伦的答案


    因此,不,只有在您有特定理由排除依赖项时才排除它们。

    据我所知,您建议仔细检查所有依赖项树,并尽可能多地清理每个依赖项?@mykhayoladamovych:请不要这样做。只排除真正的问题。因此,我不会为你答案中的步骤3而烦恼,保持我的pom干净,保持类路径“原样”,对吗?@mykhayoladamovych:第三条规则完全是可选的。我更新了我的答案,使之更加清晰。你的前两个案例和blackbuild的答案是maven提供的要解决的问题的清晰示例。第三种情况是我想在这里讨论的。如果我只使用某个库中的一部分功能,我是否应该排除所有其他功能(并在构建配置中引入一些混乱,使支持变得更复杂等等)?Maven exclude可以做到这一点,但它是为这个而设计的吗?这里的好风格是什么?据我所知,你建议仔细检查所有依赖项树,并尽可能多地清理每个依赖项?@mykhayoladamovych:请不要这样做。只排除真正的问题。因此,我不会为你答案中的步骤3而烦恼,保持我的pom干净,保持类路径“原样”,对吗?@mykhayoladamovych:第三条规则完全是可选的。我更新了我的答案,使之更加清晰。你的前两个案例和blackbuild的答案是maven提供的要解决的问题的清晰示例。第三种情况是我想在这里讨论的。如果我只使用某个库中的一部分功能,我是否应该排除所有其他功能(并在构建配置中引入一些混乱,使支持变得更复杂等等)?Maven exclude可以做到这一点,但它是为这个而设计的吗?这里的好风格是什么?