JavaはIPv6がお好き

今日、以前から悩んでいたJavaの問題が解決(?)してほっとした。ソケットのアプリが、SMTPサーバに connect 出来ないのである。しかし、同じ PC から TELNET でポート25にアクセスできる。なぜ、自作のJavaアプリではだめ?
ただ、同じアプリも違う環境では動作する?なぜ?動かない PC のネットワークの設定 (firewall) がダメ?でも、仮に outbound をブロックしているのであれば TELNET でもダメなはず。なぜ Java だけ嫌われる?まったくわからん。
ただ、以前からそれを解決しないと次に進めないというわけではなく、奥歯にはさまったゴミと同程度。しかし、やっとわかった。というか、今まで知らなかったことが恥ずかしい。Java では IPv4/v6 のデュアルスタック環境では IPv6 を優先して使用するようだ。おそらく相手は v6 で connect されることを想定していないのであろう。
こういう場合、対処法は大きく2つ。javaコマンドラインに -Djava.net.preferIPv4Stack=trueを指定する、またはプログラムのコードとしてSystem.setProperty("java.net.preferIPv4Stack","true"); を書き入れる。
毎回、実行時にオプション指定をするのも面倒なので (そもそも長い) プログラムコードに書き入れることにしたが、これは結構ハマルのではないかと思う。IPv6だダメだったら動的にIPv4でリトライしてほしいのが・・・
いずれにせよ、動かない理由がわかってスッキリ。