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

如何在Maven中让resources目录与构建JAR/classes同级(而非内嵌)

解决Maven将自定义资源目录复制到JAR同级目录的问题

针对你的需求——把src/main/ext-resources复制到JAR同级的resources目录,且不打包进JAR、能通过resources/foo.txt路径访问,咱们一步步修正配置并解决问题:

1. 修正Maven资源插件配置

你的原有配置失效主要有两个原因:执行阶段过早、未排除默认资源打包逻辑。下面是调整后的完整配置:

<build>
    <!-- 先配置主资源规则,避免ext-resources被默认打包进target/classes(即JAR) -->
    <resources>
        <resource>
            <directory>src/main/resources</directory>
        </resource>
        <resource>
            <directory>src/main/ext-resources</directory>
            <excludes>
                <exclude>**/*</exclude>
            </excludes>
        </resource>
    </resources>

    <plugins>
        <!-- 配置资源插件复制ext-resources到target/resources -->
        <plugin>
            <artifactId>maven-resources-plugin</artifactId>
            <version>3.3.1</version> <!-- 建议用较新的稳定版本,避免旧版bug -->
            <executions>
                <execution>
                    <id>copy-external-resources</id>
                    <phase>process-resources</phase> <!-- 改用process-resources阶段,这是Maven处理资源的标准时机 -->
                    <goals>
                        <goal>copy-resources</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${project.build.directory}/resources</outputDirectory>
                        <resources>
                            <resource>
                                <directory>src/main/ext-resources</directory>
                                <filtering>false</filtering> <!-- 不需要变量替换的话设为false,提升效率 -->
                            </resource>
                        </resources>
                    </configuration>
                </execution>
            </executions>
        </plugin>

        <!-- 可选:明确配置JAR插件排除resources目录,确保绝对不会被打包进JAR -->
        <plugin>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.3.0</version>
            <configuration>
                <excludes>
                    <exclude>resources/**</exclude>
                </excludes>
            </configuration>
        </plugin>
    </plugins>
</build>

2. 配置IntelliJ运行环境的工作目录

要在IntelliJ中运行时也能通过resources/foo.txt访问文件,需要调整运行配置的工作目录:

  • 打开Run/Debug Configurations
  • 找到你的应用运行配置
  • 在Working directory选项中选择$MODULE_DIR$/target,这样运行时的工作目录就是target,resources目录就在此目录下,项目可以直接用相对路径访问

3. 验证配置是否生效

执行Maven命令:

mvn clean process-resources

检查target/resources目录,应该能看到src/main/ext-resources下的所有文件和子目录。如果要打包,执行mvn clean package,最终JAR会在target目录下,旁边就是同级的resources目录,完全符合你的需求。

失效原因复盘

  • 你之前使用的validate阶段是Maven生命周期中极早的阶段,可能在资源目录初始化完成前就执行了复制,导致失败
  • 未排除src/main/ext-resources被默认资源流程复制到target/classes,所以才会出现错误复制到classes目录的情况
  • 使用了较旧版本的maven-resources-plugin(2.6),升级新版本能避免一些已知的兼容性问题

内容的提问来源于stack exchange,提问作者Ethan McTague

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:05:07