在实际的大数据项目中,有很多应用场景是运行某些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,不错过任何分享!