如何修复 springboot 错误 Failed to retrieve RMIServer stub: javax.naming.CommunicationException error during JRMP connection establishment

How to fix springboot error Failed to retrieve RMIServer stub: javax.naming.CommunicationException error during JRMP connection establishment

我在 springboot maven 项目和 docker 中的 cassandra 有问题。 我想执行 mvn verify 并在 pre-integration-test 中启动 cassandra docker 和 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

知道如何修复。

p.s。 我正在研究 mac,此解决方案也适用于 mac 和 linux。

代码 https://github.com/gandra/docker-cassandra-with-initial-seed 已修复,现在可以使用。

基本上改变了两件事:

  1. 已从 docker-cassandra.sh.
  2. 中删除端口映射 9001
  3. docker-cassandra.sh 的 cassandra_start 函数中添加了 sleep 20 秒,以便为 cassandra 提供正确启动的时间。不好,但至少可以工作。

现在以下代码应该可以与成功执行的 1 个集成测试一起使用:

git clone https://github.com/gandra/docker-cassandra-with-initial-seed.git
cd docker-cassandra-with-initial-seed
mvn verify

如果您使用的是 Windows,则 2020 年解决了一个问题,该问题很难找到(here Github 上的完整主题,如果您想阅读全文)。
回顾一下,解决方案是修复 jmxPort。例如:

    <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
          <jmxPort>9011</jmxPort>
        </configuration>
    [...]

这里的问题是他试图使用一个已经被使用的端口。 我在 spring 启动时遇到了类似的问题(而不是 cassandra)。

我认为解决这个问题的两种方法:

第一种方式:

  1. 找到正在使用该端口的程序(在我的例子中是端口 9001 上的“Intel(R) 图形命令中心”)。 (您可以在命令提示符下使用 netstat /a /b)或使用 tcpview(外部免费程序)
  2. 禁用程序
  3. 利润

第二种方式

在 spring-boot-maven-plugin 的 pom 中配置 jmx 端口 (来自sixro的回答) 但是,我不喜欢这种方式,因为你基本上强迫项目中的其他人使用你的解决方法,而问题出在你的机器上。