如何构建一个多模块的Maven项目来一次编译它? [英] How to structure a multi-modules Maven project to compile it at once?

查看:65
本文介绍了如何构建一个多模块的Maven项目来一次编译它?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个包含多个模块和子模块的 Maven 项目,我想一次编译它,即只调用一次mvn clean install".

对于基本项目,以下结构将起作用:

<预><代码>.├── 模块│ ├── moduleA│ │ └── pom.xml <--- Module A POM│ ├── moduleB│ │ └── pom.xml <--- 模块B POM│ └── pom.xml <--- Super POM(在modules"文件夹的根目录下)└── pom.xml <---聚合器POM

聚合器是:

<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>org.test</groupId><artifactId>聚合器</artifactId><packaging>pom</packaging><version>1.0.0-SNAPSHOT</version><模块><模块>模块</模块><module>modules/moduleA</module><module>modules/moduleB</module></模块></项目>

超级 POM:

<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>org.test</groupId><artifactId>super-pom</artifactId><packaging>pom</packaging><version>1.0.0-SNAPSHOT</version><依赖管理><依赖项><依赖><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><范围>测试</范围></依赖></依赖项></dependencyManagement></项目>

模块 A 的 POM:

<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><artifactId>moduleA</artifactId><父母><groupId>org.test</groupId><artifactId>super-pom</artifactId><version>1.0.0-SNAPSHOT</version></父母></项目>

模块 B 类似.

在项目的根目录下,运行mvn clean install"命令会给出(清理 .m2/repository 文件夹后):

<代码>[...][信息] ------------------------------------------------------------------------[信息] 反应堆摘要:[信息][INFO] super-pom ......................................... 成功 [0.450 秒][信息] 模块 A ...................................... 成功 [1.746 秒][信息] 模块 B ...................................... 成功 [0.029 秒][INFO] agregator .................................... 成功 [ 0.006 s][信息] ------------------------------------------------------------------------[信息] 构建成功

现在如果我想要更复杂的东西(但仍然使用一个超级 POM),例如:

<预><代码>.├── 模块│ ├── lib1│ │ ├── moduleA1│ │ │ └── pom.xml│ │ ├── moduleB1│ │ │ └── pom.xml│ │ └── pom.xml <--- lib1聚合器POM│ ├── lib2│ │ ├── moduleA2│ │ │ └── pom.xml│ │ ├── moduleB2│ │ │ └── pom.xml│ │ └── pom.xml <--- lib2聚合器POM│ └── pom.xml <---超级POM└── pom.xml <---聚合器POM

根 POM 为:

<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>org.test</groupId><artifactId>聚合器</artifactId><packaging>pom</packaging><version>1.0.0-SNAPSHOT</version><模块><模块>模块</模块><module>modules/lib1</module><module>modules/lib2</module></模块></项目>

Lib1 POM:

<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>org.test</groupId><artifactId>lib1-agregator</artifactId><packaging>pom</packaging><version>1.0.0-SNAPSHOT</version><模块><module>moduleA1</module><module>moduleB1</module></模块></项目>

并且,例如 moduleA1 POM:

<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><artifactId>moduleA1</artifactId><父母><groupId>org.test</groupId><artifactId>super-pom</artifactId><version>1.0.0-SNAPSHOT</version></父母></项目>

Maven 无法解析 POM 文件(清理 .m2/repository 文件夹后):

[INFO] 正在扫描项目...[ERROR] [ERROR] 在处理 POM 时遇到了一些问题:[警告] 'parent.relativePath' of POM org.test:moduleA1:[unknown-version] (/Users/ben/IdeaProjects/ComplexMavenStructure/modules/lib1/moduleA1/pom.xml) 指向 org.test:lib1-agregator而不是 org.test:super-pom,请验证您的项目结构@第 7 行,第 13 列[致命] org.test:moduleA1:[unknown-version] 的不可解析父 POM:找不到工件 org.test:super-pom:pom:1.0.0-SNAPSHOT 和parent.relativePath"指向错误的本地POM @ 第 7 行,第 13 列[警告] 'parent.relativePath' of POM org.test:moduleB1:[unknown-version] (/Users/ben/IdeaProjects/ComplexMavenStructure/modules/lib1/moduleB1/pom.xml) 指向 org.test:lib1-agregator而不是 org.test:super-pom,请验证您的项目结构@第 7 行,第 13 列[致命] org.test:moduleB1:[unknown-version] 的不可解析父 POM:找不到工件 org.test:super-pom:pom:1.0.0-SNAPSHOT 和parent.relativePath"指向错误的本地POM @ 第 7 行,第 13 列[警告] 'parent.relativePath' of POM org.test:moduleA2:[unknown-version] (/Users/ben/IdeaProjects/ComplexMavenStructure/modules/lib2/moduleA2/pom.xml) 指向 org.test:lib2-agregator而不是 org.test:super-pom,请验证您的项目结构@第 7 行,第 13 列[致命] org.test:moduleA2:[unknown-version] 的不可解析父 POM:找不到工件 org.test:super-pom:pom:1.0.0-SNAPSHOT 和parent.relativePath"指向错误的本地POM @ 第 7 行,第 13 列[警告] 'parent.relativePath' of POM org.test:moduleB2:[unknown-version] (/Users/ben/IdeaProjects/ComplexMavenStructure/modules/lib2/moduleB2/pom.xml) 指向 org.test:lib2-agregator而不是 org.test:super-pom,请验证您的项目结构@第 7 行,第 13 列[致命] org.test:moduleB2:[unknown-version] 的不可解析父 POM:找不到工件 org.test:super-pom:pom:1.0.0-SNAPSHOT 和parent.relativePath"指向错误的本地POM @ 第 7 行,第 13 列@[错误] 构建无法读取 4 个项目 ->[帮助1][错误][错误] 项目 org.test:moduleA1:[unknown-version] (/Users/ben/IdeaProjects/ComplexMavenStructure/modules/lib1/moduleA1/pom.xml) 有 1 个错误[错误] org.test:moduleA1:[unknown-version] 的不可解析父 POM:找不到工件 org.test:super-pom:pom:1.0.0-SNAPSHOT 和parent.relativePath"指向错误的本地POM@第7行,第13列->[帮助2][错误][错误] 项目 org.test:moduleB1:[unknown-version] (/Users/ben/IdeaProjects/ComplexMavenStructure/modules/lib1/moduleB1/pom.xml) 有 1 个错误[错误] org.test:moduleB1:[unknown-version] 的不可解析父 POM:找不到工件 org.test:super-pom:pom:1.0.0-SNAPSHOT 和parent.relativePath"指向错误的本地POM@第7行,第13列->[帮助2][错误][错误] 项目 org.test:moduleA2:[unknown-version] (/Users/ben/IdeaProjects/ComplexMavenStructure/modules/lib2/moduleA2/pom.xml) 有 1 个错误[错误] org.test:moduleA2:[unknown-version] 的不可解析父 POM:找不到工件 org.test:super-pom:pom:1.0.0-SNAPSHOT 和parent.relativePath"指向错误的本地POM@第7行,第13列->[帮助2][错误][错误] 项目 org.test:moduleB2:[unknown-version] (/Users/ben/IdeaProjects/ComplexMavenStructure/modules/lib2/moduleB2/pom.xml) 有 1 个错误[错误] org.test:moduleB2:[unknown-version] 的不可解析父 POM:找不到工件 org.test:super-pom:pom:1.0.0-SNAPSHOT 和parent.relativePath"指向错误的本地POM@第7行,第13列->[帮助2][错误][错误] 要查看错误的完整堆栈跟踪,请使用 -e 开关重新运行 Maven.[错误] 使用 -X 开关重新运行 Maven 以启用完整的调试日志记录.[错误][ERROR] 有关错误和可能的解决方案的更多信息,请阅读以下文章:[错误] [帮助 1] http://cwiki.apache.org/confluence/display/MAVEN/ProjectBuildingException[错误] [帮助 2] http://cwiki.apache.org/confluence/display/MAVEN/UnresolvableModelException

我需要先构建超级 pom:

cd 模块/mvn 全新安装

然后才会编译:

[INFO] 反应堆摘要:[信息][INFO] super-pom ......................................... 成功 [0.271 秒][信息] moduleA1 ..................... 成功 [ 1.202][信息] moduleB1 ..................... 成功 [ 0.027][信息] lib1-agregator ......................................... 成功 [0.006 s][信息] moduleA2 ..................... 成功 [ 0.027][信息] moduleB2 ..................... 成功 [ 0.022][信息] lib2-agregator ......................................... 成功 [0.007 s][INFO] agregator ................................... 成功 [0.007 s][信息] ------------------------------------------------------------------------[信息] 构建成功

如果没有这两个步骤的编译,您将如何构建项目以使其工作?

:如评论中所讨论的,将超级 POM 的相对路径添加到模块 POM 将使代码通过一个命令行编译.

但是,如果我只想将 lib1 分发给某些开发人员,即使我的超级 POM 位于 Maven 存储库中,如果没有整个项目结构,lib1 也不会编译.这降低了项目的模块化程度.

解决方案

让我像你一样开始,但我的名字有点不同:

<预><代码>.├── 模块-root│ ├── 模块A│ │ └── pom.xml <--- 模块A POM│ ├──模块B│ │ └── pom.xml <--- 模块B POM│ └── pom.xml <--- 模块根目录└── pom.xml <--- project-root

让我们从 project-root 开始,它看起来像这样:

<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>org.test</groupId><artifactId>project-root</artifactId><packaging>pom</packaging><version>1.0.0-SNAPSHOT</version><依赖管理><依赖项><依赖><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><范围>测试</范围></依赖></依赖项></dependencyManagement><模块><module>modules-root</module></模块></项目>

module-parent 看起来像这样.我要强调的是,这仅包含对 moduleAmoduleB 的引用,并且将从 project-root继承:

<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>org.test</groupId><artifactId>project-root</artifactId><version>1.0.0-SNAPSHOT</version></父母><groupId>org.test.module</groupId><artifactId>module-parent</artifactId><packaging>pom</packaging><模块><module>moduleA</module><module>moduleB</module></模块></项目>

moduleA 看起来像这样.请注意,这将继承 module-parent(父),这正好是上一级......

<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>org.test.module</groupId><artifactId>module-parent</artifactId><version>1.0.0-SNAPSHOT</version></父母><artifactId>moduleA</artifactId><包装>..</包装><....其他依赖项...></项目>

如果你使用这种结构,你可以简单地进入project-root级别并执行:

mvn 全新安装

此外,您可以使用以下内容:

mvn -pl moduleA ...

...只构建 moduleA(但保持在 project-root 级别...).

module-parent 在这个例子中可能看起来像是浪费或多余的,但是如果你有更多的模块,你可以通过 dependencyManagement 定义它们的补充依赖,或者可以通过改变插件配置pluginManagement 只会在这个子区域(moduleA, moduleB, ...)中使用.如果您的项目变得更大,您将获得更多并行的 module-parents..它们包含您应用程序的不同部分......以及可以通过这种结构实现的不同意图.

还有一件事要提;我已将 module-parent 中的 groupIdorg.test 更改为 org.test.module.如果您有大量模块,这有时很有用,因为 groupId 表示存储库中的文件夹结构(就像 Java 项目中的 java 包一样)...这可以让您更好地了解...

project-root 是通过 dependencyManagement 等定义整体可用依赖项的位置......以及应该通过 pluginManagement 定义的使用插件... 或者可能正在使用 maven-enforcer-plugin 定义整体项目规则...

这种结构的典型场景是 Java EE 项目或其他大型项目(可能有 300...或 1000 个模块,是的,它们存在)...

如果您获得更多模块,您可以使用 maven 的多线程功能并通过以下方式构建您的项目:

mvn -T 4 全新安装

来自 project-root,这大大减少了构建时间.

I have a Maven project with multiple modules and sub-modules and i want to compile it at once, i.e. using only one call to "mvn clean install".

For a basic project, the following structure would work:

.
├── modules
│   ├── moduleA
│   │   └── pom.xml <--- Module A POM
│   ├── moduleB
│   │   └── pom.xml <--- Module B POM
│   └── pom.xml     <--- Super POM (at the root of "modules" folder)
└── pom.xml         <--- Aggregator POM

With the aggregator being:

<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>org.test</groupId>
    <artifactId>aggregator</artifactId>
    <packaging>pom</packaging>
    <version>1.0.0-SNAPSHOT</version>

    <modules>
        <module>modules</module>
        <module>modules/moduleA</module>
        <module>modules/moduleB</module>
    </modules>

</project>

The Super POM:

<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>org.test</groupId>
    <artifactId>super-pom</artifactId>
    <packaging>pom</packaging>
    <version>1.0.0-SNAPSHOT</version>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.11</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

</project>

Module A's POM:

<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>

    <artifactId>moduleA</artifactId>

    <parent>
        <groupId>org.test</groupId>
        <artifactId>super-pom</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>

</project>

Module B is similar.

When at the root of the project, running "mvn clean install" command gives (after cleaning up the .m2/repository folder):

[...]
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] super-pom .......................................... SUCCESS [  0.450 s]
[INFO] moduleA ............................................ SUCCESS [  1.746 s]
[INFO] moduleB ............................................ SUCCESS [  0.029 s]
[INFO] agregator .......................................... SUCCESS [  0.006 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS

Now if I want something that is more complex (but still using one super POM), such as:

.
├── modules
│   ├── lib1
│   │   ├── moduleA1
│   │   │   └── pom.xml
│   │   ├── moduleB1
│   │   │   └── pom.xml
│   │   └── pom.xml      <--- lib1 aggregator POM
│   ├── lib2
│   │   ├── moduleA2
│   │   │   └── pom.xml
│   │   ├── moduleB2
│   │   │   └── pom.xml
│   │   └── pom.xml      <--- lib2 aggregator POM
│   └── pom.xml          <--- Super POM
└── pom.xml              <--- Aggregator POM

With the root POM being:

<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>org.test</groupId>
    <artifactId>agregator</artifactId>
    <packaging>pom</packaging>
    <version>1.0.0-SNAPSHOT</version>

    <modules>
        <module>modules</module>
        <module>modules/lib1</module>
        <module>modules/lib2</module>
    </modules>

</project>

Lib1 POM:

<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>org.test</groupId>
    <artifactId>lib1-agregator</artifactId>
    <packaging>pom</packaging>
    <version>1.0.0-SNAPSHOT</version>

    <modules>
        <module>moduleA1</module>
        <module>moduleB1</module>
    </modules>

</project>

And, for instance moduleA1 POM:

<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>

    <artifactId>moduleA1</artifactId>

    <parent>
        <groupId>org.test</groupId>
        <artifactId>super-pom</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>

</project>

Maven does not manage to resolve the POM files (after cleaning up the .m2/repository folder):

[INFO] Scanning for projects...
[ERROR] [ERROR] Some problems were encountered while processing the POMs:
[WARNING] 'parent.relativePath' of POM org.test:moduleA1:[unknown-version] (/Users/ben/IdeaProjects/ComplexMavenStructure/modules/lib1/moduleA1/pom.xml) points at org.test:lib1-agregator instead of org.test:super-pom, please verify your project structure @ line 7, column 13
[FATAL] Non-resolvable parent POM for org.test:moduleA1:[unknown-version]: Could not find artifact org.test:super-pom:pom:1.0.0-SNAPSHOT and 'parent.relativePath' points at wrong local POM @ line 7, column 13
[WARNING] 'parent.relativePath' of POM org.test:moduleB1:[unknown-version] (/Users/ben/IdeaProjects/ComplexMavenStructure/modules/lib1/moduleB1/pom.xml) points at org.test:lib1-agregator instead of org.test:super-pom, please verify your project structure @ line 7, column 13
[FATAL] Non-resolvable parent POM for org.test:moduleB1:[unknown-version]: Could not find artifact org.test:super-pom:pom:1.0.0-SNAPSHOT and 'parent.relativePath' points at wrong local POM @ line 7, column 13
[WARNING] 'parent.relativePath' of POM org.test:moduleA2:[unknown-version] (/Users/ben/IdeaProjects/ComplexMavenStructure/modules/lib2/moduleA2/pom.xml) points at org.test:lib2-agregator instead of org.test:super-pom, please verify your project structure @ line 7, column 13
[FATAL] Non-resolvable parent POM for org.test:moduleA2:[unknown-version]: Could not find artifact org.test:super-pom:pom:1.0.0-SNAPSHOT and 'parent.relativePath' points at wrong local POM @ line 7, column 13
[WARNING] 'parent.relativePath' of POM org.test:moduleB2:[unknown-version] (/Users/ben/IdeaProjects/ComplexMavenStructure/modules/lib2/moduleB2/pom.xml) points at org.test:lib2-agregator instead of org.test:super-pom, please verify your project structure @ line 7, column 13
[FATAL] Non-resolvable parent POM for org.test:moduleB2:[unknown-version]: Could not find artifact org.test:super-pom:pom:1.0.0-SNAPSHOT and 'parent.relativePath' points at wrong local POM @ line 7, column 13
 @ 
[ERROR] The build could not read 4 projects -> [Help 1]
[ERROR]   
[ERROR]   The project org.test:moduleA1:[unknown-version] (/Users/ben/IdeaProjects/ComplexMavenStructure/modules/lib1/moduleA1/pom.xml) has 1 error
[ERROR]     Non-resolvable parent POM for org.test:moduleA1:[unknown-version]: Could not find artifact org.test:super-pom:pom:1.0.0-SNAPSHOT and 'parent.relativePath' points at wrong local POM @ line 7, column 13 -> [Help 2]
[ERROR]   
[ERROR]   The project org.test:moduleB1:[unknown-version] (/Users/ben/IdeaProjects/ComplexMavenStructure/modules/lib1/moduleB1/pom.xml) has 1 error
[ERROR]     Non-resolvable parent POM for org.test:moduleB1:[unknown-version]: Could not find artifact org.test:super-pom:pom:1.0.0-SNAPSHOT and 'parent.relativePath' points at wrong local POM @ line 7, column 13 -> [Help 2]
[ERROR]   
[ERROR]   The project org.test:moduleA2:[unknown-version] (/Users/ben/IdeaProjects/ComplexMavenStructure/modules/lib2/moduleA2/pom.xml) has 1 error
[ERROR]     Non-resolvable parent POM for org.test:moduleA2:[unknown-version]: Could not find artifact org.test:super-pom:pom:1.0.0-SNAPSHOT and 'parent.relativePath' points at wrong local POM @ line 7, column 13 -> [Help 2]
[ERROR]   
[ERROR]   The project org.test:moduleB2:[unknown-version] (/Users/ben/IdeaProjects/ComplexMavenStructure/modules/lib2/moduleB2/pom.xml) has 1 error
[ERROR]     Non-resolvable parent POM for org.test:moduleB2:[unknown-version]: Could not find artifact org.test:super-pom:pom:1.0.0-SNAPSHOT and 'parent.relativePath' points at wrong local POM @ line 7, column 13 -> [Help 2]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/ProjectBuildingException
[ERROR] [Help 2] http://cwiki.apache.org/confluence/display/MAVEN/UnresolvableModelException

I need to first build the super pom:

cd modules/
mvn clean install

And only then will it compile:

[INFO] Reactor Summary:
[INFO] 
[INFO] super-pom .......................................... SUCCESS [  0.271 s]
[INFO] moduleA1 ........................................... SUCCESS [  1.202 s]
[INFO] moduleB1 ........................................... SUCCESS [  0.027 s]
[INFO] lib1-agregator ..................................... SUCCESS [  0.006 s]
[INFO] moduleA2 ........................................... SUCCESS [  0.027 s]
[INFO] moduleB2 ........................................... SUCCESS [  0.022 s]
[INFO] lib2-agregator ..................................... SUCCESS [  0.007 s]
[INFO] agregator .......................................... SUCCESS [  0.007 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS

How would you structure the project to make it work without this two-steps compilation?

[EDIT]: as discussed in the comments, adding the relativePath of the Super POM to the modules POMs would make the code compile with one command line.

However, if I want to distribute only lib1 to some developers, even though my super POM is on a Maven repository, lib1 would not compile without the whole project structure. This makes the project less modular.

解决方案

Let me start like you did, but I name the things a little bit differently:

.
├── modules-root
│   ├── moduleA
│   │   └── pom.xml <--- Module A POM
│   ├── moduleB
│   │   └── pom.xml <--- Module B POM
│   └── pom.xml     <--- modules root
└── pom.xml         <--- project-root

Let's start with the project-root, which will look like this:

<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>org.test</groupId>
    <artifactId>project-root</artifactId>
    <packaging>pom</packaging>
    <version>1.0.0-SNAPSHOT</version>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.11</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <modules>
       <module>modules-root</module>
    </modules>

</project>

The module-parent will look like this. I will emphasis that this contains only the reference to the moduleA and moduleB and will inherit from the project-root:

<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>

   <parent>
        <groupId>org.test</groupId>
        <artifactId>project-root</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>

    <groupId>org.test.module</groupId>
    <artifactId>module-parent</artifactId>
    <packaging>pom</packaging>

    <modules>
        <module>moduleA</module>
        <module>moduleB</module>
    </modules>
</project>

moduleA will look like this. Pay attention that this will inherit from module-parent (parent) which is exactly one level above...

<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>

    <parent>
        <groupId>org.test.module</groupId>
        <artifactId>module-parent</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>

    <artifactId>moduleA</artifactId>
    <packaging>..</packaging>

    <....other dependencies..>
</project>

If you use this kind of structure you can simply go to the project-root level and do:

mvn clean install

Furthermore afterwards you can use things like this:

mvn -pl moduleA ...

...to build only moduleA (but stay at the project-root level...).

module-parent might look like wasted or superfluous in this example, but if you get more modules you could define their supplemental dependencies via dependencyManagement or may changing plugin configurations via pluginManagement which will only be used in this sub area (moduleA, moduleB, ...). If your project becomes larger, you will get more module-parents in parallel..which contain different parts of your applications...and different intentions which can be achieved with this structure.

One more thing is to mention; I have changed the groupId from org.test to org.test.module in the module-parent. This is sometimes useful if you have a large number of modules cause the groupId represents the folder structure in your repository (as java packages do in a Java project)... this give you an better overview...

The project-root is the location to define the overall usable dependencies via dependencyManagement etc....and the used plugins which should be defined via pluginManagement... or may be using maven-enforcer-plugin to define overall project rules...

Typical scenarios for this kind of structure are Java EE projects or other large projects (may be with 300...or 1000 modules yes they exist)...

If you get more modules you can use the multi-thread capability of maven and build your project with:

mvn -T 4 clean install 

from the project-root which reduces the build time dramatically.

这篇关于如何构建一个多模块的Maven项目来一次编译它?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆