Java程序命令行参数用法总结

作者:bladestone 时间:2022-09-22 11:09:32 

前言: 在命令行中输入可以输入各类参数,本文将针对这些参数做一个小结。

基于命令行输入参数

测试程序如下:


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程序命令行参数用法总结

设置环境变量:

Java程序命令行参数用法总结

程序运行的结果信息:

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命令行的帮助信息:

Java程序命令行参数用法总结

图中标示出来的就是系统属性信息。

基于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设置系统属性信息

arguments: 设置Java 程序main的入口参数

对于环境变量,则需要设置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>

运行结果为:

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

标签:Java,命令行,参数
0
投稿

猜你喜欢

  • java String的深入理解

    2022-10-30 23:50:37
  • JavaWeb登录界面登录失败在同一页面进行提示的解决

    2023-11-26 15:51:34
  • PipedWriter和PipedReader源码分析_动力节点Java学院整理

    2022-03-13 19:40:16
  • Android编程之消息机制实例分析

    2023-07-28 07:24:38
  • Android设计模式之Builder模式解析

    2022-02-11 20:07:46
  • C#将dll打包到程序中的具体实现

    2022-11-22 16:39:34
  • Java异常 Exception类及其子类(实例讲解)

    2022-04-05 13:40:16
  • C# DateTime.ToString根据不同语言生成相应的时间格式

    2022-04-16 12:34:51
  • 详解在Java的Struts2框架中配置Action的方法

    2023-08-01 11:01:40
  • 解决mybatis 中collection嵌套collection引发的bug

    2023-03-20 20:55:39
  • Java跨域问题的处理详解

    2021-07-05 12:55:18
  • 详解在springboot中使用Mybatis Generator的两种方式

    2021-10-12 14:26:44
  • 一文快速掌握Spring Cloud Stream

    2023-09-01 23:09:38
  • SpringBoot 如何从配置文件读取值到对象中

    2023-10-13 15:43:15
  • C#获取图片的后缀名解析

    2023-02-13 09:35:58
  • Java concurrency线程池之线程池原理(二)_动力节点Java学院整理

    2023-11-28 23:43:18
  • 详解Android Gradle插件3.0挖坑日记

    2022-02-06 09:03:19
  • c#集合快速排序类实现代码分享

    2023-03-30 13:38:51
  • 简单探索 Java 中的惰性计算

    2023-11-16 20:25:28
  • 智能指针与弱引用详解

    2023-05-10 04:45:56
  • asp之家 软件编程 m.aspxhome.com