随笔 - 312, 文章 - 14, 评论 - 1393, 引用 - 0

导航

<2009年5月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

公告

关注我的新浪微博

我的著作









常用链接

留言簿(126)

我参与的团队

随笔分类(818)

随笔档案(310)

文章分类(1)

文章档案(8)

相册

ADSL、3G查询

CSDN

eclipse

ibm

Java EE

Linux

Web

云服务

代理网站

关注的网站

协议

喜欢的Blog

国内广告平台

图书出版

在线培训

开发工具

微博客户端

手机铃声

操作系统

  • ReactOS
  • 一个与windowXP/2003兼容的操作系统

数学

文件格式

源码资源

移动(Mobile)

编程语言

英语学习

最新随笔

搜索

  •  

积分与排名

  • 积分 - 1969740
  • 排名 - 6

最新评论

阅读排行榜

评论排行榜

使用脚本文件(jnlp)来发布Java程序

本文为原创,如需转载,请注明作者和出处,谢谢!

    发布Java程序(桌面程序)最直接的方法就是将jar文件打包交给用户。不过有时jar文件很多,也很大。为了方便,sun提供了另外一种方式来通过网络发布Java程序。这就是jnlp文件。可能很多读者曾经下载过很多jnlp文件,运行后会自动从指定的网站下载相应的文件。
    实际上,jnlp文件就是一个xml格式的脚本文件。假设我们有一个test.jar文件需要安装(该文件是一个基于SWT的桌面程序),那么要使用jnlp文件发布test.jar需要如下几步:

一、为test.jar文件签名
    从网络上下载就意味着风险大大增加,因此,要想通过jnlp从网络上下载jar文件,并运行,就需要对该文件进行签名。如果不签名,java程序将运行在sandbox中,也就是说无法访问本地资源,由于test.jar是swt程序,需要访问本地的dll(windows)或.so(linux)库,所以必须要对test.jar进行文件签名。
    签名需要一个证书,如果没有证书,可以使用如下的命令生成一个证书

keytool -genkey -alias nokiaguy -validity 12345 -keypass nokiaguypass -storepass nokiaguypass
-keystore nokiaguy.keystore -dname "CN=nokiaguy, OU=nokiaguy, O=D, L=CA, S=CA, C=CN"

    在执行上面的命令后,会在当前目录下生成一个nokiaguy.keystore文件。然后将test.jar复制到当前目录下。现在当前目录有两个文件:nokiaguy.keystore和test.jar。最后使用如下的命令对test.jar签名:

jarsigner -keystore nokiaguy.keystore -storepass nokiaguypass -keypass nokiaguypass test.jar nokiaguy

    在执行完上面的命令后,我们会发现test.jar文件的尺寸变大了。

二、建立虚拟目录

    下面就是在自己的机器上或服务器建立一个可访问的虚拟目录。本文使用了IIS建立一个虚拟目录,可通过http://200.200.200.200/key访问该目录,在该目录下只有一个test.jar文件(经过签名后的jar文件)。

三、编写jnlp文件
    在任意目录下建立一个test.jnlp文件,并输入如下内容:

<?xml version="1.0" encoding="utf-8"?>
<jnlp  spec="1.0+" codebase="http://200.200.200.200/key">
   
<information>
       
<title>CustomSWT</title>
       
<vendor>nokiaguy.blogjava.net</vendor
       
<homepage href="index.html"/>
   
</information>
   
<security>
       
<all-permissions/> 
   
</security>
   
<resources>
       
<j2se version="1.6.0"/>
       
<jar href="test.jar"/>
   
</resources>
    <application-desc main-class="CustomMain"/>
</jnlp>


    其中<jnlp>根元素通过codebase指定了虚拟目录的url。通过<jar>元素指定了要下载的test.jar文件。如果存在多个jar文件,可以有多个<jar>元素。<jar>元素的href属性指定要下载的jar文件,该文件路径是相对于codebase属性值的。如果要考虑不同的操作系统,可以将多个<resources>元素,如下面的代码所示:
    <resources os="Windows">
        
<jar href="win32/swt.jar"/>
        
<nativelib href="win32/swt-native-lib-win32.jar"/>
    
</resources>
    
<resources os="Linux">
        
<jar href="linux/swt.jar"/>
        
<jar href="linux/swt-pi.jar"/>
        
<nativelib href="linux/swt-native-lib-linux.jar"/>
    
</resources>

    要注意,必须使课堂<application-desc>元素指定要运行的主窗口的类名(带包名),由于本文使用的test.jar文件中主窗口类没有名,类名为CustomMain,因此,只main-class属性值为CustomMain。

    运行test.jnlp,一开始会显示如图1所示的欢迎界面。

图1
    然后会出现如图2所示的界面。
图2
    不过读者不要担心,这不是错误,而是说我们使用的证书并不是Sun支持的(而是我们自己生成的),因此,会出现这个证书提示(如果使用Sun支持的证书就不会出现这个异常,但要花钱的哦!)。选中“始终信任此发行者的内容”复选框,单击“运行”按钮,就会下载test.jar文件,并运行程序。再次运行test.jnlp文件,就会直接运行程序了(不会再出现图2的对话框)。
    如果这时服务端更新的test.jar,test.jnlp会自动检测程序文件的更新时间,如果服务端程序更新,则会重新下载该程序,并运行。因此,使用jnlp文件也可以实现实时更新程序的功能。有些象微软的smartclient。在更新服务端程序时,千万别忘了对程序进行签名啊,如果不签名,在运行jnlp文件时就会出现如图3所示的异常信息。
图3
    实际上,jnlp文件默认情况下将test.jar文件下载到C:\Documents and Settings\Administrator\Application Data\Sun\Java\Deployment\cache目录中。但文件名并不是test.jar,读者可以在该目录中查找所有的文件,并找与test.jar文件的大小一样的文件即可(一共也没多少文件,很好找)。如文件名为27a940d-69feaa17。如果服务端和客户端cache中的程序一样新或没有客户端的新,则jnlp会直接运行客户端cache中的程序。
    最后提一下,jnlp也是需要使用jre的哦,在使用jnlp之前,别忘了安装jre啊!





Android开发完全讲义(第2版)(本书版权已输出到台湾)

http://product.dangdang.com/product.aspx?product_id=22741502



Android高薪之路:Android程序员面试宝典 http://book.360buy.com/10970314.html


新浪微博:http://t.sina.com.cn/androidguy   昵称:李宁_Lining

posted on 2009-05-22 15:38 银河使者 阅读(5870) 评论(4)  编辑  收藏 所属分类: 原创安全程序发布

评论

# re: 使用脚本文件(jnlp)来发布Java程序[未登录]  回复  更多评论   

还是exe4j+Inno Setup 和install4j更好用
都可以把程序打包成一个安装程序并且把JRE也打包 用户只需双击鼠标,眯着眼睛点下一步直到安装完成就可以使用。。不许要拥护做任何多余的操作,傻瓜式的使用是用户更方便。
2009-05-27 04:27 | 小毅

# re: 使用脚本文件(jnlp)来发布Java程序  回复  更多评论   

@小毅
这个方法不光是安装程序哦。还有一个实时更新的功能,如果服务端的程序更新的,就不用每个客户端再次分发一遍安装程序了,只需要再运行jnlp文件就可以直接下载了。哈哈
2009-05-27 08:08 | 银河使者

# re: 使用脚本文件(jnlp)来发布Java程序[未登录]  回复  更多评论   

如果服务端的程序更新的,就不用每个客户端再次分发一遍安装程序了,只需要再运行jnlp文件就可以直接下载了。

呵呵 这功能不错。
你的博客写的很棒,敢肯定绝对是位牛人,而且还乐于分享、谦和、认真的朋友,支持你哈 ~0。0~。
2009-09-21 17:30 | 小毅

# re: 使用脚本文件(jnlp)来发布Java程序  回复  更多评论   

楼主:
想向你请教一个问题,如果我发布的java客户端要读取配置文件要怎么弄啊,
比如说:我的客户端里面有*.jar,*.property文件,jar文件可以通过<jar>标签配置下载,那property文件要怎么配置啊。用java web start 发布后要怎么取得property文件啊
2011-11-24 09:46 | 艾波

只有注册用户登录后才能发表评论。


网站导航: