前言: 在命令行中輸入可以輸入各類參數,本文將針對這些參數做一個小結。
基于命令行輸入參數
測試程序如下:
1
2
3
4
5
6
7
|
import java.util.Arrays; public class Main { public static void main(String[] args) { System.out.println( "System Property, abc:" + System.getenv( "feature.flag" ) + "," + System.getProperty( "feature" )); System.out.println( "args:" + Arrays.toString(args)); } } |
基于命令行的輸入:
java -Dfeature=module1 -Xms128M -Xmx256M org.spb.data.Main first second third
輸出為:
System Property, abc:null,module1
args:[first, second, third]
從上述示例中可知 -Dfeature=module1,設置了系統屬性信息,被正確地解析出來。系統屬性的設置位于Java程序之前。
first second third作為Java程序的args參數,需要放在程序之后才可以正確被解析。
-Xms128 -Xmx256M: 為設置JVM的參數,這里設置了其對內存的大小。
如果是Spring Boot應用的話,則可以在命令行設置:
– server.port=9091
通過兩個‘- - '作為命令行參數的前綴。
基于Run Configuration界面設置Java程序的入口參數:
設置環境變量:
程序運行的結果信息:
從運行結果中可知: 環境變量被正確設置讀取,但是系統屬性卻未正確設置。
基于命令行輸入系統屬性
java -Dfeature=module1 org.spb.data.Main
-D 表示其為系統屬性
JVM參數設置
java -Xms128M -Xmx256M org.spb.data.Main
JVM參數是設置JVM的設置,其遵守JVM設置的參數類型。
環境變量 vs 系統屬性
當程序中需要使用與操作系統相關的變量(例如:文件分隔符、換行符)時,Java提供了System類的靜態方法getenv()和getProperty()用于返回系統相關的變量與屬性,getenv方法返回的變量大多于系統相關,getProperty方法返回的變量大多與java程序有關。
系統屬性和環境變量都是名稱與值之間的映射。兩種機制都能用來將用戶定義的信息傳遞給 Java進程。環境變量產生更多的全局效應,因為它們不僅對Java子進程可見,而且對于定義它們的進程的所有子進程都是可見的。在不同的操作系統上,它們的語義有細微的差別,比如,不區分大小寫。因此環境變量更可能有意料不到的副作用。程序中盡可能使用系統屬性。環境變量應該在需要全局效應的時候使用,或者在外部系統接口要求使用環境變量時使用(比如 PATH)
從上述示例可知,系統屬性由于其與程序緊密相關,則可以基于命令行進行設置。但是,環境變量則無法通過程序進行設置,需要基于IDE和環境變量進行設置。
Java命令行的幫助信息:
圖中標示出來的就是系統屬性信息。
基于Maven命令運行Spring Boot應用
程序代碼如下:
1
2
3
4
5
6
7
8
9
10
11
|
@Slf4j @SpringBootApplication public class AppRunnerApplication { public static void main(String[] args) throws InterruptedException { SpringApplication.run(AppRunnerApplication. class , args); //Thread.currentThread().join(); log.info( "args:{}" , Arrays.toString(args)); log.info( "feature:" + System.getProperty( "feature" )); log.info( "feature.flag:" + System.getenv( "feature.flag" )); } } |
mvn spring-boot:run -Dmaven.test.skip=true -Pdev -Dspring-boot.run.arguments=“first seond third” -Dspring-boot.run.jvmArguments="-Dfeature=module11"
-Dfeature=module11設置系統屬性信息
arguments: 設置Java 程序main的入口參數
對于環境變量,則需要設置pom.xml文件中的plugin配置項:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
< build > < plugins > < plugin > < groupId >org.springframework.boot</ groupId > < artifactId >spring-boot-maven-plugin</ artifactId > < configuration > < systemPropertyVariables > < feature >moduleXXX</ feature > </ systemPropertyVariables > < environmentVariables > < feature.flag >true</ feature.flag > </ environmentVariables > </ configuration > </ plugin > </ plugins > </ build > |
運行結果為:
2019-11-11 23:08:22.764 INFO 18717 --- [ restartedMain] o.s.d.apprunner.cmdline.AppLineRunner1 : App LineRunner1:first seond third
2019-11-11 23:08:22.765 INFO 18717 --- [ restartedMain] o.s.d.apprunner.cmdline.AppLineRunner2 : App LineRunner2:[first seond third]
2019-11-11 23:08:22.766 INFO 18717 --- [ restartedMain] o.s.data.apprunner.AppRunnerApplication : args:[first seond third]
2019-11-11 23:08:22.766 INFO 18717 --- [ restartedMain] o.s.data.apprunner.AppRunnerApplication : feature:module11
2019-11-11 23:08:22.766 INFO 18717 --- [ restartedMain] o.s.data.apprunner.AppRunnerApplication : feature.flag:true
如果在命令行不進行jvmArguments的參數設置:
mvn spring-boot:run -Dmaven.test.skip=true -Pdev -Dspring-boot.run.arguments=“first seond third”
輸出結果信息如下:
2019-11-11 23:11:55.399 INFO 18757 --- [ restartedMain] o.s.d.apprunner.cmdline.AppLineRunner2 : App LineRunner2:[first seond third]
2019-11-11 23:11:55.400 INFO 18757 --- [ restartedMain] o.s.data.apprunner.AppRunnerApplication : args:[first seond third]
2019-11-11 23:11:55.400 INFO 18757 --- [ restartedMain] o.s.data.apprunner.AppRunnerApplication : feature:moduleXXX
2019-11-11 23:11:55.400 INFO 18757 --- [ restartedMain] o.s.data.apprunner.AppRunnerApplication : feature.flag:true
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。
原文鏈接:https://blade.blog.csdn.net/article/details/103019782