从shell编译和执行Java应用程序的约定?

时间:2014-02-02 00:32:30

标签: java javac

从shell编译和执行Java应用程序的惯例是什么?作为一个特定的用例,我正在教一些孩子如何阅读Java源代码并选择minicraft(这是Notch的Ludum Dare 22条目的注释版本)。这对他们来说非常令人兴奋,但是我已经离开Java领域大约10年了,坦率地说,我想在跳跃之前同时教他们如何使用shell和不太健壮的(即非IDE)编辑器进入Eclipse等。我想明白:

A)你将执行什么shell命令来编译和运行app(以及从哪个项目文件夹;即miniventureminiventure/srcminiventure/src/com/mojang/ld22)和

B)在从src挖掘其他项目时,了解如何制作项目以及shell javajavac args以供将来参考的理由是什么?

1 个答案:

答案 0 :(得分:4)

鉴于约束仅在命令shell中工作,处理编译的最佳方法是从类路径的根目录运行 javac ,就在包含任何顶级包的目录中已为您的源代码定义(在您的情况下看起来可能是miniventure/src)。您可以运行 javac 并使用-cp(类路径的简称)命令行参数来定义类路径的根。由于您正在教授新的程序员,您可以使用相同选项的长形式-classpath来强化他们正在设置Java类路径。

如果从类路径的根目录运行 javac ,通常只使用一个点来引用同一目录:javac -cp .;因为javac将遍历目录(包)结构以查找所有源文件(任何具有.java文件扩展名的文件),但javac的文档建议使用更结构化的方法:

有两种方法可以将源代码文件名传递给 javac
  • 对于少量源文件,只需在命令行中列出文件名。
  • 对于大量源文件,列出文件中的文件名,用空格分隔或换行。然后在 javac 命令行上使用列表文件名,前面加上 @ 字符。

如果以这种方式运行 javac ,它会将类文件放在源文件旁边,但是类文件全部与源文件混合在一起,可能会分散在目录/包结构。处理此问题的常用方法是使用 javac -d命令行参数,该参数定义应编写编译类的目录; javac 将保留包结构并在编译期间创建所需的任何目录结构。定义此选项的标准方法始终是名为classes的目录,该目录是源(或您的案例中为src)目录的兄弟。因此,您将创建一个新目录:miniventure/classes,然后您的命令行将包括:-d ./classes

由于您正在教授新的程序员,因此您需要在编译期间包含调试信息,因此当它们遇到错误或异常时,堆栈跟踪将包含详细的调试信息。 javac 命令行选项为:-g,它将生成启用了所有调试选项的类文件;这将包括以下调试选项:

  • 来源,其中包含源文件调试信息
  • ,其中包含源文件调试信息中的行号,以及
  • vars ,其中包含本地变量调试信息
  • 最后,由于让新程序员详细了解所有内容可能会有所帮助,可能希望包含-verbose选项,该选项告诉 javac 输出非常详细的消息,包括加载的每个类和编译的每个源代码文件。

    因此,将所有这些组合在一起,您的 javac 命令行将如下所示:

    javac -classpath . -d ./classes -g -verbose
    

    了解到我没有在命令行中列出每个源代码文件的选项,或者使用 @ 参数来引用包含文件名列表的文件。我个人从来没有使用过这个选项,我觉得它有点过于复杂。希望这有用 -