2.1.3在虚拟机KVM上编译和运行代码

为了使用KVM编译和运行应用程序,你需要下载和安装如下的软件:

1.        java 2 SDK或者带有java命令行编译器的开发环境

2.        SunCLDC参考的实现

如果你还没有安装合适的java 2SDK,你可以在http://java.sun.com/j2se下载。

CLDC参考实现包含了源代码和sunCLDC实现的文档,可以运行在微软的windowsLinuxSolaris平台,并且也包含了KVM和它的可执行工具。这个可以在http://java.sun.com/products/cldc/上获得。

参考实现是以档案的形式存放的,你必须把他解压到一个目录中。在接下来的几节中,我们将使用下面的变量来表示Java 2SDKCLDC参考实现的安装目录:

%JAVA_HOME%(Windows)或者$JAVA_HOMELinux/Solaris

Java 2SDK的安装目录

%CLDC_HOME%(Windows)或者$CLDC_HOMELinux/Solaris

CLDC的安装目录,CLDC的解压缩目录是j2me_cldc,在这个目录下面。

%CLDC_PATH%(Windows)或者$CLDC_PATHLinux/Solaris

 

bin目录在CLDC的安装目录下面,等价于windows平台上的%CLDC_HOME%\j2me_cldc\bin

Linux/Solaris平台上的$CLDC_HOME/j2me_cldc/bin

/*代码说明略*/

首先,打开windows命令行(或者linuxsolaris上的shell)并且设置 PATH变量来包含Java2SDKCLDC的可知性文件。对于windows来说,使用如下的命令:

PATH=%JAVA_HOME%\bin;%CLDC_PATH%\win32;%PATH%

如果你是使用linux或者solaris,你需要使用合适的shell命令来保证你设置了正确的CLDC可执行文件,那就是$CLDC_PATH/linux or $CLDC_PATH/solaris.

其次,编译例子代码来生成class文件。为了简化命令,把你的工作目录设置为%EXAMPLES%\src,然后敲入如下的命令:

mkdir tmpclasses

javac -bootclasspath %CLDC_PATH%\common\api\classes -d tmpclasses

ora\ch2\HelloWorld.java

这些命令将会编译原文件,并且在tmpclasses目录下生成class文件。下面的几点值得注意:

1.         我们使用-d命令行选项来告诉编译器把class文件放在tmpclass目录下面,而不是在确省的原文件目录下。这是因为在使用之前,所有装载到KVM中的class文件必须进行预验证(参照2.1.1.3,这将会创建一个修改的class文件。我们将使用tmpclass目录下的类文件作为预验证的输入并且把修改多的class文件写入到原文件的目录。

2.         当运行java编译器的时候,我们使用了-bootclasspath选项来改变装载的java核心类的位置。就如你将在2.2节中看见,CLDC没有包含所有J2SE的包和类,所以我们只要让编译器装载CLDC核心库就可以了,而不是J2SE的(确省的类库)。如果我们没有这么做,就有可能编译 引用J2SEAPI的代码。这将产生合法的代码,而当装载进入KVM的时候会导致错误。

在装载进入KVM之前,我们使用命令preverify来预验证代码。为了验证class文件并且把验证的版本写入原文件的相同目录,使用如下的命令:

preverify -classpath %CLDC_PATH%\common\api\classes;tmpclasses -d .

ora.ch2.HelloWorld

-classpath选项表示preverify搜索类的路径,-d表示预验证的类版本写入的位置。-classpath后面的路径在windows平台上以分号隔开(在linux或者solaris上以冒号隔开)注意与编译器需要原文件名不同的是,预验证器需要完整的java类名称。

如果需要验证一个以上的类的时候,有两种方法可以这样做。最直接的方法就是把需要验证的类列出来:

preverify -classpath %CLDC_PATH%\common\api\classes;tmpclasses -d .

ora.ch2.HelloWorld ora.ch2.Help

另外,如果我们在命令行上提供的目录,那么将会对这个目录下的所有类进行验证:

 

preverify -classpath %CLDC_PATH%\common\api\classes -d . tmpclasses

在这种情况下,我们没有必要在-classpath后面加上tmpclasses路径,因为我们已经在后面申明搜索路径了。

preverify命令的可选命令将会在第八章阐述。

最后,我们可以使用kvm来运行例子:

kvm -classpath . ora.ch2.HelloWorld

这将产生我们 熟悉的输出:

Hello, KVM world

注意classpath选项只需要指定ora.ch2.HelloWorld的路径。我们没有必要指定核心类的路径,因为KVM知道在那找到它们。