Java 19 -文件通道Impl.transferFrom0-函数未实现

zbdgwd5y  于 2022-10-30  发布在  Java
关注(0)|答案(1)|浏览(131)

我在使用Java 19的Maven插件时遇到了一个错误。Java 18运行正常。我该如何解决这个问题?
我在Centos 7.9.2009上的Docker容器中运行。当在Ubuntu 20.0 - kernel 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"
1aaf6o9v

1aaf6o9v1#

我很好奇,所以我深入调查了一下。看来我最初的评论是对的:您内核版本对于此特定函数来说太低:

  • 此处实现了FileChannelImpl.transferFrom0
  • 它首先检查my_copy_file_range_func是否为非空,否则返回IOS_UNSUPPORTED(可能就是这样)。
  • 显然,这里通过寻找符号copy_file_range来初始化my_copy_file_range_func
  • 根据该手册页,该系统调用被添加到Linux内核4.5中,但从2.27开始在用户空间中由glibc模拟。

Linux 4.5于2016年3月发布,glibc 2.27于2018年2月发布。
由于libc实际上是由容器提供的,因此在使用它时(注意,像Alpine这样基于musl的容器可能有其他要求),确保您的 container 包含比2.27更新的glibc版本就足够了。
请注意,该函数的用户空间仿真不会提供真实的内核实现所能提供的零复制效率增益(即,它将比在更新的内核上运行更慢)。

相关问题