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

