Maven多模块编译报错:acceptance-test无法找到application类
解决方案:Maven多模块acceptance-test编译类找不到问题
核心原因
编译失败本质是acceptance-test模块未正确引入application模块的代码依赖,IntelliJ能识别是因为它自动关联了模块依赖,但Maven编译需要显式配置依赖关系;若需访问application的测试类,还需额外配置生成测试Jar包。
步骤1:配置application模块的依赖引入
情况1:仅需application的主代码(src/main/java)
在acceptance-test/pom.xml中添加对application模块的依赖:
<dependencies> <dependency> <groupId>${project.parent.groupId}</groupId> <artifactId>application</artifactId> <version>${project.parent.version}</version> </dependency> </dependencies>
情况2:需要application的测试代码(src/test/java)
如果acceptance-test要用到application里的测试类(如测试基类、工具类),需先让application模块生成测试Jar包:
在application/pom.xml的build节点下添加maven-jar-plugin配置:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <executions> <execution> <goals> <goal>test-jar</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
然后在acceptance-test/pom.xml中添加测试Jar的依赖:
<dependencies> <!-- 主代码依赖 --> <dependency> <groupId>${project.parent.groupId}</groupId> <artifactId>application</artifactId> <version>${project.parent.version}</version> </dependency> <!-- 测试代码依赖 --> <dependency> <groupId>${project.parent.groupId}</groupId> <artifactId>application</artifactId> <version>${project.parent.version}</version> <classifier>tests</classifier> <scope>test</scope> </dependency> </dependencies>
步骤2:确保Maven编译顺序正确
你的父pom已将application放在modules列表首位,Maven会自动先编译application再编译acceptance-test,但必须从父项目根目录执行Maven命令,比如:
mvn clean compile
或安装到本地仓库:
mvn clean install
不要单独在acceptance-test模块下执行编译,否则Maven无法找到未安装的application依赖。
步骤3:检查maven-shade-plugin配置
确保shade插件打包时包含所有依赖类,示例配置如下(acceptance-test/pom.xml):
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <!-- 指定可执行Jar的主类 --> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.example.acceptance.TestMain</mainClass> </transformer> </transformers> <!-- 可选:过滤不需要的类,默认会包含所有依赖类 --> <!-- <filters> <filter> <artifact>*:*</artifact> <excludes> <exclude>META-INF/*.SF</exclude> <exclude>META-INF/*.DSA</exclude> <exclude>META-INF/*.RSA</exclude> </excludes> </filter> </filters> --> </configuration> </execution> </executions> </plugin> </plugins> </build>
排查小技巧
- 在acceptance-test模块执行
mvn dependency:tree,查看是否正确引入了application的依赖 - 检查本地Maven仓库(默认
~/.m2/repository),确认application的Jar包(包括测试Jar)已生成并存在 - 在IntelliJ中执行
File > Sync Project with Maven,同步配置后再尝试Maven编译
内容的提问来源于stack exchange,提问作者Matrix12
相关产品推荐
相关产品推荐

