以编程方式检查(无字符串匹配)是否使用IPV6或IPV4进行JVM

Pet*_*nce 5 java matlab jvm

我想检查特定应用程序(在本例中为Matlab)的JVM选项是否已设置为更喜欢IPV4,或者它们是否仍使用IPV6.

我知道如何将JVM设置为更喜欢IPV4.在我的情况下,可以通过添加行来完成

-Djava.net.preferIPv4Stack=true

到$ MATLABROOT/bin/maci64 /中的java.opts文件.

我还可以检查这行是否已经通过字符串匹配添加到java.opts.我已经粘贴了我当前的解决方案(一个检查字符串匹配的Matlab脚本,如果它不存在则添加该行)在这个问题的底部.

但是,我不知道如何在没有字符串匹配的情况下检查IPV4或IPV6是否是首选.显然这似乎是首选.

有没有人知道如何在没有字符串匹配的情况下检查JVM中的IPV4与IPV6?

这是我目前的解决方案,取决于字符串匹配:

% OSX platform-specific: revert to IPv4
if (computer('arch') == 'maci64')
  javaoptspath = fileread([matlabroot '/bin/' computer('arch') '/java.opts']);
  k = strfind(javaoptspath, '-Djava.net.preferIPv4Stack=true');
  if isempty(k)
    setenv('DRAKE_IPV4_SET_MATLABROOT', matlabroot)
    setenv('DRAKE_IPV4_SET_ARCH', computer('arch'))
    display('Since you are on Mac, we will need to set your JVM to prefer IPV4 instead of IPV6 for MATLAB')
    display('Please enter your sudo password below')
    ! (echo "" | echo "-Djava.net.preferIPv4Stack=true") | sudo tee -a $DRAKE_IPV4_SET_MATLABROOT/bin/$DRAKE_IPV4_SET_ARCH/java.opts
  end
end
Run Code Online (Sandbox Code Playgroud)

rde*_*its 2

您可以直接使用 Matlab 中的类来访问底层 java 系统属性,而无需解析选项字符串java.lang.System

例如:

ipv4_preferred = java.lang.System.getProperty('java.net.preferIPv4Stack')
Run Code Online (Sandbox Code Playgroud)

如果用户没有设置, getProperty 的结果将为空-Djava.net.preferIPv4Stack=...,所以更完整的解决方案可能是:

ipv4_preferred = java.lang.System.getProperty('java.net.preferIPv4Stack');
if isempty(ipv4_preferred)
  ipv4_preferred = false;
end
Run Code Online (Sandbox Code Playgroud)