java - 为什么 pom.xml/maven 中有排除依赖项的依赖项的选项?

标签 java apache maven build pom.xml

我一直在阅读Introduction to POM并且不明白以下内容。在 pom.xml 中,您可以配置依赖项,假设我们配置依赖项 maven-embedder。然后,您可以排除依赖项的依赖项,假设我们要从 maven-embedder 依赖项中排除 maven-core 。在什么情况下您愿意这样做?如果它不具有所有依赖项,这不会导致您的依赖项停止工作吗?我显然在这里遗漏了一 block 拼图:)

  <dependencies>
    <dependency>
      <groupId>org.apache.maven</groupId>
      <artifactId>maven-embedder</artifactId>
      <version>2.0</version>
      <exclusions>
        <exclusion>
          <groupId>org.apache.maven</groupId>
          <artifactId>maven-core</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    ...
  </dependencies>

示例:https://maven.apache.org/pom.html#Exclusions

最佳答案

也许一个例子会有所帮助。我们最近有一个这样的用例。

我们的一个依赖项(它非常大,但我们只需要几个独立的方法)依赖于 Rhino ,但我们不会去接近代码中与 Rhino 相关的部分。

在我们的模块中,我们包括 YUI Compressor 。无论出于何种原因,这两个库都具有完全相同的完全限定类名,但方法签名略有不同。

结果是,Rhino 的传递依赖破坏了之前可用的功能。 YUI 压缩机抛出运行时异常,因为该方法的签名与预期不同。

解决方案是明确排除 Rhino。

<小时/>

一般来说,您不必排除依赖项。它通常是由于模块设计不当造成的。

例如,如果一个模块变得太大,那么大多数用户可能只需要其类或方法的一小部分,因此并非严格需要其所有依赖项。在这种情况下,库设计者可能应该将模块分解为一组更小的模块。

在两个不同的库中拥有相同的完全限定类名似乎也是一个糟糕的设计决策。

关于java - 为什么 pom.xml/maven 中有排除依赖项的依赖项的选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53278552/

相关文章:

java - 为什么在 web.xml 中标记为 CONFIDENTIAL 的 URL 没有被 HttpServletResponse.encodeURL() 使用 HTTPS 重写?

java - 在线 Java 的 JSON 解析器

apache - Laravel 服务在本地主机上收到 ERR_CONNECTION_REFUSED

php - Docker php :5. 6-Apache 开发环境缺少卷装载权限

java - 如何从外部 Maven 依赖项中添加排除某些包

hibernate - 添加 javaee-web-api 依赖后出现 ClassFormatError 异常

java - 在 Android Studio 中添加库依赖

java - 尝试从 java 中非常大的图像文件读取区域时出错

java - 从 Java 强制删除 Windows 上的文件

Apache 在步骤 NAMESPACE 失败