最近由于客户要求,需要一个三维效果进行一些功能的展示所以用到了WorldWind。由于之前对Applet不是很了解,中间遇到了很多让人不解的问题,经过反复的折腾总算是在页面中把WorldWind加载了出来,下面说说我的操作步骤和遇到的问题。
1.我首先写了一个Applet小程序并打成jar包,其实就是用于显示WW的地球。然后用Eclipse 运行Applet程序,查看效果没有问题。但是放到工程中用Tomcat发布以后就出来了第一个问题报错没有签名。于是乎google,查到找了签名的最简单方法。
先是创建签名密匙证书,用cmd打开命令行,输入下面的命令:
keytool -genkey -alias Test -validity 3650
这个命令的的意思是 使用 keytool 工具创建签名密匙证书
-genkey 参数表示是创建操作
-alias 参数表示 给这个证书取一个别名 我这里用的别名是 Test
-validity 参数表示的是这个证书的有效期 我这里用3650 表示 十年。
这个命令执行后会提示属于一些证书的相关信息,如密码,单位,之类的按自己的情况填写即可。
然后用这个证书给我的jar进行签名,使用如下命令:
jarsigner WWJApplet.jar Test
这个命令的意思是,使用jarsigner命令为一个jar文件签名,
第一个参数 WWJApplet.jar 指的是我要签名的jar文件的名字,第二个参数 Test指的是我刚刚创建的证书的别名。
2.编写JNLP文件,具体格式可以google一下我不做太多说明(其实我也不是特别清楚,只是看了一下Oracle的官方文档,但是有些参数还是不太清楚),我这里把我得JNLP文件贴在这里。
<?xml version="1.0" encoding="UTF-8"?> <jnlp spec="1.6+" codebase="http://localhost:8080/testProject" href="WWJApplet.jnlp"> <information> <title>MyApplet</title> <vendor>测试</vendor> <offline-allowed/> </information> <security> <all-permissions/> </security> <resources os="Windows"> <property name="sun.java2d.noddraw" value="true"/> </resources> <resources> <!-- Application Resources --> <j2se version="1.6+" href= "http://java.sun.com/products/autodl/j2se" initial-heap-size="512m" max-heap-size="512m"/> <property name="sun.java2d.noddraw" value="true"/> <jar href="WWJApplet.jar" main="true" /> <jar href="worldwind.jar" /> <jar href="jogl.jar" /> <jar href="gluegen-rt.jar" /> </resources> <applet-desc name="测试程序" main-class="MyApplet" width="500" height="500"> <param name="separate_jvm" value="true"/> </applet-desc> <update check="background"/> </jnlp>
这里需要注意的地方就是,第二个resources节点中 jar节点引用的四个jar包,其中MyApplet.jar是我自己写的Applet文件打成的jar包,另外三个是WW需要引用的三个jar包。这里重点说明一下,由于worldwind下载以后会有一个worldwind.jar文件,但是这里我用的不是这个jar,而是我根据WW源码自己打包的。就是为了能够自己签名,因为自带的worldwind.jar包文件已经被签名了,如果自己重新签名发布会有问题。另外两个jar包也使用刚刚创建的密匙文件进行签名。
然后把jar文件和html页面放入到工程根目录,如下(也可以根据自己的需要随意放置):
3.具体的html代码如下图:
然后启动tomcat就可以查看到效果。
在做这个例子的时候我遇到了三个问题,
1.签名的问题。
当时参考了这个博客 http://www.cnblogs.com/jingua1026/articles/1275209.html
2.jar引用不到的问题。
在网上看到很多例子里边都是把applet中引用的jar包写在html applet标签的 archive属性中,但是不知道为什么我这么写就一直是引用不到,很费解。
具体写法就是这样
<applet codebase="." code="WWJApplet.jar" width="100%" height="500" archive="jogl.jar, gdal.jar, worldwind.jar, worldwindx.jar, gluegen-rt.jar, plugin.jar"> <param name="jnlp_href" value="WWJApplet.jnlp"> <param name="codebase_lookup" value="false"> <param name="subapplet.classname" value="WWJApplet"> <param name="subapplet.displayname" value="WWJ Applet"> <param name="noddraw.check" value="true"> <param name="progressbar" value="true"> </applet>
3.就是从nasa下载的worldwind.jar包签名问题,使用源码自己打包重新签名就可以了。
说来惭愧,第一次写博客可能有说的不清楚明白的地方请见谅,如果有朋友也遇到类似的问题可以@我。
顺便说一句,applet 标签中的 codebase 的内容不是相对于工程的而是相对于当前文件的(html).