You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Maven多模块无需install,执行子模块m1中类的解决方案

问题

项目根目录包含两个子模块m1和m2,其中m1依赖m2。需要编译所有必要内容并执行m1中的org.example1.MyModule1类。m1的pom.xml中有如下Profile配置:

<profiles>
    <profile>
        <id>traverse</id>
        <activation>
            <property>
                <name>traverse</name>
            </property>
        </activation>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>exec-maven-plugin</artifactId>
                    <configuration>
                        <executable>java</executable>
                        <arguments>
                            <argument>-classpath</argument>
                            <argument>org.example1.MyModule1</argument>
                        </arguments>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

执行mvn compile和mvn exec:exec -Ptraverse -pl m1时,根模块报错:

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

要求在不执行mvn install(避免污染本地.m2文件夹)的前提下运行目标类。

解决方法

1. 先编译所有依赖模块

直接在根目录执行编译命令,Maven会自动按依赖顺序编译m2和m1:

mvn compile

2. 修正执行命令与插件配置

方式一:调整exec命令参数

在根目录运行以下命令,通过-am参数确保m2被构建并能被m1找到:

mvn exec:exec -Ptraverse -pl m1 -am

-am表示同时构建指定模块的所有依赖模块,无需将m2安装到本地仓库。

方式二:修复exec-maven-plugin的classpath配置

原配置中-classpath参数后未指定有效类路径,修改m1的profile配置,让Maven自动管理类路径:

<profile>
    <id>traverse</id>
    <activation>
        <property>
            <name>traverse</name>
        </property>
    </activation>
    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <configuration>
                    <executable>java</executable>
                    <!-- 自动包含编译范围内的所有依赖类路径 -->
                    <classpathScope>compile</classpathScope>
                    <arguments>
                        <argument>org.example1.MyModule1</argument>
                    </arguments>
                </configuration>
            </plugin>
        </plugins>
    </build>
</profile>

之后再执行方式一中的命令即可正常运行。

核心原理

同一Maven reactor(根pom管理的多模块项目)内的模块,无需安装到本地仓库。通过-am参数可触发依赖模块的构建,结合exec插件的classpathScope配置,就能直接引用依赖模块的编译输出类文件。

内容的提问来源于stack exchange,提问作者Mustafa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 08:15:35