我有一个spring-boot(2.5.3(应用程序在防火墙后面的centOS虚拟机上运行。我通常构建一个胖罐子,然后使用通过CLI:传递的配置来运行它
mvn clean package spring-boot:repackage
java -jar target/service.jar --spring.config.location=/path/to/config.properties
- 运行
curl
GET命令:curl --key /a/b --cert /x/y "https://server-name:8767/path?arg=..."
它使用配置中设置的端口8767工作,我之前随机选择了这个端口。
从那以后,我试着看看是否可以使用不同的端口。我在linuxpublic
防火墙cmd区域上打开了更多的端口,包括8768&9000.问题是,无论我尝试什么,我唯一能让应用程序运行的端口是8767。好像我已经把它硬连接到那个端口了!
通常在配置中设置server.port
,但即使我通过cli传递另一个端口--server.port=xxxx
,应用程序也会运行,日志显示它暴露于xxxx;然而,curl可以始终仅访问8767,其他端口超时。或者,如果我在配置中设置server.port=xxxx
,结果相同。
我需要做什么才能使用不同的端口?(我看到了……它能帮我吗?(
依赖项(没有什么特别的(依赖项(无特殊(
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
</parent>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
更新:@Vinit-我的主类和你的完全一样,除了一个std println,我必须让我知道它正在运行:
System.out.println("Running...");
至于我的application.properties,我不能粘贴它们,因为我在防火墙后面,但它们基本上在下面,每个都有不止一个:
logging.level
server.port=xxxx // as described above, i've tried declaring here or cli
server.ssl
# custom auth properties
customauth.url
spring.profiles.active
spring.application.name
spring.task.scheduling
spring.jmx.enabled
swagger
management.endpoints
sanitization
spring.jackson
另一方面,我运行
sudo netstat -nlp | grep "<port>"
在我运行应用程序之前(其中是我在配置中或通过CLI的端口(,没有结果。然后我运行应用程序,重复netstat
调用,该端口正在侦听。但同样的事情是:如果8767,一切都好;但如果是8768,则超时。
Spring引导在将参数传递给主方法中的SpringApplication.run方法时会考虑cli参数。主类应该是这样的-
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
将args作为参数传递给run方法,该方法应考虑cli参数。对于这个类,如果使用--server.port=8080作为cli参数,那么spring应用程序应该在8080port.上运行
这是spring-boots评估服务器端口设置的不同方法的顺序:
- 嵌入式服务器配置
- 命令行参数
- 特性文件
- main@SpringBootApplication配置
因此,如果server.port参数不起作用,两个典型的问题是在WebServerFactoryCustomizer或SpringBootApplication 的主方法中重写行为