java - 强制 Maven 只使用一级依赖

标签 java maven dependencies

我有一个 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/

相关文章:

java - 当组更改时如何更改细节带颜色?

java - new type[0] 和 null 之间的区别 - java

java - Eclipse Kepler (4.3) JUnit (3.81) View 不显示测试结果,使用 maven-archetype-quickstart 创建的代码

java - jenkins在这个环境下没有提供编译器

PHP:处理项目中的文件版本依赖性

c++ - 如何从依赖文件(.d)中消除某些(非系统) header ?

java - Android 用户界面停止响应

尝试连接到 HBase 时出现 java.lang.NumberFormatException

spring-boot - 具有参数化的Dockerfile:失败并显示XXX

javascript - 无法安装 node-sass 依赖项