软件是这样“炼”成的:Java学习全演练
上QQ阅读APP看书,第一时间看更新

6.2 使用JDK编译和运行程序

6.2.1 编译Java源文件

一般的开发集成工具都是自动完成编译的,Javac命令编译方式很少用到。在这里详细介绍Javac的编译过程。Java程序的编译程序是javac.exe。javac命令将Java程序编译成字节码,然后开发人员可用Java解释器java命令来解释执行这Java字节码。Java程序源码必须存放在后缀为.java的文件里。Java程序里的每一个类,javac都将生成与类相同名称但后缀为.class文件。编译器把.class文件放在.java文件的同一个目录里,除非开发人员用了-d选项。自己定义的类时,必须指明它们的存放目录,这就需要利用环境变量参数CLASSPATH。环境变量CLASSPATH是由被分号隔开的路径名组成。如果传递给javac编译器的源文件里引用到的类定义在本文件和传递的其他文件中找不到,则编译器会按CLASSPATH定义的路径来搜索。例如:

     CLASSPATH= .;C: javaclasses

编译器先搜索当前目录;如果没搜索到,则继续搜索“C:javaclasses”目录。注意,系统总是将系统类的目录默认地加在CLASSPATH后面,除非开发人员用-classpath选项来编译。javac_g是一个用于调试的未优化的编译器,功能与用法和javac一样。javac的用法如下。

     javac
     [-g][-O][-debug][-depend][-nowarn][-verbose][-classpath path][-nowrite][-d dir]
     file.java...

以下是每个选项的解释。

(1)-classpath path定义javac搜索类的路径。它将覆盖默认的CLASSPATH环境变量的设置。路径是由逗号隔开的路径名组成,一般格式如下。

     .;<your_path>

例如:

     ;C:javadocclasses;C:oolsjavaclasses

表示编译器遇到一个新类,它先在本文件中查找它的定义;如果没有,则在本文件所处目录下其他文件中查找它的定义;如果还没有,则继续搜索“C:javadocclasses”目录中的所有文件,以此类推。

(2)-d dir指明类层次的根目录,格式如下。

     javac-d<my_dir> MyProgram.java

这样将MyProgram.java程序里的生产的.class文件存放在my_dir目录里。

(3)-g 带调试信息编译,调试信息包括行号与使用Java调试工具时用到的局部变量信息。如果编译没有加上-O优化选项,只包含行号信息。

(4)-nowarn关闭警告信息,编译器将不显示任何警告信息。

(5)-O优化编译static、final、private函数,注意所开发的类文件可能更大。

(6)-verbose 让编译器与解释器显示被编译的源文件名和被加载的类名。

6.2.2 运行Java程序

java-Java语言解释器 java命令解释 java字节码。

语法:

     java [ options ] classname <args> java_g [ options ] classname <args>

描述:Java命令由Java编译器javac输出的java字节码。

classname参数是要执行的类名称。注意任意在类名称后的参数都将传递给要执行类的main函数。

java执行完main函数后退出,除非main函数创建了一个或多个线程。如果main函数创建了其他线程,java总是等到最后一个线程退出后才退出。

选项options的说明如下。

(1)-cs,-checksource当一个编译过的类调入时,这个选项将比较字节码更改时间与源文件更改时间,如果源文件更改时间靠后,则重新编译此类并调入此新类。

(2)-classpath path定义javac搜索类的路径。它将覆盖默认的CLASSPATH环境变量的设置。路径是由逗号隔开的路径名组成,一般格式如下:.;<your_path>。

例如:.;C:javadocclasses;C:oolsjavaclasses表示解释器遇到一个新类,它先在本文件中查找它的定义;如果没有,则在本文件所处目录下其他文件中查找它的定义;如果还没有,则继续搜索C:javadocclasses目录中的所有文件,以此类推。

(3)-mx x设置最大内存分配池,大小为x,x必须大于1000B。默认为16MB。

(4)-ms x设置垃圾回收堆的大小为x,x必须大于1000B。默认为1MB。

(5)-noasyncgc关闭异步垃圾回收功能。此选项打开后,除非显式调用或程序内存溢出,垃圾内存都不回收。本选项不打开时,垃圾回收线程与其他线程异步同时执行。

(6)-ss x每个Java线程有两个堆栈,一个是Java代码堆栈,一个是C代码堆栈。-ss选项将线程里C代码用的堆栈设置成最大为x。

(7)-oss x每个Java线程有两个堆栈,一个是Java代码堆栈,一个是C代码堆栈。-oss选项将线程里Java代码用的堆栈设置成最大为x。

(8)-v,-verbose让Java解释器在每一个类被调入时,按标准输出打印相应信息。