Как исправить ошибку Springboot Не удалось получить заглушку RMIServer: ошибка javax.naming.CommunicationException во время установления соединения JRMP
У меня проблема с
springboot
maven
проект и
cassandra
в
docker
. Я хочу выполнить
mvn verify
И в
pre-integration-test
чтобы запустить докер cassandra и сервер api, выполните тест, а затем в
post-integration-test
чтобы остановить сервер, но я столкнулся с ошибкой
Could not contact Spring Boot application: Failed to retrieve RMIServer stub: javax.naming.CommunicationException [Root exception is java.rmi.ConnectIOException: error during JRMP connection establishment;
Я создал
github
репо, чтобы вы могли легко воспроизвести ошибку.
Шаги по воспроизведению :
git clone https://github.com/gandra/docker-cassandra-with-initial-seed.git
cd docker-cassandra-with-initial-seed
mvn verify
это приведет к такой ошибке:
[INFO]
[INFO] --- spring-boot-maven-plugin:2.2.2.RELEASE:start (api-server-start) @ docker-cassandra-with-initial-seed ---
[INFO] Attaching agents: []
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 18.501 s
[INFO] Finished at: 2021-01-21T18:39:05+01:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.2.2.RELEASE:start (api-server-start) on project docker-cassandra-with-initial-seed: Could not contact Spring Boot application: Failed to retrieve RMIServer stub: javax.naming.CommunicationException [Root exception is java.rmi.ConnectIOException: error during JRMP connection establishment; nested exception is:
[ERROR] java.io.EOFException]
[ERROR] -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
Есть идеи, как исправить.
ps Я работаю на Mac, и это решение будет работать и на Mac, и на Linux.
3 ответа
Код https://github.com/gandra/docker-cassandra-with-initial-seed исправлен и теперь работает.
В основном изменены 2 вещи:
- Удалено сопоставление портов 9001 из docker-cassandra.sh.
- Добавлен
sleep 20
секунд в функции cassandra_start вdocker-cassandra.sh
чтобы дать Кассандре время правильно загрузиться. Неприятно, но, по крайней мере, работает.
Теперь следующий код должен работать с успешным выполнением 1 интеграционного теста:
git clone https://github.com/gandra/docker-cassandra-with-initial-seed.git
cd docker-cassandra-with-initial-seed
mvn verify
Если вы используете Windows, в 2020 году была решена проблема, которую немного сложно найти (здесь полная ветка на Github, если вы хотите прочитать полную историю).
Напомним, решение состоит в том, чтобы исправить
jmxPort
. Например:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<jmxPort>9011</jmxPort>
</configuration>
[...]
Проблема здесь в том, что он пытается использовать порт, который уже используется. У меня была аналогичная проблема с весенней загрузкой (не с кассандрой).
Я вижу два пути решения этой проблемы:
Первый способ:
- Найдите программу, которая использует этот порт (в моем случае это был «Центр управления графикой Intel (R)» на порту 9001). (вы можете использовать netstat / a / b в командной строке) или использовать tcpview (внешняя бесплатная программа)
- отключить программу
- Выгода
Второй способ
настройка порта jmx в вашем pom с помощью плагина spring-boot-maven-plugin(ответ от sixro), НО мне не нравится этот способ, потому что вы в основном заставляете других в своем проекте использовать ваш обходной путь, в то время как проблема находится на вашем Machien.