运行 现有 java cmd 程序

run existing java program with cmd

我有一个 运行 java 程序可以将 json 文件转换成另一种文件格式。一切都很好。 对于实现,我决定使用 MVC 模式。

现在我想实现整个转换例程,以便我可以使用命令提示符,但我从未使用过它,也完全不知道如何实现它。

我的想法是:

  1. 打开 cmd 并导航到 main.java 文件。
  2. 打印出全部可能性(用户应该可以输入源文件的目录和目标目录,用户应该可以选择目标格式)。
  3. 如果用户输入了所有内容,则应按 ENTER 启动转换例程。

帮助会非常好。目前,我只知道如何编译 (javac helloWorld.java) 并通过使用 java helloWorld...

执行程序来打印 "Hello World!"

apache commons cli 项目提供用于解析命令行参数和提供帮助菜单的实用程序。这使得处理提供给您的主要方法的参数变得非常简单。

您还需要为 assemble 您的 class 路径提供脚本。您可以查看 maven app assembler plugin 以了解执行此操作的方法。

shell/command 提示和启动的 Java 程序之间的交互与它在 C 程序中的工作方式非常相似*。 main() 方法从命令行(或任何其他执行 java 运行时的父进程)接收字符串形式的参数。

在Java中你得到一个字符串数组。您需要自己决定哪个字符串具有什么含义。

public static void main(String[] arg) {     // traditional or String ... args
  System.out.println("You have " + arg.length + " arguments);
  if (arg.length >= 1) System.out.println("First: " + arg[0]);
}

当使用参数启动 Java 运行时时,重要的是要注意,参数在 class 名称(或 JAR 名称)之后开始:

java -cp . package.Main arg0 arg1 ...
java -jar package.jar arg0 arg1 ...

Java 运行时也有一种在命令行上指定系统属性的机制。这是通过 -D 选项完成的。

java -Dverbose=yes -jar package.jar arg0 arg1 ...
java -jar package.jar -Dverbose=yes arg1 ... //not a system property but arg[0]

重要的是,这个选项在 class/jar-name 之前指定,否则它不会被运行时处理,但你会看到另一个参数。

String verbose = System.getProperty("verbose", "false");

系统属性有用的原因:您可以将它们用于可选控制,因此您不必担心识别参数(有许多库可以做到这一点,但我认为对于小型工具这太过分了)。

顺便说一句:在使用通配符(*?)和 whitespace/quoting 时,shells/prompts 和已启动的程序之间存在一些交互 - 这些是 OS具体。

* 在 C 中第一个参数 args[0] 是程序名称,在 java 中 arg[0] 是 class 名称之后的第一个参数。