Scala中如何自定义命令行参数

Scala中如何自定义命令行参数,第1张

在实际的大数据项目中,有很多应用场景是运行某些jar包需要外部传参的,今天就学习一下如何在Scala代码中实现命令行传参的功能。

本次介绍的工具包是:args4j

由于我的Scala项目是用sbt工具构建,所以:

第一步:引入依赖 

在build.sbt文件中添加下面的libraryDependencies

ThisBuild / version := "0.1.0-SNAPSHOT"

​​​​​​​ThisBuild / scalaVersion := "2.12.15"

lazy val root = (project in file(".")).settings( name := "cmdlineparser20220412" )

libraryDependencies += "args4j" % "args4j" % "2.33"

​​​​​​​

第二步:导包 

这里我的所有代码都在CMDLineArgs.scala中

import org.kohsuke.args4j.{CmdLineException, CmdLineParser, Option}

第三步:定义参数列表 

这里我定义了下面三个参数: cloudProvider, vmCount和configFile

@Option()里三个参数需要你配置一下:

name: 字符串类型,你的自定义参数名,就是给你参数起个名字

required: 布尔类型,该参数是否必须

usage: 字符串类型,就是该参数的用法说明

下面是定义参数变量,并指定类型和初始化​​​​​​​

object Args {
  @Option(
    name = "-cloudProvider",
    required = true,
    usage = "Please type which cloud you are using? For example: Azure | AWS"
  )

var cloudProvider: String = null

@Option(
 name = "-vmCount",
 required = true,
 usage = "How many VMs you want to create?"
 ) 

var vmCount: Int = -1

@Option(
 name = "-configFileName",
 required = true,
 usage = "Please type the vm config file name." )

var configFileName: String = null

}


 

第四步:定义main函数调用自定义参数object​​​​​​​

object CMDLineArgs {

  def main(args: Array[String]): Unit = {

    val parser = new CmdLineParser(Args)

    try {

      parser.parseArgument(JavaConverters.asJavaCollection(args))

    } 

    catch {

      case e: CmdLineException =>

        print(s"Error: ${e.getMessage}\n Usage:\n")

        parser.printUsage(System.out)

        exit(1)

    }

    println(Args.cloudProvider)

    println(Args.vmCount)

    println(Args.configFileName)

  }

}

我们先来不传任何参数,直接运行scala代码,来看看什么效果:

可以看到错误提示:-cloudProvider这个选项参数是必须的

下面还打印出来了我们在定义参数时,在usage里写的参数使用说明

那如何在运行时传入参数呢?Intellij IDEA提供了此功能,我们只需要打开Edit Configuration...,在里面填入参数以及参数值即可。

   注意:

- 参数与参数之间用空格隔开

- 参数名与参数值之间用=

点击OK保存,再跑一遍代码,看看输出结果:

输出结果不太漂亮,改一下代码,调整一下输出格式:​​​​​​​

    ...

    println("Cloud Provider: " + Args.cloudProvider)

    println("vm Count: " + Args.vmCount)

    println("vm Config File: " + Args.configFileName)

    ...

再跑一遍,这次输出结果好看多了!

好了,今天的分享就到这里!如果本文对你有帮助?点击关注公众号:BPShare,不错过任何分享!

 

 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/876897.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-13
下一篇 2022-05-13

发表评论

登录后才能评论

评论列表(0条)

保存