Maven将Jar包复制到src/main/resources失败,测试报文件未找到
1. 先排查文件名匹配问题
错误提示找不到src/main/resources/suffixing.jar,但你要求生成的Jar命名为suffixingApp.jar——立刻检查AppTest.java里的读取逻辑,是不是硬编码写了suffixing.jar而非suffixingApp.jar?这是最容易踩的低级坑。
2. 修正Maven生成Jar到resources目录的配置
Maven默认不会把构建产物输出到src/main/resources(这个目录是用来放编译时要打包进Jar的静态资源),如果一定要把生成的Jar放到这里,需要通过插件配合配置:
修改你的pom.xml,添加以下插件配置:
<build> <plugins> <!-- 指定生成的Jar名称 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.3.0</version> <configuration> <finalName>suffixingApp</finalName> <outputDirectory>${project.build.directory}</outputDirectory> </configuration> </plugin> <!-- 把生成的Jar复制到src/main/resources --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>3.3.1</version> <executions> <execution> <id>copy-jar-to-resources</id> <phase>package</phase> <goals> <goal>copy-resources</goal> </goals> <configuration> <outputDirectory>${project.basedir}/src/main/resources</outputDirectory> <resources> <resource> <directory>${project.build.directory}</directory> <includes> <include>suffixingApp.jar</include> </includes> </resource> </resources> </configuration> </execution> </executions> </plugin> </plugins> </build>
执行mvn clean package后,suffixingApp.jar会被自动复制到src/main/resources目录。
3. 测试类读取资源的正确姿势
就算Jar已经在resources目录,也别用new File("src/main/resources/suffixingApp.jar")这种写法——测试运行时的工作目录不一定是项目根目录,正确方式是用类加载器读取:
修改AppTest.java中的读取代码:
// 错误写法 // File jarFile = new File("src/main/resources/suffixingApp.jar"); // 正确写法 InputStream jarStream = AppTest.class.getClassLoader().getResourceAsStream("suffixingApp.jar"); // 如果需要File对象,可临时写入本地文件 File tempJar = File.createTempFile("suffixingApp", ".jar"); Files.copy(jarStream, tempJar.toPath(), StandardCopyOption.REPLACE_EXISTING);
4. 检查Suffixing类的硬编码问题
如果以上都没问题,去看Suffixing类里有没有写死的Jar文件名,比如是不是把读取路径写成了suffixing.jar,或者没正确用类加载器读取资源:
// 错误示例 File jar = new File("src/main/resources/suffixing.jar"); // 改成这样 InputStream is = getClass().getResourceAsStream("/suffixingApp.jar");
额外提醒
不建议把构建产物放到src/main/resources目录,这个目录属于源码目录,会被版本控制工具追踪,而且Maven编译时会把resources内容打包进最终Jar,容易导致重复打包。更合理的做法是直接从target目录读取生成的Jar,或者配置测试阶段依赖target目录的产物。
内容的提问来源于stack exchange,提问作者Sarvar Khalimov

