Java程序命令行參數(shù)用法總結(jié)
前言: 在命令行中輸入可以輸入各類參數(shù),本文將針對這些參數(shù)做一個小結(jié)。
基于命令行輸入?yún)?shù)
測試程序如下:
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,設(shè)置了系統(tǒng)屬性信息,被正確地解析出來。系統(tǒng)屬性的設(shè)置位于Java程序之前。
first second third作為Java程序的args參數(shù),需要放在程序之后才可以正確被解析。
-Xms128 -Xmx256M: 為設(shè)置JVM的參數(shù),這里設(shè)置了其對內(nèi)存的大小。
如果是Spring Boot應用的話,則可以在命令行設(shè)置:
– server.port=9091
通過兩個‘- - '作為命令行參數(shù)的前綴。
基于Run Configuration界面設(shè)置Java程序的入口參數(shù):
設(shè)置環(huán)境變量:
程序運行的結(jié)果信息:
從運行結(jié)果中可知: 環(huán)境變量被正確設(shè)置讀取,但是系統(tǒng)屬性卻未正確設(shè)置。
基于命令行輸入系統(tǒng)屬性
java -Dfeature=module1 org.spb.data.Main
-D 表示其為系統(tǒng)屬性
JVM參數(shù)設(shè)置
java -Xms128M -Xmx256M org.spb.data.Main
JVM參數(shù)是設(shè)置JVM的設(shè)置,其遵守JVM設(shè)置的參數(shù)類型。
環(huán)境變量 vs 系統(tǒng)屬性
當程序中需要使用與操作系統(tǒng)相關(guān)的變量(例如:文件分隔符、換行符)時,Java提供了System類的靜態(tài)方法getenv()和getProperty()用于返回系統(tǒng)相關(guān)的變量與屬性,getenv方法返回的變量大多于系統(tǒng)相關(guān),getProperty方法返回的變量大多與java程序有關(guān)。
系統(tǒng)屬性和環(huán)境變量都是名稱與值之間的映射。兩種機制都能用來將用戶定義的信息傳遞給 Java進程。環(huán)境變量產(chǎn)生更多的全局效應,因為它們不僅對Java子進程可見,而且對于定義它們的進程的所有子進程都是可見的。在不同的操作系統(tǒng)上,它們的語義有細微的差別,比如,不區(qū)分大小寫。因此環(huán)境變量更可能有意料不到的副作用。程序中盡可能使用系統(tǒng)屬性。環(huán)境變量應該在需要全局效應的時候使用,或者在外部系統(tǒng)接口要求使用環(huán)境變量時使用(比如 PATH)
從上述示例可知,系統(tǒng)屬性由于其與程序緊密相關(guān),則可以基于命令行進行設(shè)置。但是,環(huán)境變量則無法通過程序進行設(shè)置,需要基于IDE和環(huán)境變量進行設(shè)置。
Java命令行的幫助信息:
圖中標示出來的就是系統(tǒng)屬性信息。
基于Maven命令運行Spring Boot應用
程序代碼如下:
@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設(shè)置系統(tǒng)屬性信息
arguments: 設(shè)置Java 程序main的入口參數(shù)
對于環(huán)境變量,則需要設(shè)置pom.xml文件中的plugin配置項:
<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>
運行結(jié)果為:
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的參數(shù)設(shè)置:
mvn spring-boot:run -Dmaven.test.skip=true -Pdev -Dspring-boot.run.arguments=“first seond third”
輸出結(jié)果信息如下:
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
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java使用Tinify實現(xiàn)圖片無損壓縮(4M無損壓縮到1M)的方法
在當今的數(shù)字化時代,圖片已成為網(wǎng)站、應用和社交媒體中不可或缺的元素,然而,大尺寸的圖片不僅會增加頁面或者客戶端加載時間,還會占用大量的存儲空間,本文將詳細介紹如何利用Tinify壓縮圖片,并將其上傳至OSS,重點介紹圖片壓縮實現(xiàn)方式,需要的朋友可以參考下2024-08-08java多線程編程之使用thread類創(chuàng)建線程
在Java中創(chuàng)建線程有兩種方法:使用Thread類和使用Runnable接口。在使用Runnable接口時需要建立一個Thread實例2014-01-01解決使用@Value(${×××))從properties文件取值的坑
這篇文章主要介紹了解決使用@Value(${×××))從properties文件取值的坑,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07Java?synchronized輕量級鎖實現(xiàn)過程淺析
這篇文章主要介紹了Java synchronized輕量級鎖實現(xiàn)過程,synchronized是Java里的一個關(guān)鍵字,起到的一個效果是"監(jiān)視器鎖",它的功能就是保證操作的原子性,同時禁止指令重排序和保證內(nèi)存的可見性2023-02-02springboot 多環(huán)境配置 yml文件版的實現(xiàn)方法
這篇文章主要介紹了springboot 多環(huán)境配置 yml文件版的實現(xiàn)方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06