为什么在 pom.xml / maven 中有排除依赖项的选项?
Why is there the option to exclude a dependency of a dependency in pom.xml / maven?
我一直在阅读 Introduction to POM 但不明白以下内容。在pom.xml中可以配置依赖,假设我们配置依赖maven-embedder
。然后您可以排除依赖项的依赖项,假设我们要从 maven-embedder
依赖项中排除 maven-core
。你想在什么情况下这样做?如果它没有所有依赖项,那不会导致您的依赖项停止工作吗?我显然在这里遗漏了一块拼图:)
<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>
这里的技巧是您可能想使用另一个版本的传递依赖,而不是默认版本。换句话说,您可以替换甚至禁用某些默认行为部分。
也许一个例子会有所帮助。我们最近有一个用例。
我们的一个依赖项(相当大,但我们只需要几个独立的方法)依赖于 Rhino,但我们不会靠近 Rhino-touching 部分的代码。
在我们的模块中,我们包括 YUI Compressor。无论出于何种原因,这两个库都具有完全相同的完全限定 class 名称,但方法签名略有不同。
结果是,包括 Rhino 的传递依赖性破坏了以前工作的功能。 YUI Compressor 抛出运行时异常,因为该方法的签名与预期不同。
解决方案是明确排除 Rhino。
一般来说,您不必排除依赖项。它通常是由于模块设计不当造成的。
例如,如果一个模块变得太大,那么大多数用户可能只需要他们的 classes 或方法的一小部分,因此并不是所有的依赖项都是严格需要的。在这种情况下,库设计者可能应该将模块分解为一组更小的模块。
在两个不同的库中使用相同的完全限定 class 名称似乎也是一个糟糕的设计决策。
我一直在阅读 Introduction to POM 但不明白以下内容。在pom.xml中可以配置依赖,假设我们配置依赖maven-embedder
。然后您可以排除依赖项的依赖项,假设我们要从 maven-embedder
依赖项中排除 maven-core
。你想在什么情况下这样做?如果它没有所有依赖项,那不会导致您的依赖项停止工作吗?我显然在这里遗漏了一块拼图:)
<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>
这里的技巧是您可能想使用另一个版本的传递依赖,而不是默认版本。换句话说,您可以替换甚至禁用某些默认行为部分。
也许一个例子会有所帮助。我们最近有一个用例。
我们的一个依赖项(相当大,但我们只需要几个独立的方法)依赖于 Rhino,但我们不会靠近 Rhino-touching 部分的代码。
在我们的模块中,我们包括 YUI Compressor。无论出于何种原因,这两个库都具有完全相同的完全限定 class 名称,但方法签名略有不同。
结果是,包括 Rhino 的传递依赖性破坏了以前工作的功能。 YUI Compressor 抛出运行时异常,因为该方法的签名与预期不同。
解决方案是明确排除 Rhino。
一般来说,您不必排除依赖项。它通常是由于模块设计不当造成的。
例如,如果一个模块变得太大,那么大多数用户可能只需要他们的 classes 或方法的一小部分,因此并不是所有的依赖项都是严格需要的。在这种情况下,库设计者可能应该将模块分解为一组更小的模块。
在两个不同的库中使用相同的完全限定 class 名称似乎也是一个糟糕的设计决策。