Java跨项目复用测试类:test-jar打包缺失致类找不到问题解决
解决方案:将test-jar依赖纳入打包后的lib目录
我之前也碰到过一模一样的问题!核心原因是Maven默认的打包逻辑不会自动把test-jar类型的依赖纳入最终的lib目录——毕竟这类jar最初是为测试场景设计的,哪怕你把scope改成了compile,打包插件还是需要额外配置才能识别并处理它。下面给你两种常用的解决办法:
方法一:手动复制test-jar到lib目录并配置Class-Path
这种方式适合需要保留依赖分离结构的场景,会把test-jar复制到项目打包后的lib文件夹,同时让主jar的Manifest文件指向这些依赖。
在第二个项目的pom.xml中添加以下插件配置:
<build> <plugins> <!-- 复制test-jar依赖到lib目录 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy-test-jar-deps</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/lib</outputDirectory> <!-- 明确指定要复制test-jar类型的依赖,若需要其他jar可添加`jar`类型 --> <includeTypes>test-jar</includeTypes> <!-- 排除不需要的测试范围依赖 --> <excludeScope>test</excludeScope> </configuration> </execution> </executions> </plugin> <!-- 配置主jar的Manifest,让运行时能找到lib中的依赖 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> <!-- 如果是可运行jar,记得替换成你的主类全限定名 --> <mainClass>com.yourcompany.yourapp.MainClass</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build>
执行mvn package后,你会在target/lib下看到那个test-jar,主jar的Manifest也会自动添加对应的Class-Path条目。
方法二:打包成包含所有依赖的Fat Jar
如果你想把test-jar里的类直接合并到最终的可执行jar中,可以用maven-assembly-plugin打包成Fat Jar:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.6.0</version> <executions> <execution> <id>build-fat-jar</id> <phase>package</phase> <goals> <goal>single</goal> </goals> <configuration> <!-- 使用官方的jar-with-dependencies模板 --> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <!-- 替换成你的主类全限定名 --> <mainClass>com.yourcompany.yourapp.MainClass</mainClass> </manifest> </archive> <!-- 确保test-jar被解压并合并到最终jar中 --> <dependencySets> <dependencySet> <includes> <include>firstproject:artifactId:test-jar:*</include> </includes> <unpack>true</unpack> </dependencySet> </dependencySets> </configuration> </execution> </executions> </plugin> </plugins> </build>
执行mvn package后,target目录下会生成一个带-jar-with-dependencies后缀的jar,这个jar已经包含了test-jar里的所有类,运行时不会再出现找不到类的问题。
额外注意事项
- 确保第一个项目的
test-jar已经正确安装到本地Maven仓库(执行mvn install),如果是团队共享,要上传到公司的Maven私服。 - 检查依赖的groupId、artifactId、version是否完全匹配,避免拼写错误。
内容的提问来源于stack exchange,提问作者Raigon Augustin
相关产品推荐
相关产品推荐

