Java 可以用不同的端口实例化同一个spring boot应用程序两次吗?

Java 可以用不同的端口实例化同一个spring boot应用程序两次吗?,java,spring,spring-boot,Java,Spring,Spring Boot,我需要使用嵌入式tomcat使用不同的端口实例化同一个spring boot应用程序两次,以便这两个实例相互使用rest api。目标是模拟两个独立的程序,逻辑与两个玩家相同 我尝试了以下方法: SpringApplicationBuilder playerOne = new SpringApplicationBuilder(GameApplication.class) .properties("server.port:" + "8080", "a

我需要使用嵌入式tomcat使用不同的端口实例化同一个spring boot应用程序两次,以便这两个实例相互使用rest api。目标是模拟两个独立的程序,逻辑与两个玩家相同

我尝试了以下方法:

        SpringApplicationBuilder playerOne = new SpringApplicationBuilder(GameApplication.class)
                .properties("server.port:" + "8080", "app.name:" + "Player1", "spring.jmx.enable:false");

        SpringApplicationBuilder playerTwo = new SpringApplicationBuilder(GameApplication.class)
                .properties("server.port:" + "8081", "app.name:" + "Player2", "spring.jmx.enable:false");

        ConfigurableApplicationContext run1 = playerOne.run();
        ConfigurableApplicationContext run2 = playerTwo.run();
我得到了javax.management.InstanceAlreadyExistsException

如何才能做到这一点?
它不应该启动两个不同的服务器吗?

您将在尝试执行的操作中遇到很多问题。我不认为Spring的设计允许两个独立的Spring应用在同一个过程中

这两个应用程序之间可能会发生许多冲突,您正遇到其中的第一个。您将获得“javax.management.InstanceAlreadyExistsException”,因为Spring具有JMX管理bean注册表的全局概念。当Spring应用程序启动时,它会以特定的名称向该服务注册一系列内容。当应用程序的第二个副本尝试将第一个应用程序已使用相同名称注册的内容注册到注册表时,您会遇到此错误

应用程序本身以这种方式注册,名称为“SpringApplication”。当我运行我的Spring应用程序时,这是注册的第一件事。我猜你的“应用程序”在第二次尝试向JMX注册此名称时失败了


如果你真的必须这样分解代码,为什么不将这两个应用程序放在它们自己的版本中并分别运行呢?或者,如果它们是完全相同的应用程序,只需运行两个副本,正如@ThomasAndolf在其回答中所建议的那样。

将server.port=0添加到您的application.properties。它将动态分配端口。

运行jar并将端口作为输入参数

然后可以使用两个已知端口启动两个应用程序

java -jar myServer.jar --server.port=8080

java -jar myServer.jar --server.port=8081

即使启动正确,
playerTwo
不知道正在监听哪个端口时,
playerTwo
如何与
playerTwo
通信?似乎应该有一个实例和两个连接的客户端。您可以在两个独立的JVM中运行它们。我认为这不会修复OP报告的错误。该错误与端口冲突无关是的,同意。我认为两个JVM就足够了。是的!这正是我在回答结束时提出的建议。这是执行OP试图执行的操作的正确方法。
$ mvn spring-boot:run

$ env SERVER_PORT=8001 mvn spring-boot:run

$ env SERVER_PORT=8002 mvn spring-boot:run