使用Java Web Start部署java application
Java Web Start(以下简称JWS)是SUN提供的一种通过Web来部署和发布Java 程序的新技术,它既可以用来发布Application,也可以用来发布Applet,它仅在第一次运行时下载程序,以后的事情,就全全交给JWS,包括版本的自动更新和维护。这是我们曾经梦寐以求的事情,程序运行在客户端(本地运行,当然有足够的速度),但不用去安装配置客户端,也不用去考虑版本升级后对客户端的维护,这就是JWS提供给我们的好处之一。
本文所应用的平台是JDK5.0+tomcat5.5
搭建WEB平台
Tomcat3.2.1以上版本,需要修改找到TOMCAT_HOME/conf下的web.xml文件,在其中添加
<mime-type>
application/x-java-jnlp-file
</mime-type>使其能支持jnlp文件
在tomcat 5.5版本安装后已经就默认增加了对jnlp文件的支持,不用修改web.xml。
使用eclipse等工具创建一个web project,将要发布的jar文件拷贝到下面。比如apps/lib
签名应用程序
l 开发程序,将程序打成一个或多个jar文件
l 如果应用程序会用到本地资源,比如文件、目录等,则需要对jar文件进行签名。通过以下的步骤给程序签名:
i. 首先确保安装了java2,在命令提示符下
C:/Webapps> keytool -genkey -keystore myKeystore -alias jwstest (jwstest
是对应的key value的key)
会提示你输入用户名、密码、公司、省、国家等,不用管,随意输入一些就可以了,但是必须要记住密码,不要忘了,否则就得重新签名了。在这一堆问题的最后,会提示你保存[否],这里输入Y即可,你就可以看到在本地产生了一个myKeystore的文件。
ii.
如果你想察看一下刚才生成的myKeystore文件的内容,可以使用下面这句话:
C:/Webapps> keytool -list -keystore myKeystore
可以看到内容。
iii.
对需要签名的jar文件签名。
C:/Webapps> jarsigner -keystore myKeystore xxxxxx.jar jwstest (jwstest是你刚才产生的key,可以在一个文件中有多个key value)
签名过程如下:
会出现一个警告:签名6个月后失效。
iv.
如果有不同目录的多个jar文件需要签名,则需要将myKeystore文件拷贝到要签名的目录,注意,要采用相同的myKeystore文件,否则会产生签名不一样的情况。另外,在签名过程中,如果录入的jar文件不存在,不会给出任何提示,这点需要注意。
部署应用程序
在eclipse中,将web应用发布,检查tomcat下面是否已经发布成功,并且检查是否有签名。以后再更新jar文件后,也需要签名后再发布。
编写JSP页面 <html> <title> JWS Test </title> <head> <SCRIPT LANGUAGE="Javascript"> var javawsInstalled = 0; isIE = "false";
if (navigator.mimeTypes && navigator.mimeTypes.length) { x = navigator.mimeTypes['application/x-java-jnlp-file']; if (x) javawsInstalled = 1; } else { isIE = "true"; }
function insertLink(url, name) { if (javawsInstalled) { document.write("<a href=" + url + ">" + name + "</a><br><br>"); } else { document.write("<a href=" + url + ">"+ name +"</a><br><br>"); } }
</SCRIPT> <SCRIPT LANGUAGE="VBScript"> on error resume next If isIE = "true" Then If Not(IsObject(CreateObject("JavaWebStart.IsInstalled"))) Then javawsInstalled = 0 Else javawsInstalled = 1 End If End If </SCRIPT> <SCRIPT LANGUAGE="Javascript"> if(javawsInstalled){ insertLink("http://你的IP:8080/ JWSTest /apps/JWSTest.jnlp"," JWSTest "); }else{ //通知用户要先安装JWS的客户端,你可以自己提供下载或是直接链接到Sun的JWS下载。 //分为两种,如果客户端已经安装了Java运行环境,则只要下载javaws-1_0_1_01-win-int.exe即可。 //如果客户端没有安装Java运行环境,则要下载完整的javaws-1_0_1_01-win-int-rt.exe。 } </SCRIPT> </head> <body> </body> </html> |
编写JNLP文件
<?xml version="1.0" encoding="utf-8"?>
<!-- JNLP File for SwingSet2 Demo Application -->
<jnlp
spec="1.0+"
codebase="http://192.168.71.214:8080/jwstest/apps"
href="jwstest.jnlp">
<information>
<title> JWS Test </title>
<vendor>wonder</vendor>
<homepage href="JWSTest.html"/>
<description> JWS Test </description>
<icon href="images/JWSTest.jpg"/>
<offline-allowed/>
</information>
<security>
<all-permissions/>
</security>
<resources>
<j2se version="1.5"/>
<jar href="lib/finss.jar" main="false"/>
<jar href="lib/lib/full/activation.jar" main="false"/>
<jar href="lib/lib/full/axis.jar" main="false"/>
<jar href="lib/lib/full/commons-collections-2.1.jar" main="false"/>
<jar href="lib/lib/full/commons-io-1.2.jar" main="false"/>
<jar href="lib/lib/full/commons-logging-1.0.2.jar" main="false"/>
<jar href="lib/lib/full/commons-net-1.4.1.jar" main="false"/>
<jar href="lib/lib/full/crimson.jar" main="false"/>
<jar href="lib/lib/full/helpdoc.jar" main="false"/>
<jar href="lib/lib/full/iText.jar" main="false"/>
<jar href="lib/lib/full/iTextAsian.jar" main="false"/>
<jar href="lib/lib/full/jacob.jar" main="false"/>
<jar href="lib/lib/full/jacob-dll.jar" main="false"/>
<jar href="lib/lib/full/jakarta-oro-2.0.8.jar" main="false"/>
<jar href="lib/lib/full/jasperreports-1.2.0.jar" main="false"/>
<jar href="lib/lib/full/javaws.jar" main="false"/>
<jar href="lib/lib/full/jcommon-1.0.0-pre2.jar" main="false"/>
<jar href="lib/lib/full/jface.jar" main="false"/>
<jar href="lib/lib/full/jfacetext.jar" main="false"/>
<jar href="lib/lib/full/jfreechart-1.0.0-pre2.jar" main="false"/>
<jar href="lib/lib/full/jh.jar" main="false"/>
<jar href="lib/lib/full/jqintf.jar" main="false"/>
<jar href="lib/lib/full/jxl.jar" main="false"/>
<jar href="lib/lib/full/LinearBarCode.jar" main="false"/>
<jar href="lib/lib/full/LookAndFeel.jar" main="false"/>
<jar href="lib/lib/full/mail.jar" main="false"/>
<jar href="lib/lib/full/neu_cl.jar" main="false"/>
<jar href="lib/lib/full/Portal.jar" main="true"/>
<jar href="lib/lib/full/RCF20.jar" main="false"/>
<jar href="lib/lib/full/OracleJdbcDriver9i.jar" main="false"/>
<jar href="lib/lib/full/ReportAndPrint.jar" main="false"/>
<jar href="lib/lib/full/resource.jar" main="false"/>
<jar href="lib/lib/full/runtime.jar" main="false"/>
<jar href="lib/lib/full/soap.jar" main="false"/>
<jar href="lib/lib/full/swt.jar" main="false"/>
<jar href="lib/lib/full/swt-patch.jar" main="false"/>
<jar href="lib/lib/full/swt-win32-3007.jar" main="false"/>
<jar href="lib/lib/full/weblogic8_simple.jar" main="false"/>
<jar href="lib/lib/full/xml.jar" main="false"/>
</resources>
<application-desc main-class="com.xxxxxxt.ermsuite.platform.portal.workbench.ClientMain"/>
</jnlp>
这个文件中,要注意的是<jar ... main=”true”/>如果都不加这个,则默认main class在第一个jar文件中。增加了这个内容后,可以将多个jar文件放在不同的地方,便于管理。同时finss.jar中的MENIFSET中也得增加classpath的描述,参见我的另外一个文档。
文件内容格式的说明:
<jnlp>元素
spec:必须是1.0及以上版本,这里用1.0+,不需修改。
codebase:资源的URL,是JNLP指向各连接的起始处,需自行修改。
Href:JNLP文件相对codebase的存放位置,和JNLP文件的全名,需自行修改。
<infomation>元素
Title:发布的应用程序简单标题,需自行修改。
Vendor:发行商信息,可以写上你的大名,需自行修改。
Homepage:存放有关应用程序的相关文档的URL,如help文件等,可有可无。
Description:对应用程序的描述,可以有多对<description></description>,可有可无。
Icon:用户下载你的应用程序后,在JWS里显示的图标的URL,应是gif或jpeg格式。需自行修改。
Offline-allowed:选择项,允许用户离线运行应用程序,一般都会有,不用修改。
<security>元素
选择项,如果没有指明<security>,默认是不允许应用程序访问用户的本地资源,即应用程序是沙箱运行。
如果设定为<all-permissions/>,则表示允许应用程序访问用户的本地资源。一般都会设定此值。
<resource>元素
<j2se version = 指定jdk版本>
<jar href = 指定需发布的应用程序的jar包存放的位置>
<application-desc>元素
main-class:应用程序运行启动的主类
<argument>:应用程序运行时的参数,可以有多个,每一个参数用一对<argument>参数</argument>。
至此,你已经完全构建了运转JWS的各部件。
发布和测试
前面我们已经准备好了需发布的应用程序的jar包,也写好了用来访问的jsp文件和服务器端的核心jnlp文件。
第一步:在JWSTest下新建目录jsp。把index.jsp拷入jsp目录。
第二步:把jnlp文件直接拷入apps目录下。
第三步:在浏览器里输入:http://localhost:8080/JWSTest/jsp/index.jsp 即可访问到jsp页面。页面应出现JWSTest字样。
第四步:点击JWSTest,连接到apps下的JWSTest.jnlp文件,JWS启动,开始下载你发布的应用程序。
第五步:下载完毕,直接运行即可。以后,你也可以直接运行JWS客户端里已下载的应用程序。
FAQ
通过上面的讲述,你一定能体会到JWS的易用性。或许事情并没有那么简单,以我的使用经验,还会有许多问题出现,在这里挑几个经常出现的问题,给出相应解决方法,让大家少走弯路,而享受更多的乐趣。
问题一:JWS不能运行,JNLP文件像普通XML文件一样显示在Browser里
解决办法:请修改tomcat里,发布程序的路径中的web.xml。
在其中添加<mime-type>
application/x-java-jnlp-file
</mime-type>
以支持JNLP文件。
问题二:不能下载资源或下载资源失败
解决办法:请卸载JWS的客户端,并将注册表里有关JWS的项目都删除,并确保program Files下的Java Web Start目录已被删除,然后,重装JWS。
问题三:下载资源中有未签名文件
解决办法:1:确保所有的jar包及其他资源都进行过签名。
2:确保整个资源中,没有中文的命名。好像签名工具不支持中文命名的文件名,所以未签到名。这可让我郁闷了一下午哦。
3:察看已经签名的jar包中,meta-inf路径下的jwstest.sf(jwstest是你在进行签名时-alias后的命名)文件,他详细的列出了所有已签名的文件,以分析签名失败的原因。