Maven和依赖模块

Dav*_*vid 50 java build-process maven-2

同事们一直在兜售maven及其魔法依赖的奇迹,但我发现它在我认为显而易见的用途上失败了.

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

然后我有一些项目,称他们为A和B.

B需要A,因此B文件夹中的POM中包含相应的依赖项

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

当我执行通常的mvn clean安装时,我得到了一个失败,因为A没有构建.

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

但是不是maven看到B的依赖管理的全部要点,转到B POM文件,它看到对A的依赖,所以它应该自动构建A.

mil*_*ose 44

使用主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>
Run Code Online (Sandbox Code Playgroud)

和模块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>
Run Code Online (Sandbox Code Playgroud)

~/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>
Run Code Online (Sandbox Code Playgroud)

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]
Run Code Online (Sandbox Code Playgroud)

在这种情况下,<modules>父POM 的部分将是:

<modules>
    <module>../nipple</module>
    <module>../cabbage</module>
</modules>
Run Code Online (Sandbox Code Playgroud)

请注意,没有任何内容表明哪个模块中存在哪个工件ID.它只是告诉Maven这些是文件系统位置,在那里搜索与此构建相关的其他工件.


Ric*_*ler 25

我能想到你所希望的行为尚未实现的原因如下:

假设我正在研究A和B项目.目前A已被打破.如果依赖解析按照您的意愿发生,我将永远无法在A被修复之前构建B. 所以我要么必须将我的更改回滚到A,要么首先关注修复A. 无论哪种方式可能不是我现在想要关注的.

通常B想要使用A的"最后好"版本,而不是最新版本.使用存储库中的依赖项意味着它们至少编译好(并且希望单元测试也运行).


det*_*erb 14

看一下Maven reactor插件,特别是reactor:make,它构建了一个模块以及它所依赖的所有模块.

  • Maven reactor插件已退役.它不再维护. (11认同)

mmu*_*ler 5

Rich是完全正确的.您所描述的通常不是预期的行为.虽然如Deterb所述,如果父POM知道模块,Maven反应器支持部分构建.

构建with mvn install -pl B -am应该使(-am)B的依赖(即A).

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

(参见Maven模块+构建单个特定模块)


Tom*_*mer 5

如果你使用 IntelliJ,他们有一个小魔法复选框:在他们的 Maven 运行配置中“解析工作区工件”。因此无需从父级安装或构建。

  • 该复选框如何工作?我可以在不从 IntelliJ 运行 Maven 的情况下获得这种行为吗? (4认同)