如何为Spring Boot应用程序配置端口

1059

如何配置Spring Boot应用程序监听的TCP/IP端口,以便不使用默认的8080端口。


12
如果有人感兴趣,这里展示了如何有多个端口-https://dev59.com/GVoV5IYBdhLWcg3wXNs9 - Betlista
如果您使用“yml”文件进行配置,则可以使用以下内容: server: port: 8081 同时,将您的主类注释为“@SpringBootApplication”,并删除“@EnableAutoConfiguration”。 - Keaz
你的项目[application.properties]中添加以下内容: server.port=8080 - Lahiru Samishka
在应用程序属性中设置server.port=8080。此配置位于org.springframework.boot.autoconfigure.web下的ServerProperties.class类中。 - Atif
64个回答

1561

文档中所述,要么使用命令行选项将server.port设置为系统属性,例如-Dserver.port=8090,要么在/src/main/resources/中添加application.properties文件。

server.port=8090

要使用随机端口,请使用:

server.port=0

同样,在/src/main/resources/中添加application.yml文件,内容如下:

server:
  port: 8090

76
当使用随机端口时,可以使用@Value("${local.server.port}")获取端口信息。 - azizunsal
52
实际上,命令行选项是--server.port=8090而不是-Dserver.port=8090。详情请见:http://docs.spring.io/spring-boot/docs/current/reference/html/howto-properties-and-configuration.html#howto-use-short-command-line-arguments - alpert
1
作为对这个答案的补充:根据Spring文档 ,您可以将application.properties放在其他路径上。 在我的情况下,这非常有帮助。 - sargas
17
-Dserver.port=XXXX 对我无效。我使用操作系统环境变量模式: $ SERVER_PORT=8090 java -jar <path/to/my/jar> - Soumya Kanti
16
(1) java -Dserver.port=XXXX -jar <path/to/my/jar>和(2) java -jar <path/to/my/jar> --server.port=YYYY都可以工作。第一条命令定义了 server.port 的系统属性,而第二条命令通过命令行参数(String... argsmain 方法中)传递该属性。此外,如果使用 java -Dserver.port=XXXX -jar <path/to/my/jar> --server.port=YYYY 运行,则 YYYY 优先于 XXXX,这就是为什么 Spring Boot 外部化配置如此迷人的原因。 - tan9
显示剩余12条评论

270

在Spring Boot应用程序中,更改嵌入式Tomcat端口有两种主要方法。

修改application.properties文件

首先,您可以尝试在/resources文件夹中使用application.properties文件:

server.port = 8090

application.properties file

修改虚拟机选项

第二种方法是,如果您想避免修改任何文件并检入仅在本地需要的内容,则可以使用vm参数:

进入运行 -> 编辑配置 -> VM选项

-Dserver.port=8090

使用VM参数更改端口

此外,如果需要更多信息,可以在此查看以下博客文章:如何更改Spring Boot应用程序的端口


在STS 4中,它位于运行->运行配置->主要选项卡,然后向下滚动到具有参数名称和值的表格。 - serv-inc

209

由于Spring Boot提供了各种配置外部化机制(通过各种PropertySource实现和/或处理器连接到Environment对象中),因此您可以通过以下方法在jar存档之外设置任何属性:

  1. 将属性作为应用程序参数通过命令行参数传递

    java -jar <path/to/my/jar> --server.port=7788
    
  2. 从属性 SPRING_APPLICATION_JSON 中获取(适用于 Spring Boot 1.3.0+)

    • 在Unix shell中定义环境变量:

    • SPRING_APPLICATION_JSON='{"server.port":7788}' java -jar <path/to/my/jar>
      
    • 通过使用Java系统属性:

      java -Dspring.application.json='{"server.port":7788}' -jar <path/to/my/jar>
      
    • 通过命令行参数传递:

      java -jar <path/to/my/jar> --spring.application.json='{"server.port":7788}'
      
    • 定义JVM系统属性

    • java -Dserver.port=7788 -jar <path/to/my/jar>
      
    • Windows Command Prompt

    An OS environment variable is a setting that contains information about the operating system environment, such as the path to executables, default search paths for libraries, and configuration settings. They can be accessed and modified by various software programs, scripts, and batch files.

  3. SERVER_PORT=7788 java -jar <path/to/my/jar>
    
  4. Windows

  5. SET SERVER_PORT=7788
    java -jar <path/to/my/jar>
    
  6. 将属性放置在./config/application.properties 配置文件

  7. server.port=7788
    

    并运行:

     java -jar <path/to/my/jar>
    
  8. 将属性放置在./config/application.yaml

  9. server:
        port: 7788
    

    并运行:

     java -jar <path/to/my/jar>
    
  10. 将属性放置在./application.properties

  11. server.port=7788
    

    并运行:

     java -jar <path/to/my/jar>
    
  12. 将属性放置在./application.yaml

  13. server:
        port: 7788
    

    并运行:

     java -jar <path/to/my/jar>
    
    你可以将上述方法全部结合起来,而列表中较早的配置将优先于较晚的配置应用。
    例如:
    SERVER_PORT=2266 java -Dserver.port=5566 -jar <path/to/my/jar> --server.port=7788
    

    服务器将启动并监听7788端口。

    在Spring Boot的设计哲学中,提供具有较低优先级的属性源(通常打包在归档文件或编码源代码中),并在运行时环境中覆盖它非常有用:

    在默认情况下具有自己的观点,但当需求开始与默认设置分歧时,尽快脱离。


    SERVER_NAMEserver.name的转换是通过Relaxed Binding完成的。


138

此外,您可以通过编程方式配置端口。

对于Spring Boot 2.x.x:

@Configuration
public class CustomContainer implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> {
  public void customize(ConfigurableServletWebServerFactory factory){
    factory.setPort(8042);
  }
}

对于较旧的版本:

@Configuration
public class ServletConfig {
    @Bean
    public EmbeddedServletContainerCustomizer containerCustomizer() {
        return (container -> {
            container.setPort(8012);
        });
    }
}

2
这非常有效,当您在自己的配置文件中有端口并且想要在运行时设置它时。 - Xdg
6
当我需要将一个应用程序部署到 AWS 弹性 Beanstalk 服务并从环境变量中获取端口时,这很有帮助。 - Martin Hansen
这非常有用,当您只需要一个自包含的单元或集成测试时,+1。 - Priidu Neemre
当端口的环境变量已经在不同的名称下定义时,这非常有用。 - higuaro
2
是不是应该使用@Configuration而不是@Controller?如果是,请更新。 - Lucky
显示剩余3条评论

108
如果您想在本地运行它,请使用以下内容 -
mvn spring-boot:run -Drun.jvmArguments='-Dserver.port=8085'

从Spring Boot 2.0开始,以下是可用的命令:
mvn spring-boot:run -Dspring-boot.run.arguments=--server.port=8085

线索位于:


5
从Spring Boot 2开始,您应该使用 spring-boot.run.jvmArguments - mapm
1
-Dspring-boot.run.arguments 可用于 Spring Boot 3。 - Marco Sulla
对于第一个命令,不带''也是有效的 - 因此mvn spring-boot:run -Drun.jvmArguments=-Dserver.port=8085可以正常工作。在SB 3.1.1上进行了测试。 - Manuel Jordan

97

你可以在Java代码中设置端口:

HashMap<String, Object> props = new HashMap<>();
props.put("server.port", 9999);

new SpringApplicationBuilder()
    .sources(SampleController.class)                
    .properties(props)
    .run(args);

或者在application.yml中:

server:
    port: 9999

或者在application.properties中:

server.port=9999

或者作为命令行参数:

-Dserver.port=9999

只有当应用程序的属性或.yml文件中没有设置端口时,使用HashMap才有效。 - Milgo
我有一个作为实用工具的第二个“应用程序”类,并且我只想在其中设置不同的端口。因此,所有基于配置文件的方法对我都没有帮助。在快要放弃的时候,我找到了你的编程方法。谢谢! - user2081279

62

如果您正在使用application.yml,请将以下行添加到其中

server:
     port: 9000

当然,对于随机端口来说,值为0。


1
这似乎没有起作用。我在application.yml中使用了server.port,它起作用了。 - yathirigan
另外,请确保在冒号和值之间保留一个空格。 - Upulie Han

53

正如Spring文档所解释的那样,有几种方法可以做到:

要么在命令行中设置端口(例如8888)

-Dserver.port=8888--server.port=8888

示例:java -jar -Dserver.port=8888 test.jar

或者在application.properties文件中设置端口。

server.port=${port:4588}
或者(在具有YAML语法的application.yml中)
server:
   port: ${port:4588}

如果在命令行中传递了-Dport(或-Dserver.port)指定的端口,则会使用该端口。否则,将默认使用4588端口。

如果您想在属性文件中强制指定端口,无论环境变量如何,只需编写:

server.port=8888

43
application.properties中包含以下属性。
server.port=8080

这个不起作用。哪个application.properties文件?哪些属性可以覆盖它?我怎么确定Spring正在使用它? - Philip Rego

30

当您需要以编程方式执行此操作时,您可以在启动时设置它:

System.getProperties().put( "server.port", 80 );
SpringApplication.run(App.class, args);

这可能对诸如环境相关端口之类的事情有所帮助。

祝您拥有美好的一天。


2
System.setProperty("server.port", 80); 是实现相同效果的另一种方式。 - hd1
@hd1,我已经将我们的答案添加到主要答案中,请查看并根据需要进行修改。 - Luis Mauricio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接