如何为 Spring Boot 应用程序配置端口
Posted
技术标签:
【中文标题】如何为 Spring Boot 应用程序配置端口【英文标题】:How to configure port for a Spring Boot application 【发布时间】:2014-01-31 17:16:15 【问题描述】:如何配置 Spring Boot 应用程序监听的 TCP/IP 端口,使其不使用默认端口 8080。
【问题讨论】:
如果有人感兴趣,这里展示了如何拥有多个端口 - ***.com/questions/36357135/… 如果您使用“yml”文件进行配置,那么您可以使用此服务器:端口:8081 还将您的主类注释为“@SpringBootApplication”并删除@EnableAutoConfiguration 您的项目 [application.properties] 用于添加 server.port=8080 在应用程序属性中设置server.port=8080
。此配置在org.springframework.boot.autoconfigure.web
下的ServerProperties.class
类中。
【参考方案1】:
作为said in docs 或者使用命令行选项将server.port
设置为系统属性到jvm -Dserver.port=8090
或者在/src/main/resources/
中添加application.properties
server.port=8090
随机端口使用
server.port=0
在/src/main/resources/
中添加application.yml
与
server:
port : 8090
【讨论】:
使用随机端口时,可以通过@Value("$local.server.port")
获取端口信息
实际上命令行选项是--server.port=8090 而不是-Dserver.port=8090。 docs.spring.io/spring-boot/docs/current/reference/html/…
作为对这个答案的补充:根据spring docs,您可以将application.properties
放在其他路径上。就我而言,这很有帮助。
-Dserver.port=XXXX 对我不起作用。我使用了OS环境变量模式:$ SERVER_PORT=8090 java -jar <path/to/my/jar>
(1) java -Dserver.port=XXXX -jar <path/to/my/jar>
和 (2) java -jar <path/to/my/jar> --server.port=YYYY
都有效。第一个命令定义server.port
系统属性,第二个命令通过命令行参数传递属性(main
方法中的String... args
)。此外,如果你使用java -Dserver.port=XXXX -jar <path/to/my/jar> --server.port=YYYY
运行,YYYY
优先于XXXX
,这就是 Spring Boot Externalized Configuration 如此迷人的原因。【参考方案2】:
您可以通过覆盖配置中的EmbeddedServletContainerFactory
bean 来指定端口(基于java 或xml)。在那里,您可以为使用的嵌入式 servlet 容器指定端口。请参阅Spring Boot - Core“嵌入式 Servlet 容器支持”段落和示例。希望这会有所帮助。
【讨论】:
直接链接:docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/… 这是程序化覆盖部分的当前链接:docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/…【参考方案3】:如果您使用的是application.yml
,请添加以下行
server:
port: 9000
当然还有 0 表示随机端口。
【讨论】:
这似乎不起作用。我在 application.yml 中使用了 server.port 并且它工作了【参考方案4】:有两种主要方法可以在 Spring Boot 应用程序中更改嵌入式 Tomcat 中的端口。
修改 application.properties
首先你可以试试 /resources 文件夹中的 application.properties 文件:
server.port = 8090
修改虚拟机选项
第二种方式,如果你想避免修改任何文件并签入你只需要在本地的东西,你可以使用 vm arg:
转到运行 -> 编辑配置 -> 虚拟机选项
-Dserver.port=8090
此外,如果您需要更多信息,可以在此处查看以下博客文章:Changing the port on a Spring Boot Application
【讨论】:
在 STS 4 中它在运行 -> 运行配置 -> 主,然后向下滚动到带有参数名称和值的表【参考方案5】:正如大家所说,你可以在application.properties中指定server.port = 9000(可以是任何其他值)
如果您在项目中使用弹簧执行器,默认情况下它指向 8080,如果要更改,请在 application.properties 中提及management.port = 9001(可以是任何其他值)
【讨论】:
【参考方案6】:另外,您可以通过编程方式配置端口。
对于 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);
);
【讨论】:
当您在自己的配置文件中有端口并想在运行时设置它时,这是有效且非常有用的。 当我需要将应用程序部署到 AWS Elastic Beanstalk 服务以从环境变量中获取端口时,这很有帮助。 当你想要一个独立的单元或集成测试时,这非常有用,+1。 当端口的环境变量已经以不同的名称定义时非常有用。 不是@Configuration
而不是@Controller
?如果有,请更新。【参考方案7】:
确实,最简单的方法是设置 server.port 属性。
如果您使用 STS 作为 IDE,从 3.6.7 版本开始,您实际上有 Spring Properties Editor 用于打开属性文件。
此编辑器为所有 Spring Boot 属性提供自动完成功能。如果你写 port 并按 CTRL + SPACE,server.port 将是第一个选项。
【讨论】:
或者,如果您使用 Intellij IDEA,自动完成功能也可以。 ;)【参考方案8】:您可以通过以下方法添加端口。
运行 -> 配置部分
在application.xml
中添加server.port=XXXX
【讨论】:
您的意思是application.yml
,您使用的是什么IDE?请具体。【参考方案9】:
你可以在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
【讨论】:
只有在 applications.properties 或 .yml 中没有设置端口时,才可以使用 HashMap。 我有第二个“应用程序”类作为实用程序,我只想在其中设置一个不同的端口。因此,所有基于配置文件的方法对我都没有帮助。接近放弃我发现了你的程序化方法。谢谢!【参考方案10】:当您需要以编程方式执行此操作时,您可以在启动时进行设置:
System.getProperties().put( "server.port", 80 );
SpringApplication.run(App.class, args);
这可能有助于环境相关端口等问题。 祝你有美好的一天
【讨论】:
System.setProperty("server.port", 80);
是实现相同目的的另一种方式。
@hd1,我将我们的答案添加到主要答案中,请检查并根据需要进行修改【参考方案11】:
如果你想在本地运行它,使用这个 -
mvn spring-boot:run -Drun.jvmArguments='-Dserver.port=8085'
从 Spring Boot 2.0 开始,以下是有效的命令(线索为 here):
mvn spring-boot:run -Dspring-boot.run.arguments=--server.port=8085
【讨论】:
从 Spring Boot 2 开始,你应该使用spring-boot.run.jvmArguments
。【参考方案12】:
在我的情况下添加声明
server.port=$port:8081
覆盖默认的 tomcat 服务器端口。
【讨论】:
【参考方案13】:您也可以使用SERVER_PORT
环境变量来配置Spring Boot 端口。只需设置环境变量并重启应用即可:
set SERVER_PORT=9999 // on windows machine
export SERVER_PORT=9999 // on linux
请注意,如果您没有在系统范围内设置这些环境变量,您应该在同一个会话中运行启动应用程序。
【讨论】:
【参考方案14】:您可以在 /src/main/resources/ 下的 application.properties 中进行设置
server.port = 8090
【讨论】:
【参考方案15】:将此添加到您的 application.properties
文件中
server.port= 8080
【讨论】:
欢迎来到 SO :-) 请看How to Answer 为什么要在一年后添加相同的asnwer?!?并且server.port 8080
是 Java 属性文件的错误语法...【参考方案16】:
例如使用其他答案中提到的属性 server.port=8080 绝对是一种方法。只是想提一下,您还可以公开环境属性:
SERVER_PORT=8080
由于 spring boot 能够替换“.”在最近的版本中,环境变量的“_”和小写为大写。
这在容器中特别有用,您只需定义环境变量而不添加/编辑application.properties
或通过命令行传递系统属性(即-Dserver.port=$PORT
)
【讨论】:
SERVER_PORT=8081 mvn spring-boot:run
【参考方案17】:
"server.port=8080" 仅在您通过 main 方法将应用程序作为 jar 运行时才有效,
如果您通过 tomcat 容器将此应用程序作为 war 文件运行,则此配置将不起作用。
【讨论】:
【参考方案18】:在application.properties
中包含以下属性
server.port=8080
【讨论】:
这不起作用。什么application.properties?哪些属性可以覆盖这个?我怎么能确定 Spring 正在接受它?【参考方案19】:如果您要在命令环境中将应用程序作为 jar 文件运行,只需键入“SERVER_PORT=***”作为前缀。要执行的完整命令如下所示:
SERVER_PORT=8080 java -jar ***.jar
如果你想在 Linux 后台运行应用程序,带有 'nohup' 的命令将如下所示:
SERVER_PORT=8080 nohup java -jar ***.jar &
【讨论】:
【参考方案20】:由于 Spring Boot 提供 various configuration externalization mechanism(通过各种 PropertySource
实现和/或按顺序连接到 Environment
对象的处理器),您可以通过以下方式设置 jar 存档的任何属性 outside方法:
通过命令行参数传递属性作为应用程序参数
java -jar <path/to/my/jar> --server.port=7788
来自SPRING_APPLICATION_JSON
中的属性(Spring Boot 1.3.0+)
在 U*IX 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>
定义操作系统环境变量
U*IX 外壳
SERVER_PORT=7788 java -jar <path/to/my/jar>
窗户
SET SERVER_PORT=7788
java -jar <path/to/my/jar>
将属性放入./config/application.properties
配置文件
server.port=7788
然后运行:
java -jar <path/to/my/jar>
将属性放置在./config/application.yaml
server:
port: 7788
然后运行:
java -jar <path/to/my/jar>
将属性放在./application.properties
server.port=7788
然后运行:
java -jar <path/to/my/jar>
将属性放置在./application.yaml
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。
这非常有用,可以在 PropertySources 中提供具有较低优先级的默认属性(通常打包在存档中或在源代码中编码),然后在运行时环境中覆盖它。这就是Spring Boot的设计理念:
开箱即用,但随着需求开始偏离默认设置,请尽快退出。
SERVER_NAME
到 server.name
的转换由 Relaxed Binding 完成。
【讨论】:
【参考方案21】:正如Spring documentation 中所述,有几种方法可以做到这一点:
在命令行中设置端口(例如 8888)
-Dserver.port=8888
或 --server.port=8888
例如:java -jar -Dserver.port=8888 test.jar
或者你在application.properties中设置端口
server.port=$port:4588
或(在 application.yml 中使用 yaml 语法)
server:
port: $port:4588
如果-Dport(或-Dserver.port)传递的端口是在命令行中设置的,那么这个端口将被考虑在内。如果没有,则默认端口为 4588。
如果你想在属性文件中强制使用任何环境变量的端口,你只需要写:
server.port=8888
【讨论】:
【参考方案22】:默认端口为:8080,但我们可以在 application.properties 中自定义端口号 如下图
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
server.port = 5050 -- #here we can give any port number.
【讨论】:
【参考方案23】:您可以在 spring boot 项目的资源文件夹中的 application.properties 文件中配置您的端口。
server.port="port which you need"
【讨论】:
【参考方案24】:在资源中存在的application.properties
文件中:
server.port=8082
【讨论】:
【参考方案25】:三种方法
1 在application.properties
文件中设置 server.port 属性
server.port = 8090
2 在application.yml
文件中设置服务器端口属性
server:
port: 8090
3 在main
方法中设置属性为系统属性
System.setProperty("server.port","8090");
【讨论】:
【参考方案26】:扩展其他答案:
测试文档中有一节解释了如何在集成测试中配置端口:
41.3 Testing Spring Boot applications 41.3.3 Working with random ports在集成测试中,使用注释 @SpringBootTest
和 webEnvironment
值进行端口配置。
随机端口:
@SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT)
您可以使用与@Value("$local.server.port")
相同的@LocalServerPort
注入值。
随机端口测试配置:
@RunWith(SpringRunner.class
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class ExampleTest
...
@LocalServerPort //to inject port value
int port;
定义端口:
@SpringBootTest(webEnvironment=WebEnvironment.DEFINED_PORT)
如果已定义,则从 server.port
获取值。
@TestPropertySource(properties = "server.port=9192")
定义,它将覆盖其他定义的值。
如果没有,则从src/test/resources/application.properties
(如果存在)中获取值。
最后,如果未定义,则以默认 8080
开头。
例子:
定义端口测试配置:
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
@TestPropertySource(properties = "server.port=9192")
public class DemoApplicationTests
@Test
public void contextLoads()
【讨论】:
【参考方案27】:只需在项目的src/main/resources
中有一个application.properties
并提供给那里
server.port=****
其中****
指的是端口号。
【讨论】:
【参考方案28】:这对我有用:
添加了自定义容器类:
@Component
public class CustomContainer implements EmbeddedServletContainerCustomizer
@Override
public void customize(ConfigurableEmbeddedServletContainer configurableEmbeddedServletContainer)
configurableEmbeddedServletContainer.setPort(8888);
但这仍然没有使用端口 8888。
然后我在我的主要方法的“@SpringBootApplication”类上设置“scanBasePackages”属性:(scanBasePackages = "custom container package")
@SpringBootApplication(scanBasePackages = "com.javabrains.util")
public class CourseApiApp
public static void main (String args [])
SpringApplication.run(CourseApiApp.class, args);
它开始拾取自定义容器中设置的端口。
【讨论】:
【参考方案29】:由于嵌入式 Tomcat,大部分 springboot 运行在 port:8080
上。在某些情况下,它可能会引发错误port 8080 already in use
。为了避免此类问题,我们可以配置服务器端口。
使用 application.properties
添加server.port=9898
关于运行时配置
使用以下参数运行您的应用程序。
spring-boot:run -Drun.jvmArguments='-Dserver.port=8081'
【讨论】:
【参考方案30】:1.1 通过属性文件更新。
/src/main/resources/application.properties
server.port=8888
通过 yaml 文件更新。
server:
port: 8888
EmbeddedServletContainerCustomizer
@Component
public class CustomContainer implements EmbeddedServletContainerCustomizer
@Override
public void customize(ConfigurableEmbeddedServletContainer container)
container.setPort(8888);
【讨论】:
以上是关于如何为 Spring Boot 应用程序配置端口的主要内容,如果未能解决你的问题,请参考以下文章
如何为 Spring Boot 应用程序的 gradle 构建设置活动配置文件?
如何为 Spring Boot 应用程序配置嵌入式 Tomcat 虚拟主机?