如果我运行以下代码
public class NetworkTester {
public static void main( String[] args ) {
System.setProperty( "java.net.preferIPv6Addresses", "true" );
System.setProperty( "java.net.preferIPv4Stack", "false" );
try {
InetAddress addr = InetAddress.getByName( "www.google.com" );
System.out.println( addr );
if ( addr instanceof Inet4Address ) {
System.out.println( 4 );
}
if ( addr instanceof Inet6Address ) {
System.out.println( 6 );
}
} catch ( UnknownHostException e ) {
e.printStackTrace();
}
}}
我得到以下输出
www.google.com/2607:f8b0:4009:801:0:0:0:2004
6
但是,如果我添加行
private static Logger log4j = LogManager.getLogger();
我导入以下内容
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
我得到了
www.google.com/4.59.40.94
4
我使用的是log4j2 2.6.2和jdk1.8.0_51。如果我使用-Djava.net.preferIPv6Addresses=true
作为vm参数,我会得到一个IPv6地址。但我正在开发的应用程序是作为可执行jar文件运行的,我无法找到一种方法来获取可执行jar来运行vm参数而无需编写某个bat文件或脚本。
如何让我的应用程序更喜欢ipv6并运行log4j?
答案 0 :(得分:1)
您是否尝试将静态初始化程序块添加到主类中,该类在初始化静态Logger字段之前设置属性?
static {
System.setProperty("java.net.preferIPv6Addresses", "true");
}
答案 1 :(得分:0)
您是否曾尝试避免在包含main()
的班级中声明Log4j Logger?如果您将静态Logger声明为此主类的属性,则Log4j将在您的第一个main()
指令之前初始化。
然而,我很想知道Log4j如何阻止您使用IPv6。
注意:如果您想在使用java.net.preferIPv6Addresses
的命令行启动应用时设置java -jar
,可以使用以下命令设置{<1}}
java -Djava.net.preferIPv6Addresses=true -jar myapp.jar
(它没有在你身边工作,可能是因为你在-D
之后放了-jar
?)