【问题标题】:Compiling multi module maven projects without installing to local repository编译多模块 Maven 项目而不安装到本地存储库
【发布时间】:2026-01-27 22:50:01
【问题描述】:

我的多模块 maven 项目中存在编译(和打包)问题。编译两个项目之一时会出现问题,这两个项目是兄弟项目并包含在父项目中,并且一个项目依赖于另一个项目。为简单起见,我在这里草绘项目文件夹结构和pom.xml 内容。

folder structure

-parent
|
|-child1
| |-src
| |  |-main
| |     |-java
| |        |-Child1Class.java
| |-pom.xml
|
|-child2
| |-src
| |  |-main
| |     |-java
| |        |-Child2Class.java
| |-pom.xml
|
|-pom.xml

pom.xml of parent

<?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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example.project</groupId>
    <artifactId>parent</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>parent</name>
    <modules>
        <module>child1</module>
        <module>child2</module>
    </modules>
</project>

pom.xml of child1

<?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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.example.project</groupId>
        <artifactId>parent</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <groupId>com.example.project</groupId>
    <artifactId>child1</artifactId>
    <version>1.0-SNAPSHOT</version>
    <name>child1</name>
    <dependencies>
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>child2</artifactId>
            <version>${project.version}</version>
        </dependency>
    </dependencies>
</project>

pom.xml of child2

<?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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.example.project</groupId>
        <artifactId>parent</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <groupId>com.example.project</groupId>
    <artifactId>child2</artifactId>
    <version>1.0-SNAPSHOT</version>
    <name>child2</name>
    <dependencies>
    </dependencies>
</project>

正如所见,child2child1 的依赖项。 child1child2 是并行开发的。所以在child2 中的任何源代码更改后,child1 应该被编译和部署,而不需要任何额外的操作。但我无法成功编译child1。在child1 上运行mvn compile 命令后出现此错误消息:

[ERROR] Failed to execute goal on project child1: Could not resolve dependencies for project com.example.project:child1: jar:1.0-SNAPSHOT: Could not find artifact com.example.project:child2:jar:1.0-SNAPSHOT -> [Help 1]

如我所见,maven 尝试在本地存储库中搜索 child2。如果我在parent 项目上运行mvn install 命令,这两个项目都会添加到本地存储库中。然后任何编译child1 的尝试都会成功。这似乎是一个解决方案,但并不方便。我想要的是编译child1,同时编码child1child2,而不需要安装到本地存储库。

【问题讨论】:

    标签: java maven pom.xml multi-module


    【解决方案1】:

    尝试mvn compile -pl :child1 -am,其中-pl 是您要构建的项目,-am 告诉 maven 构建这些项目的依赖项,如果它们是多模块项目的一部分。

    【讨论】:

    【解决方案2】:

    您的错误是认为 maven 在构建孩子时会构建父级。 它不是。 尝试构建父级,maven 会自动猜测构建顺序。

    C:\parent\child1> mvn clean package
    [INFO] BUILD FAILURE
    
    C:\parent\child1> cd ..
    
    C:\parent> mvn clean package
    [INFO] parent ............................................. SUCCESS [  0.148 s]
    [INFO] child2 ............................................. SUCCESS [  1.209 s]
    [INFO] child1 ............................................. SUCCESS [  0.073 s]
    [INFO] BUILD SUCCESS
    

    【讨论】:

    • 其实我的项目是一个大项目,这里我简化表示。实际上child1 是一个谷歌应用引擎应用程序,它有应用引擎maven 插件,所以我可以通过运行这个插件来上传它。但它需要child2 位于本地存储库中才能构建和更新。我不想在每次运行应用引擎更新插件时打包或安装父项目。
    • 在这种情况下,进入 child2 目录并运行 mvn clean install。然后您可以构建 child1,因为 child2 在本地存储库中。或者,如果这不是您想要的……只需 mvn package 父级,让 maven 决定需要编译的内容。