Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 运行Akka微内核时获取命令行参数?_Scala_Command Line_Akka_Microkernel - Fatal编程技术网

Scala 运行Akka微内核时获取命令行参数?

Scala 运行Akka微内核时获取命令行参数?,scala,command-line,akka,microkernel,Scala,Command Line,Akka,Microkernel,我有以下资料: 由于内核扩展了可引导的,而不是应用程序,因此启动内核时如何访问使用的命令行参数?例如,如果我使用start namespace.ServiceKernel-d rundevmode或类似方法运行内核。谢谢 附加信息 我认为值得在微内核中添加有关启动脚本的信息。在/bin/start中,您会注意到以下几点: #!/bin/sh AKKA_HOME="$(cd "$(cd "$(dirname "$0")"; pwd -P)"/..; pwd)" AKKA_CLASSPATH="$

我有以下资料:

由于内核扩展了
可引导的
,而不是
应用程序
,因此启动内核时如何访问使用的命令行参数?例如,如果我使用
start namespace.ServiceKernel-d rundevmode
或类似方法运行内核。谢谢

附加信息 我认为值得在微内核中添加有关启动脚本的信息。在
/bin/start
中,您会注意到以下几点:

#!/bin/sh

AKKA_HOME="$(cd "$(cd "$(dirname "$0")"; pwd -P)"/..; pwd)"
AKKA_CLASSPATH="$AKKA_HOME/config:$AKKA_HOME/lib/*"
JAVA_OPTS="-Xms256M -Xmx512M -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:ParallelGCThreads=2"

java $JAVA_OPTS -cp "$AKKA_CLASSPATH" -Dakka.home="$AKKA_HOME" akka.kernel.Main "$@"

虽然om nom nom最初建议使用
-D
选项,但它看起来正在使用,并且主启动参数正在传递给
akka.kernel.main
类(在本例中,它将是上面的
ServiceKernel
类)。

下面是一个最简单的示例:

object Foo extends App {
    val debugModeOn = System.getProperty("debugmode") != null
    val msg = if (debugModeOn) "in debug mode" else "not in debug mode"
    println(msg)
}

» scala Foo -Ddebugmode
in debug mode
» scala Foo            
not in debug mode
您可以进行额外检查以克服此问题:

» scala Foo -Ddebugmode=false
in debug mode

另外,您可能还想使用,它包含一系列方法,如ProProPronone、ProProProPropElse等

在sh脚本中,它们似乎为您提供了提供JAVA选项的机会,如果没有,它们将为您提供一个预定义的方法。我想您可以在一个脚本中设置JAVA_选项,然后调用这个脚本,在JAVA_选项中为您的自定义参数指定a-D选项。这样,您可以确保通过指定的-D系统属性传入自定义参数。有点老套,但我认为应该行得通。-D的妙处在于,您可以提供您想要的任意数量,因此,他们已经在为自己的一些系统属性使用它这一事实应该无关紧要。

哎呀,我的糟糕!:)修复了它。事实上,如果您使用的是-D选项(代表define),那么您只需使用
System.getProperty(“rundevmode”)
并检查属性是否已定义(传入)。hmmm…这可能会奏效。属性是否也需要传递值?它是否遵循Scala
选项
,或者如果找不到它,就直接抛出一个java
null
。在这里,我开始写所有这些模式匹配。我是多么愚蠢和冗长;)你会注意到我刚刚拒绝了这个。可悲的是,在进一步调试之后,我意识到自己被愚弄了。如果您查看
/bin
中的开始脚本:
java$java\u OPTS-cp“$AKKA\u CLASSPATH”-Dakka.home=“$AKKA\u home”AKKA.kernel.Main“$@”
意味着
-D
已被使用:(我可能有一个解决方案,在构建过程中提供一个自定义脚本来接受更多参数。当我知道更多信息时会更新此脚本。我还没有找到工作。我可能会使用微核来允许更多的
-D
参数,就像它允许JAVA_选项一样。几乎是一个可共享的解决方案。将我的SBT升级为
0。).12.3
并且看起来我的版本有一个bug。它没有设置主类。现在我可以设置自己的主类(而不是Akka.main),我可以创建表示开发/生产模式(或其他参数)的自定义类。将继续更新。也尝试过使用此解决方案,但问题归结为om nom nom在his中遇到的相同问题:微核的默认行为是使用提供的任何参数查找Java类。因此,除非修改启动脚本,否则任何操作都将失败。正在积极寻找在构建过程中对其进行定制,而不必费劲。在查看akka.kernal.Main类的源代码时,我可以看到您现在讨论的问题。它将提供的任何arg视为要引导的类,这意味着如果您提供类似于
my.BootClass-d testing
的内容,则
-d
testing
将被预期为FQN可以启动的类,并因此实例化和启动。嗯。让我想一想,看看是否有办法解决这个问题…一个解决办法会更好(虽然我不知道是否可以实现)。当我们需要修改构建过程时,这真的很混乱。
sbt dist
本身就是这么干净的LOL
» scala Foo -Ddebugmode=false
in debug mode