如何使spring-boot应用程序在备用端口上运行



我有一个spring-boot(2.5.3(应用程序在防火墙后面的centOS虚拟机上运行。我通常构建一个胖罐子,然后使用通过CLI:传递的配置来运行它

  1. mvn clean package spring-boot:repackage
  2. java -jar target/service.jar --spring.config.location=/path/to/config.properties
  3. 运行curlGET命令: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评估服务器端口设置的不同方法的顺序:

  1. 嵌入式服务器配置
  2. 命令行参数
  3. 特性文件
  4. main@SpringBootApplication配置

因此,如果server.port参数不起作用,两个典型的问题是在WebServerFactoryCustomizer或SpringBootApplication 的主方法中重写行为