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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 06:15:37