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
相关产品推荐
相关产品推荐

