为什么 Maven 依赖排除不会导致编译错误?
Why Maven dependency exclusion would not cause compile error?
刚接触Maven,可以理解<exclusion>
标签的用例,但不知道为什么不会导致编译错误:
<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>
...
这是否只有当您对 maven-core 有另一个直接依赖时才有可能?否则,应该会发生编译错误。 (假设 maven-core
在 maven-embedder
某处使用)
错误不会在编译时抛出,如果你使用依赖maven-core的任何特性,它会在运行时抛出
您正在从该特定依赖项中排除该工件,但它可能会从另一个依赖项中提取出来。使用 something mvn dependency:tree -Dverbose -Dincludes=maven-core
应该会告诉你还有什么引入了依赖性。 The Maven Enforcer plugin can also help exclude transitive dependencies.
有不同的可能性:
- 正如 Carl 所说:检查您的
dependency:tree
是否没有从其他地方引入依赖项。
- 有可能根本没有使用
maven-core
,即使 maven-embedder
确实使用了它:假设例如maven-embedder
有两个 类 A 和 B。你只使用 A,但 maven-core
只被 B 使用。然后(如果 A 和 B 不互相使用),你的项目可能完全独立于 maven-core
。 (附带说明:一些罐子在逻辑上应该是两个独立的罐子,但无论出于何种原因合并在一起 - 在我们的示例中,应该考虑将 A 和 B 放在单独的工件中)。
- 传递依赖项可能在编译时不是必需的,但在运行时会用到。
刚接触Maven,可以理解<exclusion>
标签的用例,但不知道为什么不会导致编译错误:
<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>
...
这是否只有当您对 maven-core 有另一个直接依赖时才有可能?否则,应该会发生编译错误。 (假设 maven-core
在 maven-embedder
某处使用)
错误不会在编译时抛出,如果你使用依赖maven-core的任何特性,它会在运行时抛出
您正在从该特定依赖项中排除该工件,但它可能会从另一个依赖项中提取出来。使用 something mvn dependency:tree -Dverbose -Dincludes=maven-core
应该会告诉你还有什么引入了依赖性。 The Maven Enforcer plugin can also help exclude transitive dependencies.
有不同的可能性:
- 正如 Carl 所说:检查您的
dependency:tree
是否没有从其他地方引入依赖项。 - 有可能根本没有使用
maven-core
,即使maven-embedder
确实使用了它:假设例如maven-embedder
有两个 类 A 和 B。你只使用 A,但maven-core
只被 B 使用。然后(如果 A 和 B 不互相使用),你的项目可能完全独立于maven-core
。 (附带说明:一些罐子在逻辑上应该是两个独立的罐子,但无论出于何种原因合并在一起 - 在我们的示例中,应该考虑将 A 和 B 放在单独的工件中)。 - 传递依赖项可能在编译时不是必需的,但在运行时会用到。