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

Maven构建复制文件最优方案及maven-resources-plugin软链接报错解决

问题原因确认

你遇到的是maven-resources-plugin:3.2.0的已知缺陷,该版本在修复文件权限保留的问题后,新增了符号链接复制前的目标存在性校验逻辑,会按软链接写死的路径即时校验目标是否存在,不会等整个目录树复制完成,所以相对路径软链接先于目标文件被复制时就会直接报错。

针对maven-resources-plugin的临时解决方案

如果要继续使用3.2.0版本,可以调整插件配置关闭符号链接跟随,直接复制软链接本身:

<plugin>
  <artifactId>maven-resources-plugin</artifactId>
  <version>3.2.0</version>
  <configuration>
    <followSymlinks>false</followSymlinks>
  </configuration>
</plugin>

该方案仅适用于不需要展开软链接的场景,如果你需要处理软链接指向的内容,此配置不适用。

复杂文件树复制的最优方案

maven-resources-plugin本身定位是处理项目普通资源文件,不是设计用来复制JDK这类包含只读文件、软链接、特殊权限的完整目录树的,更推荐以下两种成熟方案:

方案1:使用maven-antrun-plugin调用复制逻辑

该方案兼容性最强,支持跨平台处理所有特殊文件属性:

<plugin>
  <artifactId>maven-antrun-plugin</artifactId>
  <version>3.1.0</version>
  <executions>
    <execution>
      <id>copy-jdk</id>
      <phase>process-resources</phase>
      <goals>
        <goal>run</goal>
      </goals>
      <configuration>
        <tasks>
          <copy todir="${product.install.folder}/jdk" 
                overwrite="true" 
                preserveLastModified="true"
                preservePermissions="true">
            <fileset dir="${jdk.tmp.folder}/${jdk.directory}" includes="**/*"/>
          </copy>
        </tasks>
      </configuration>
    </execution>
  </executions>
</plugin>

Ant的copy任务原生支持保留权限、软链接复制、只读文件覆盖,完全适配JDK目录的复制需求。

方案2:使用exec-maven-plugin调用系统原生复制命令

如果是固定在Linux/Unix环境下构建,直接调用cp命令性能最高,处理软链接和权限最准确:

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>exec-maven-plugin</artifactId>
  <version>3.1.0</version>
  <executions>
    <execution>
      <id>copy-jdk</id>
      <phase>process-resources</phase>
      <goals>
        <goal>exec</goal>
      </goals>
      <configuration>
        <executable>cp</executable>
        <arguments>
          <argument>-a</argument>
          <argument>${jdk.tmp.folder}/${jdk.directory}/.</argument>
          <argument>${product.install.folder}/jdk/</argument>
        </arguments>
      </configuration>
    </execution>
  </executions>
</plugin>

cp -a参数会递归复制目录、保留所有权限、软链接属性、文件修改时间,是Unix环境下复制完整目录树的最优选择,性能远高于Java实现的复制逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 10:15:03