кажется, что ваша окончательная цитата приходит слишком рано. Должно быть после последнего параметра.
Этот трюк сработал для меня.
Я заметил кое-что интересное: когда я запускаю свое приложение, используя следующую командную строку:
java -Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
Если я пытаюсь подключиться к этому порту с удаленного компьютера с помощью jconsole, соединение TCP успешно выполняется, некоторые данные обмениваются между удаленным jconsole и локальным агентом jmx, где развернут мой MBean, а затем jconsole отображает сообщение об ошибке подключения. Я выполнил захват Wireshark, и он показывает обмен данными как от агента, так и от jconsole.
Таким образом, это не проблема сети, если я выполняю netstat -an с или без системного свойства java.rmi.server.hostname, у меня есть следующие привязки:
TCP 0.0.0.0:9999 0.0.0.0:0 LISTENING
TCP [::]:9999 [::]:0 LISTENING
Это означает, что в обоих случаях сокет, созданный на порту 9999, принимает подключения с любого хоста по любому адресу.
Я думаю, что содержимое этого системного свойства используется где-то при соединении и сравнивается с фактическим IP-адресом, используемым агентом для связи с jconsole. И если эти адреса не совпадают, соединение не устанавливается.
У меня не было этой проблемы при подключении с того же хоста с использованием jconsole, только с реальных физических удаленных хостов. Итак, я полагаю, что эта проверка выполняется только тогда, когда соединение идет извне.