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
相关产品推荐
相关产品推荐

