运行 现有 java cmd 程序
run existing java program with cmd
我有一个 运行 java 程序可以将 json 文件转换成另一种文件格式。一切都很好。
对于实现,我决定使用 MVC 模式。
现在我想实现整个转换例程,以便我可以使用命令提示符,但我从未使用过它,也完全不知道如何实现它。
我的想法是:
- 打开
cmd
并导航到 main.java 文件。
- 打印出全部可能性(用户应该可以输入源文件的目录和目标目录,用户应该可以选择目标格式)。
- 如果用户输入了所有内容,则应按 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 名称之后的第一个参数。
我有一个 运行 java 程序可以将 json 文件转换成另一种文件格式。一切都很好。 对于实现,我决定使用 MVC 模式。
现在我想实现整个转换例程,以便我可以使用命令提示符,但我从未使用过它,也完全不知道如何实现它。
我的想法是:
- 打开
cmd
并导航到 main.java 文件。 - 打印出全部可能性(用户应该可以输入源文件的目录和目标目录,用户应该可以选择目标格式)。
- 如果用户输入了所有内容,则应按 ENTER 启动转换例程。
帮助会非常好。目前,我只知道如何编译 (javac helloWorld.java
) 并通过使用 java helloWorld
...
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 名称之后的第一个参数。