繁体   English   中英

使用Maven多模块项目时如何避免Java依赖地狱

[英]How to avoid Java dependency hell when using Maven multi-module projects

几天来,我一直在与Java Maven多模块项目的依赖项进行斗争。

由于监督太少,开发人员设法创造了一种情况,每个模块都可以自己编译,而不能作为一个整体一起编译。 这会导致各种错误。 找不到类,转换错误等。这些问题的原因似乎无法确定。

我的怀疑是Maven在类路径上放置了冲突的依赖关系。 我认为我们弄乱了Maven依赖关系,但是不管我不明白Maven如何成为多模块项目的如此差劲的框架。

现在我可以理解,Maven在将多个模块作为一个整体进行编译时会尝试做一些非常聪明的有用的事情,但是Maven是否不应该有一个选项可以将一个模块配置为与其他模块隔离? 有这样的选择吗? 为了避免这种依赖地狱?

还是Maven最佳实践是创建其他脚本(例如bash脚本),以便能够使用一个命令隔离地编译多个模块?

但是,这对于某些工具来说也是较差的解决方法,例如SonarQube要求能够在整个代码库上运行Maven以便在SonarQube中创建单个项目。

这会导致各种错误。 找不到类,转换错误等。这些问题的原因似乎无法确定。

您可以发布错误消息吗? 它将使您分析问题变得更加容易。 这可能是由于依赖性冲突引起的,但是如果没有更多信息,很难说。

现在我可以理解,Maven在将多个模块作为一个整体进行编译时会尝试做一些非常聪明的有用的事情,但是Maven是否不应该有一个选项可以将一个模块配置为与其他模块隔离? 有这样的选择吗? 为了避免这种依赖地狱?

我不明白这一点。 如果两个模块彼此不依赖,则它们的构建将是独立的。 如果一个模块依赖于另一个模块,并且由于版本冲突而导致其构建失败,则无论是与其他模块一起构建还是单独构建,此构建都会失败。

还是Maven最佳实践是创建其他脚本(例如bash脚本),以便能够使用一个命令隔离地编译多个模块?

Maven遵循“约定之上的约定”的理念,这意味着您遵循约定的次数越多,配置就越少,维护工作也就越少。 创建各种脚本违背了这一理念,而不是Maven的最佳实践。

要管理多模块项目中的依赖项冲突,通常需要一个带有pom.xml的父模块,其外观类似于

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>...</groupId>
    <artifactId>...</artifactId>
    <version>...</version>
    <packaging>pom</packaging>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>javax</groupId>
                <artifactId>javaee-web-api</artifactId>
                <version>6.0</version>
                <scope>provided</scope>
            </dependency>
            ...
        </dependencies>
    </dependencyManagement>

    <modules>
        ...
    </modules>
</project>

在dependendencyManagement元素中,定义使用的库的版本。 这样,您可以强制每个模块使用相同版本的库。

对于Maven,我经常推荐Java EE NetBeans IDE,因为它除其他外,还具有良好的依赖关系可视化工具,这对于检测和消除版本冲突很有用。 (我不知道Eclipse或IntelliJ中有类似的工具)。 如果在NetBeans中打开Maven项目,请单击pom.xml(在“项目”窗口中),然后选择“图形”>“显示图形”。

我将此工具用于两件事:

  1. 在Maven中删除传递依赖,否则您必须管理比所需更多的依赖。 要删除传递依赖关系,请在图形中右键单击并选择“层次结构”布局。 每个不在第一行的依赖项都是可传递的依赖项,可以从pom.xml中删除。
  2. 确定传递依赖之间的冲突。 (冲突在图中显示为红色。)我通过在根pom.xml中的dependencyManagement元素中显式设置依赖项的版本来解决这些冲突。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM