如何抑制 Octave io 包加载警告:“OpenJDK 64 位服务器 VM 警告:存档... java.system.class.loader 属性

问题描述

Octave 有没有办法抑制下面的 io 包加载警告消息:

OpenJDK 64 位服务器 VM 警告:存档的非系统类被禁用,因为指定了 java.system.class.loader 属性(值 = "org.octave.OctClassLoader")。要使用归档的非系统类,必须不设置此属性

我无法控制 io 包加载正在做什么,我的程序的其余部分工作正常。但是它使控制台输出变得混乱非常烦人。

我在 Xubuntu 18.04 中运行八度音程脚本

谢谢!

解决方法

我不知道这是否与 io 包本身有关。这可能就是您设置八度音程以在系统上使用 java 的方式。

此外,这个警告似乎是由 Java 生成的,而不是由八度音程生成的,所以我怀疑您是否可以从 in 八度音程中执行任何操作来将其关闭。

实际上它的意思是,大概 io(或您正在使用的 io 包中的特定函数)依赖于 java interface,并且以某种方式运行 java 命令并设置了 -D 属性如您的警告中所述(即,大概是 java -Djava.system.class.loader="org.octave.OctClassLoader" ...)。

following excerpt from the manual 可能与您相关:

您可以在名为 java.opts 的文件中指定用于创建 JVM 的选项。这是一个文本文件,您可以在其中输入包含 -X 和 -D 选项的行,然后在初始化期间将这些选项传递给 JVM。

Java 选项文件所在的目录由环境变量 OCTAVE_JAVA_DIR 指定。如果取消设置,则使用 javaclasspath.m 所在的目录(通常为 OCTAVE_HOME/share/octave/OCTAVE_VERSION/m/java/)。你可以通过执行

找到这个目录
which javaclasspath
,

这似乎已在 Octave bug #55174 中修复。

hackish 解决方法(二进制编辑 Octave 库):

cp -ai /usr/lib/x86_64-linux-gnu/liboctinterp.so.7.0.1 a
bbe -e 's/-Djava.system.class.loader=org.octave.OctClassLoader/-Dfoo=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/' a > b
ls -l a b  # Make sure the binary edit did not change the file length!
chmod 644 b
sudo cp -ai b /usr/lib/x86_64-linux-gnu/liboctinterp.so.7.0.1
sudo chown root.root /usr/lib/x86_64-linux-gnu/liboctinterp.so.7.0.1