我有一个 Maven Java 项目。我不希望在编译项目时通过一连串的子依赖偶然满足我的项目依赖。当 maven 必须检查所有使用的依赖项并向 war 添加必要的库时,构建最终 war 对我来说是可以的,但是在编译代码时我想确保只使用直接依赖项。为什么?
假设我有两个依赖项:
<dependency>
<groupId>com.package</groupId>
<artifactId>module-1</artifactId>
</dependency>
<dependency>
<groupId>com.package</groupId>
<artifactId>module-2</artifactId>
</dependency>
对于我们的项目,module-1 和 module-2 的用途完全不同,但是在 module-2 的依赖树中的某处,使用了 module-1。我删除了 module-1 依赖项,但 maven 继续构建我的项目而没有编译错误,因为它从 module-2 子依赖项中解析了 module-1。这种变化没有引起注意。
一段时间后,我们决定删除模块 2,因为我们不需要它。很奇怪,但我们不能再编译使用模块 1 导入且未连接到模块 2 逻辑的类。
这是一个简单的案例,但在大型项目中,这可能会造成相当大的依赖性困惑。
最佳答案
您可以使用 Maven dependency plugin目标“dependency:analyze”为您提供所有未在当前模块上声明的已使用依赖项的报告(包括传递)。这样 Maven 仍然会使用传递依赖项(我猜没有办法绕过),但是你可以通过插件强制自己确保这些也被声明。它还会警告您不必要的依赖项。请注意,该插件会分析已编译的类。有时,您可能需要配置插件,因为有时它可能无法在编译时检测到需要依赖项,但在运行时则不需要,例如因为内联了一个常量。
关于java - 强制 Maven 只使用一级依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19382814/