如何在arm平台上运行jetty5(包含移植jamvm + classpath过程)

上传人:kms****20 文档编号:40448298 上传时间:2018-05-26 格式:DOC 页数:13 大小:42.50KB
返回 下载 相关 举报
如何在arm平台上运行jetty5(包含移植jamvm + classpath过程)_第1页
第1页 / 共13页
如何在arm平台上运行jetty5(包含移植jamvm + classpath过程)_第2页
第2页 / 共13页
如何在arm平台上运行jetty5(包含移植jamvm + classpath过程)_第3页
第3页 / 共13页
如何在arm平台上运行jetty5(包含移植jamvm + classpath过程)_第4页
第4页 / 共13页
如何在arm平台上运行jetty5(包含移植jamvm + classpath过程)_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《如何在arm平台上运行jetty5(包含移植jamvm + classpath过程)》由会员分享,可在线阅读,更多相关《如何在arm平台上运行jetty5(包含移植jamvm + classpath过程)(13页珍藏版)》请在金锄头文库上搜索。

1、如何在如何在 armarm 平台上运行平台上运行 Jetty5(Jetty5(包含移植包含移植 jamvmjamvm + + classpathclasspath 过程过程) )Jetty 虽然是 Java 编写的程序,可以跨平台使用,但需要 java 虚拟机来启动,而 java 虚拟机并不是跨平台的,要重新寻找一个能在linux 系统中使用且占用空间尽可能小的 java 虚拟机。由于 arm 只提供最多 52M 的空间,所以不得不排除我们最常用的 sun 公司的jre,因为它的安装目录达到 134M,大大超过可用空间,裁剪工作也不太容易。经过查找资料,基本确定以下几种方案:1)CVM + j

2、etty5SUN 公司的 J2ME 是专为移动设备设计的,在移动通信设备上已经有广泛的应用,很适合在嵌入式中使用。CVM 是一个具有完整的J2SE L3 VM 支持能力的 Java 虚拟机,但又比标准的 J2SE VM 小。作为一个全功能的 Java 虚拟机,CVM 几乎支持 J2SE VM 的所有先进特性,包括最底层的调错处理和本地语言接口。2)Android + i-jettyi-jetty 是 google 公司基于 jetty 开发的运行在 Android 平台上的 web 容器,使手机也能搭建 web 服务。3)Jamvm + GNU classpath + jetty5Jamvm

3、是一个 c 语言编写的开源的 java 虚拟机,它使用 GNU classpath 作为 java 类库。首先采用第一种方案,具体操作过程见我的另一篇文章,这里只想说明结果。在对 arm 平台的 CVM 进行测试后发现,自带的HelloWorld 和 Test 程序输出结果正常,但是启动 jetty 就会出现java.lang.UnsatisfiedLinkError 异常,根据出错提示查看类库确实缺少很多类。后来使用裁剪的 rt.jar 仍然出现异常,看来 CVM 只适合小应用程序,对 jetty 这种比较大型的网络程序不太适合。第二种方案没有过多去研究就否定了,我们的 arm 板运行的是l

4、inux,不可能更换成 Android,如果想要使用 i-jetty 就得安装Android 模拟器,可是该模拟机占用空间不小,也就没有花费太长时间去尝试。第三种方案是研究时间最长,最有可能实现的方案了。虽然arm 板上已有 linux,但由于硬件限制不能在其上编译程序,所以还要准备其他的主机来完成编译工作,然后再将文件复制到 arm 板上。起先使用同事给我的 Redhat Linux 虚拟镜像,但是无论怎样编译classpath 都编译不过。网上查找了很多有关这方面的资料,都没有人在 Redhat 下编译 jamvm + classpath 成功的例子,倒是在Ubuntu 下成功过。于是自己

5、在 VMware 中安装了 Ubuntu 8.04 服务器版的虚拟镜像(可从项目服务器下载) ,经过几天时间的编译、调错,终于找出能够编译成功的版本组合。下面主要讲解的编译环境和操作过程就是基于第三种方案jamvm + GNU classpath。编译环境及工具Ubuntu 8.04 虚拟镜像项目服务器上的镜像,已安装了编译所需的其他工具如gcc、zlib、gcj、ecj 等, 如果使用其他 Ubuntu 版本,需在编译时根据提示安装相应的程序。 Arm 交叉编译链 4.3.2提供的虚拟镜像中已经安装好,不需再安装,用来编译 arm 平台上运行的 c 和 c+程序。 GNU Classpath

6、 0.93Jamvm 使用的 java 类库,需要交叉编译。 Jamvm 1.5.1一个开源的 java 虚拟机,需要交叉编译。 Jetty 5.1.12Java 编写的开源 web 容器,不需要交叉编译。 我们大部分工作都是在虚拟机中完成的,包括编译、打包、测试等等,虽然在 arm 上运行和虚拟机上运行结果有可能不尽相同,但经过我的运行测试发现,在 arm 上运行不了而出错的话,在虚拟机中运行出现同样的错误,所以一般我都会在虚拟机中调试好,程序能够运行再放到 arm 板,这样成功率更大。工作目录 homekikiworkArm 交叉编译链、GNU Classpath、jamvm 和 jett

7、y5 源程序都存放在 work 工作目录下,环境变量中需指定 arm 交叉编译链的路径。目标目录 tmp为了能与 arm 平台的目标目录相同,使用 tmp 文件夹作为编译的目标文件夹。用来存放 GNU Classpath 和 jamvm 编译后的文件,需要在 configure 时指定目标路径。Classpath 0.9.3 + jamvm 1.5.1 这是我测试过,能编译成功的版本组合,但可能并不是唯一的。由于操作系统和安装软件不全的关系,在别人的 Ubuntu 上匹配的版本组合在我这里却不行,可是公司网速慢啊,在线安装软件不太可行,勉强安装好必须的软件,下面就使用这个组合吧。编译 Clas

8、spath $ tar zxf classpath-0.93.tar.gz解压缩 Classpath 0.93 $ cd classpath-0.93进入 classpath 文件夹 $ ./configure -prefix=/tmp/classpath -disable-gtk-peer -disable-gconf-peer -disable-plugin -with-ecj -host=arm-linux检查 classpath 所需的编译环境,生成 makefile 文件-prefix 最终编译文件的目标路径。-host 目标程序运行平台,arm-linux 表示编译成 arm 平台

9、程序,省略这个参数表示编译成 x86 平台程序。-disable-gtk-peer-disable-gconf-peer-disable-plugin系统中缺少这几个程序,添加这三个参数使编译能够通过。 $ make编译 $ make install编译安装 复制/tmp/classpath 整个文件夹到目标板的/tmp 目录下,也可以先打包,在 arm 上再解压。编译 Jamvm $ tar zxf jamvm-1.5.1.tar.gz解压缩 jamvm-1.5.1 $ cd jamvm-1.5.1进入 jamvm 文件夹 $ ./configure -prefix=/tmp/jamvm -

10、with-classpath-install-dir=/tmp/classpath host=arm-linux-with-classpath-install-dir jamvm 运行时调用 java类库的路径 $ make编译 $ make install编译安装 复制/tmp/jamvm 整个文件夹到目标板的/tmp 目录下 $ vi /etc/profile 设置环境变量,修改 PATH 内容,PATH=$PATH:/tmp/jamvm/bin $ . /etc/profile保存环境变量使之立即生效,运行 jamvm 命令看看,出现帮助说明环境变量已经设置成功。裁剪 Jetty 5.1

11、.12Jetty 在启动时会生成临时文件,需要频繁读写文件,这样会直接影响 arm 平台,导致 flash 卡上的文件不能删除,不得不重新做卡。所以 jetty-5.1.12.zip 这个文件不能解压到/tmp 下,只能解压到/home 目录下,这里是内存,允许频繁读写。但由于 jetty程序指定了在系统临时文件夹下创建临时文件,而 linux 的临时文件夹就是/tmp 目录,查找资料发现如果在 jetty 工作目录下创建一个 work 目录的话,程序就会在 work 目录下生成临时文件,这样就不会影响系统的/tmp 目录了。为了节约空间,对 jetty 的源码包做裁剪,删除启动过程中用不到的

12、文件。经过反复测试,以下目录可以删除:demojavadocjsp_srcsrctesttestdocswebappstemplate另外在 zip 包中添加 work 空文件夹,以免解压后忘记创建它,后果很严重!上传裁剪好的 jetty.zip 到 arm 板/tmp 目录下,然后解压到/home 目录下,注意/home 是内存,所以重启后内容清空,需重新解压。启动 Jetty5 进入/home/jetty-5.1.12 文件夹 命令行方式启动jamvm -D.ssl.trustStore=etc/mytruststore -D.ssl.trustStorePassword=11111111

13、 jar start.jar 可能出现的问题及解决方法configure error : C compiler cannot create executables 可能 gcc 编译环境没配好,直接 sudo apt-get install gcc libc6-dev 就可以解决,但需要联网下载所需的文件。启动 jetty 出现 java.lang.NoClassDefFoundError: java/util/concurrent/ConcurrentHashMap 异常 重新编译 Classpath,首先更改目标路径/tmp/classpath1,参数中去掉host=arm-linux,然

14、后 make 和 make install,打开tmpclasspath1shareclasspathglibj.zip,将java/util/concurrent 整个文件夹拖动到tmpclasspathshareclasspathglibj.zip,最后替换 arm 板的glibj.zip 文件。启动 jetty 出现 java.lang.NoClassDefFoundError: org/mortbay/util/ArrayQueue,Caused by: java.lang.NoClassDefFoundError: java/util/Queue 异常 解决方法同上,把 x86 平台

15、的 glibj.zip 中的 Queue.class 文件放到 arm 平台的 glibj.zip,然后替换 arm 板上的文件。启动 jetty 出现 java.security.NoSuchAlgorithmException: Algorithm SunX509 of type KeyManagerFactory from provider gnu.javax.security.auth.callback.GnuCallbacks: name=GNU-CALLBACKS version=2.1 is not found 该问题由于取消 etc/jetty.xml 中有关 ssl 服务的注

16、释导致,通过测试程序 TestSunX509 得知 jetty 默认使用 jks 的 keystore和 SunX509 算法都不能用,修改 jetty.xml,在 ssl 服务段中加入以下几行代码JESSIEX509GKR修改11111111修改11111111进入 etc 文件夹,依次执行以下命令:keytool genkey alias localhost keystore mykeystorekeytool genkey alias localhost keystore mytruststore按照提示输入字符即可创建 GKR 格式的 keystore 和 truststore,密码都为 8 个 1。启动 jetty 出现 java.security.KeyStoreException: java.io.FileNotFoundException: /tmp/jamvm/lib/securit

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号