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

Java 19在CentOS7 Docker容器中出现FileChannelImpl.transferFrom0未实现错误

解决Java 19 + CentOS 7.9 Docker容器中Maven插件的IOException问题

问题现象

  • 仅在Java 19环境下运行Maven插件时触发java.io.IOException: Function not implemented异常,Java 18环境可正常执行
  • 异常仅出现在CentOS 7.9.2009的Docker容器中,同配置的Ubuntu 20.04(内核5.15.0-52-generic)容器无此问题

报错堆栈

Caused by: java.io.IOException: Function not implemented
Oct 28 12:12:49     at sun.nio.ch.FileChannelImpl.transferFrom0 (Native Method)
Oct 28 12:12:49     at sun.nio.ch.FileChannelImpl.transferFromDirectlyInternal (FileChannelImpl.java:804)
Oct 28 12:12:49     at sun.nio.ch.FileChannelImpl.transferFromDirectly (FileChannelImpl.java:833)
Oct 28 12:12:49     at sun.nio.ch.FileChannelImpl.transferFrom (FileChannelImpl.java:935)
Oct 28 12:12:49     at org.codehaus.plexus.util.FileUtils.doCopyFile (FileUtils.java:1077)
Oct 28 12:12:49     at org.codehaus.plexus.util.FileUtils.copyFile (FileUtils.java:1049)

环境版本信息

Apache Maven 3.8.6 (84538c9988a25aec085021c365c560670ad80f63)
Java version: 19, vendor: Eclipse Adoptium, runtime: /opt/java/openjdk
OS name: "linux", version: "3.10.0-1160.76.1.el7.x86_64", arch: "amd64", family: "unix"

核心原因

CentOS 7.9搭载的3.10.0内核版本过旧,Java 19对FileChannel.transferFrom的底层实现做了调整,依赖的部分系统调用特性在3.10内核中未被支持,导致原生方法调用失败。而Ubuntu 20.04的5.15内核完全兼容这些新特性,因此无异常。

解决方法

  • 降级Java版本:切换回Java 18版本,直接规避内核与Java版本的兼容性问题。
  • 升级容器内核:若环境允许,将CentOS容器的内核升级至4.18及以上版本(如CentOS 8默认内核),解决系统调用的兼容性问题。
  • 升级Plexus Utils依赖:将项目依赖的plexus-utils版本升级到3.4.2及以上,该版本修复了transferFrom调用失败的降级逻辑,会自动 fallback 到传统流拷贝方式。
  • 添加JVM参数:在Maven运行时添加JVM参数 -Dsun.nio.ch.useDirectBuffer=false,强制Java使用非直接缓冲区,绕过问题触发的transferFrom原生调用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 19:20:17