Maven和相关模块

2021/01/17 09:11 · java ·  · 0评论

同事一直在吹捧Maven的奇迹及其神奇的依赖关系,但我发现它在我认为是显而易见的用途上失败了。

假设我有一个带有主POM的根文件夹。

然后在我下面有一些项目,分别称为A和B

B需要A,因此B文件夹中的POM中具有适当的依赖项

现在,回到配置文件中的根文件夹,我指定要构建B。

当我执行通常的mvn全新安装时,由于未构建A而失败。

我的朋友告诉我,我必须在根目录的主配置文件中同时指定A和B。

但是,并非Maven看到B,而是进入B POM文件,从中看到对A的依赖关系,因此应该自动构建A。

我能想到的尚未实现您期望的行为的原因如下:

假设我同时在项目A和B上工作。当前A已损坏。如果依赖性解析按照您的意愿发生,那么在A修复之前,我将永远无法构建B。因此,我要么必须回滚对A的更改,要么首先专注于修复A。无论哪种方式,可能都不是我现在要关注的重点。

通常,B希望使用A的“最后一个好”版本,而不是最新版本。使用存储库中的依赖项意味着它们至少可以正常编译(希望单元测试也可以运行)。

使用主POM:

~/scratch/pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <groupId>scratch</groupId>
    <artifactId>scratch</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>

    <modules>
        <module>nipple</module>
        <module>cabbage</module>
    </modules>
</project>

和模块POM:

~/scratch/nipple/pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">

    <parent>
        <artifactId>scratch</artifactId>
        <groupId>scratch</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <modelVersion>4.0.0</modelVersion>

    <groupId>scratch</groupId>
    <artifactId>nipple</artifactId>
    <version>1.0-SNAPSHOT</version>

</project>

~/scratch/cabbage/pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">

    <parent>
        <artifactId>scratch</artifactId>
        <groupId>scratch</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <modelVersion>4.0.0</modelVersion>

    <groupId>scratch</groupId>
    <artifactId>cabbage</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>scratch</groupId>
            <artifactId>nipple</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

</project>

mvn package清除本地存储库并最终构建所有模块后,可以在根目录中发布(放入空的JAR中,但已构建。)

Maven似乎在存储库或正在进行的构建中寻找依赖项。当您仅构建一个模块时,它不会自动遍历您的项目结构,因为不需要甚至在计算机上也有父项目,而不必在当前模块上方有一个目录。(亲子关系甚至都不是双射的。)

之所以如此,可能是因为目录布局绝对不是必须的,在该目录布局中可以预测模块的位置。上面示例的布局如下所示,这在某种程度上是常见且可以接受的:

projects
|
+--scratch
|  |
|  +--scratch-parent
|  |  |
|  |  +--pom.xml [The POM of scratch:scratch:1.0-SNAPSHOT]
|  |
|  +--nipple
|  |  |
|  |  +--pom.xml [The POM of scratch:mod1:1.0-SNAPSHOT]
|  |
|  +--cabbage
|  |  |
|  |  +--pom.xml [The POM of scratch:mod2:1.0-SNAPSHOT]

在这种情况下,<modules>父POM部分为:

<modules>
    <module>../nipple</module>
    <module>../cabbage</module>
</modules>

注意,并没有说哪个工件ID在哪个模块中。它只是用来告诉Maven,这些是文件系统位置,可以在其中搜索与此构建相关的其他工件。

看一下Maven反应器插件,特别是react :: make,它构建一个模块以及它依赖的所有模块。

有钱是完全正确的。您所描述的通常不是预期的行为。尽管如deterb所述,但如果父POM知道模块,则Maven反应器支持部分构建

与一起构建mvn install -pl B -am还应使-am)B依赖(即A)。

无论如何,模块A必须是父POM的模块。

(请参阅Maven模块+构建单个特定模块

如果您正在使用IntelliJ,则它们会有一个魔术复选框:在其Maven运行配置中为“解决工作区工件”。因此,无需从父级安装或构建。

答案就是它不是Maven的工作方式。Maven背后的想法是为开发人员提供一个逻辑,简单的系统来控制依赖关系。从存储库获取依赖关系是实现这一目标的关键。每个异常都会削弱这种控制和简单性。在父POM中添加A作为依赖项可以完全解决您的情况,而无需添加其他例外。使用批处理文件或ant脚本是解决方案的另一种方法。

本文地址:http://java.askforanswer.com/mavenhexiangguanmokuai.html
文章标签: ,   ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!