java中的各種命令參數
java中有很多命令參數,這些命令參數有些是控制jvm行為的,有的則是供應用程序使用。我所了解的參數主要有三種,現在說一說這三種類型的參數。
(1)命令行參數。
命令行參數就是類似與c語言的命令行參數,這些參數會傳給main函數,也就是java中 public static void main(String[] args) 的那個String數組。但是需要注意的是,c
語言的main行數中傳入的參數,arv[0]是程序本身的名字,比如program1 option1 option2,那么arv[0]就是program1本身。但是java的命令函參數確實從0開始的,也就是說,java中的第一個命令行參數是的args[0],舉個例子 java program1 option1 option2 運行一個java程序的話,args[0]獲取到的是option1。
(2)系統屬性參數
系統屬性參數也是供應用程序使用的,並且是以key=value這樣的形式提供的,在程序的任何一個地方,都可以通過System.getProperty("key")獲取到對應的value值。在官方文檔中對系統屬性參數的描述是這樣的:
Set a system property value. If value is a string that contains spaces, you must enclose the string in double quotes:
java -Dfoo="some string" SomeClass
系統屬性參數傳入的時候需要帶一個橫桿和大寫字母D,比如-Dfuck.abc="1234"這樣的。在你業務代碼中,你就可以使用它了:System.getProperty("fuck.abc"),獲取"1234"。不過系統屬性參數一般都是用來開啟一些官方開關的,比如加入-Djdk.internal.lambda.dumpProxyClasses="/home/xxx",你就可以把java8中lambda表達式的代理類自己碼dump出來。
(3)jvm參數
jvm參數就是和jvm相關的參數了,比如配置gc、配置堆大小、配置classpath等等。
jvm參數分為標准參數、擴展參數和不穩定參數。
標准參數是一定有效,向后兼容的,且所有的jvm都必須要實現的,比如-classpath,這類參數是橫桿直接跟參數名
擴展參數是不保證向后向后兼容,不強值要求所有jvm實現都要支持,不保證后續版本不會取消的,這類參數的形式是-Xname,橫杠和一個大寫的X開頭
不穩定參數就是非常不穩定,可能只是特定版本的,特點是-XXname,橫桿后帶兩個大寫X開頭。
如果想查看具體的參數的含義,最好的方法就是看官方文檔,或者直接man java一下,也可以參考這篇文章《Java 命令行運行參數》
其實,只要java -h以下,就可以看到這些說明。java命令的語法為:
java [-options] class [args...] (to execute a class)
或者
java [-options] -jar jarfile [args...] (to execute a jar file)
所以,我前面說的嚴格意義上全都是不對的,java中的命令行參數只有option 和 args兩類。我說的第一類對應args,后面兩類都是屬於option的,那才是jvm的參數。
原文鏈接:https://www.cnblogs.com/JMLiu/p/10037367.html
spring boot傳遞參數
spring boot 打成jar包后 通過命令行傳入的參數 3中實現方式
方式一:
java -jar xxx.jar aaa bbb cccc
傳了3個參數,分別是aaa,bbb,ccc
通過main方法的參數獲取
方式二:
java -jar xxx.jar -Da1=aaa -Db1=bbb -Dc1=ccc
通過 System.getProperty("aaa","1"); 方式獲取。作為環境變量
今天遇到奇怪事情:
java -Xms10m -Xmx512m xx.jar -DconfigPath=/root
不生效-D配置,在程序中讀取不到。改成
java -Xms10m -Xmx512m -DconfigPath=/root xx.jar
就可以
方式三:
java -jar xxx.jar --a1=aaa --b1=bbb
是springboot的寫法,可以通過@Value("${a1}") 獲取