如何在运行时设置java.net.preferIPv4Stack = true?

Abh*_*kar 34 java broadcast ipv4 ipv6

我需要禁用IPv6.为此,java文档表明设置jvm属性java.net.preferIPv4Stack=true.

但我不明白如何从代码本身做到这一点.

许多论坛演示了从命令提示符执行此操作,但我需要在运行时执行此操作.

Kal*_*Kal 51

您可以使用 System.setProperty("java.net.preferIPv4Stack" , "true");

这相当于通过命令行传递它 -Djava.net.preferIPv4Stack=true

  • 你确定这会起作用吗?从查看[来源](http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/net/InetAddress.java#InetAddress.0preferIPv6Address)看来对我来说,`java.net.preferIPv4Stack`仅在JVM启动时读取,然后再也不会读取.可能是错的. (5认同)
  • @Kal peterh是对的,你必须通过命令行参数设置它,通过JVM内部的System.setProperty设置它将无法工作,因为它是在JVM启动时读取的 (4认同)
  • 这对IPv4来说似乎很正常.它是标准的0.0.0.0网络广播地址. (3认同)

Jam*_*ove 9

另一种方法,如果你绝望并且无法访问(a)代码或(b)命令行,那么你可以使用环境变量:

http://docs.oracle.com/javase/7/docs/webnotes/tsg/TSG-Desktop/html/plugin.html.

专门为java web start设置环境变量:

JAVAWS_VM_ARGS

对于小程序:

_JPI_VM_OPTIONS

例如

_JPI_VM_OPTIONS = -Djava.net.preferIPv4Stack =真

此外,在Windows下,可以在"Java"选项卡下的Java控制计划页面中设置全局选项(对于常规Java应用程序).


小智 9

我遇到了这个问题,尝试从运行Java 7的Web服务器中的Web应用程序发送带有javax.mail的邮件.内部邮件服务器目标失败,"网络无法访问",尽管telnet和ping工作来自同一主机,而外部邮件服务器工作.我试过了

System.setProperty("java.net.preferIPv4Stack" , "true");
Run Code Online (Sandbox Code Playgroud)

在代码中,但失败了.因此参数值可能早于系统缓存.设置VM参数

-Djava.net.preferIPv4Stack=true
Run Code Online (Sandbox Code Playgroud)

在Web服务器启动脚本工作.

还有一点证据:在一个非常小的目标测试程序中,在代码中设置系统属性确实有效.因此,当使用第一个Socket时,可能会缓存该参数,可能不仅仅是在JVM启动时.