使用脚本文件(jnlp)来发布Java程序
来源:互联网 发布:知柏地黄丸中的知母 编辑:程序博客网 时间:2024/04/25 12:14
本文为原创,如需转载,请注明作者和出处,谢谢!
发布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进行文件签名。
签名需要一个证书,如果没有证书,可以使用如下的命令生成一个证书
在执行上面的命令后,会在当前目录下生成一个nokiaguy.keystore文件。然后将test.jar复制到当前目录下。现在当前目录有两个文件:nokiaguy.keystore和test.jar。最后使用如下的命令对test.jar签名:
在执行完上面的命令后,我们会发现test.jar文件的尺寸变大了。
二、建立虚拟目录
下面就是在自己的机器上或服务器建立一个可访问的虚拟目录。本文使用了IIS建立一个虚拟目录,可通过http://200.200.200.200/key访问该目录,在该目录下只有一个test.jar文件(经过签名后的jar文件)。
三、编写jnlp文件
在任意目录下建立一个test.jnlp文件,并输入如下内容:
其中<jnlp>根元素通过codebase指定了虚拟目录的url。通过<jar>元素指定了要下载的test.jar文件。如果存在多个jar文件,可以有多个<jar>元素。<jar>元素的href属性指定要下载的jar文件,该文件路径是相对于codebase属性值的。如果要考虑不同的操作系统,可以将多个<resources>元素,如下面的代码所示:
要注意,必须使课堂<application-desc>元素指定要运行的主窗口的类名(带包名),由于本文使用的test.jar文件中主窗口类没有名,类名为CustomMain,因此,只main-class属性值为CustomMain。
运行test.jnlp,一开始会显示如图1所示的欢迎界面。
如果这时服务端更新的test.jar,test.jnlp会自动检测程序文件的更新时间,如果服务端程序更新,则会重新下载该程序,并运行。因此,使用jnlp文件也可以实现实时更新程序的功能。有些象微软的smartclient。在更新服务端程序时,千万别忘了对程序进行签名啊,如果不签名,在运行jnlp文件时就会出现如图3所示的异常信息。
最后提一下,jnlp也是需要使用jre的哦,在使用jnlp之前,别忘了安装jre啊!
国内最棒的Google Android技术社区(eoeandroid),欢迎访问!
《银河系列原创教程》发布
《Java Web开发速学宝典》出版,欢迎定购
发布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"
-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 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>
<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啊!
国内最棒的Google Android技术社区(eoeandroid),欢迎访问!
《银河系列原创教程》发布
《Java Web开发速学宝典》出版,欢迎定购
- 使用脚本文件(jnlp)来发布Java程序
- 使用脚本文件(jnlp)来发布Java程序
- 使用JNLP协议开发Java Web程序
- 解决在浏览器中打开java文件jnlp报错“该文件没有程序与之关联来执行该操作...”
- JNLP and Java Web Start 签名文件
- JNLP and Java Web Start 签名文件
- 如何实现在Maven下发布JNLP程序+jar数字签名
- 使用OTA来发布J2ME程序
- 使用OTA来发布你的程序
- 使用Phar来打包发布PHP程序
- 使用Java程序来实现HTTP文件的队列下载
- 使用Java程序来实现HTTP文件的队列下载
- Java网络加载协议(JNLP)
- jnlp(Java网络加载协议)
- jnlp文件 ContestAppletProd.jnlp无法打开
- 在.jnlp文件中使用"all-permissions"标签的解决方案
- 命令行启动Java web start 执行 jnlp文件
- java on Mac:解决无法打开jnlp文件的问题
- Base64编码原理与实现
- Java网络编程从入门到精通(17):Socket类的getter和setter方法(1)
- eclipse + JBoss 5 + EJB3开发指南(5):使用配置文件发布Session Bean
- eclipse + JBoss 5 + EJB3开发指南(4):Session Bean中的注释方法
- Java网络编程从入门到精通(16):客户端套接字(Socket)的超时
- 使用脚本文件(jnlp)来发布Java程序
- Java网络编程从入门到精通(15):为什么要使用SocketAddress来管理网络地址
- 制作Linux RPM包
- Java网络编程从入门到精通(14):多种多样的建立网络连接的方式
- 35岁之前成功的12条黄金法则
- eclipse + JBoss 5 + EJB3开发指南(3):使用Session Bean的本地接口
- Java网络编程从入门到精通(13):使用Socket类接收和发送数据
- eclipse + JBoss 5 + EJB3开发指南(2):编写有状态的SessionBean
- Java网络编程从入门到精通(12):使用isReachable方法探测主机是否可以连通