Đối số dòng lệnh trong Spring Boot

1. Khái quát chung

Trong hướng dẫn nhanh này, chúng ta sẽ thảo luận về cách chuyển các đối số dòng lệnh vào ứng dụng Spring Boot.

Chúng ta có thể sử dụng các đối số dòng lệnh để cấu hình ứng dụng của mình, ghi đè các thuộc tính ứng dụng hoặc chuyển các đối số tùy chỉnh.

2. Đối số dòng lệnh của Maven

Đầu tiên, hãy xem cách chúng ta có thể truyền các đối số trong khi chạy ứng dụng của mình bằng Maven Plugin.

Sau đó, chúng ta sẽ xem cách truy cập các đối số trong mã của chúng ta.

2.1. Khởi động mùa xuân 1.x

Đối với Spring Boot 1.x, chúng ta có thể truyền các đối số vào ứng dụng của mình bằng -Drun.arguments :

mvn spring-boot:run -Drun.arguments=--customArgument=custom

Chúng tôi cũng có thể chuyển nhiều tham số cho ứng dụng của mình:

mvn spring-boot:run -Drun.arguments=--spring.main.banner-mode=off,--customArgument=custom

Lưu ý rằng:

  • Các đối số phải được phân tách bằng dấu phẩy
  • Mỗi đối số phải được bắt đầu bằng -
  • Chúng ta cũng có thể chuyển các thuộc tính cấu hình, như spring.main.banner-mode được hiển thị trong ví dụ trên

2.2. Khởi động mùa xuân 2.x

Đối với Spring Boot 2.x, chúng ta có thể chuyển các đối số bằng -Dspring-boot.run.arguments :

mvn spring-boot:run -Dspring-boot.run.arguments=--spring.main.banner-mode=off,--customArgument=custom

3. Gradle Đối số dòng lệnh

Tiếp theo, hãy khám phá cách chuyển các đối số trong khi chạy ứng dụng của chúng tôi bằng Trình cắm Gradle.

Chúng tôi sẽ cần định cấu hình tác vụ bootRun của mình trong tệp build.gradle :

bootRun { if (project.hasProperty('args')) { args project.args.split(',') } }

Bây giờ, chúng ta có thể chuyển các đối số dòng lệnh như sau:

./gradlew bootRun -Pargs=--spring.main.banner-mode=off,--customArgument=custom

4. Ghi đè thuộc tính hệ thống

Ngoài việc truyền các đối số tùy chỉnh, chúng tôi cũng có thể ghi đè các thuộc tính hệ thống.

Ví dụ: đây là tệp application.properties của chúng tôi :

server.port=8081 spring.application.name=SampleApp

Để ghi đè giá trị server.port , chúng ta cần chuyển giá trị mới theo cách sau (đối với Spring Boot 1.x):

mvn spring-boot:run -Drun.arguments=--server.port=8085

Tương tự cho Spring Boot 2.x:

mvn spring-boot:run -Dspring-boot.run.arguments=--server.port=8085

Lưu ý rằng:

  • Spring Boot chuyển đổi đối số dòng lệnh thành thuộc tính và thêm chúng dưới dạng biến môi trường
  • Chúng tôi có thể sử dụng các đối số dòng lệnh ngắn –port = 8085 thay vì –server.port = 8085 bằng cách sử dụng trình giữ chỗ trong ứng dụng của chúng tôi .properties :
    server.port=${port:8080}
  • Các đối số dòng lệnh được ưu tiên hơn các giá trị application.properties

Nếu cần, chúng tôi có thể ngăn ứng dụng của mình chuyển đổi các đối số dòng lệnh thành thuộc tính:

@SpringBootApplication public class Application extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication application = new SpringApplication(Application.class); application.setAddCommandLineProperties(false); application.run(args); } }

5. Truy cập đối số dòng lệnh

Hãy xem cách chúng ta có thể truy cập các đối số dòng lệnh từ phương thức main () của ứng dụng :

@SpringBootApplication public class Application extends SpringBootServletInitializer { public static void main(String[] args) { for(String arg:args) { System.out.println(arg); } SpringApplication.run(Application.class, args); } }

Thao tác này sẽ in các đối số mà chúng tôi đã truyền cho ứng dụng của mình từ dòng lệnh, nhưng chúng tôi cũng có thể sử dụng chúng sau này trong ứng dụng của mình.

6. Chuyển đối số dòng lệnh đến SpringBootTest

Với việc phát hành Spring Boot 2.2, chúng tôi đã có được khả năng đưa các đối số dòng lệnh trong quá trình thử nghiệm bằng cách sử dụng @SpringBootTest và thuộc tính args của nó :

@SpringBootTest(args = "--spring.main.banner-mode=off") public class ApplicationTest { @Test public void whenUsingSpringBootTestArgs_thenCommandLineArgSet(@Autowired Environment env) { Assertions.assertThat(env.getProperty("spring.main.banner-mode")).isEqualTo("off"); } }

7. Kết luận

Trong bài viết này, chúng ta đã học cách truyền các đối số cho ứng dụng Spring Boot của chúng ta từ dòng lệnh và cách thực hiện việc này bằng cả Maven và Gradle.

Chúng tôi cũng đã chỉ ra cách bạn có thể truy cập các đối số đó từ mã của mình, để định cấu hình ứng dụng của bạn.