使用脚本文件(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啊!

时间: 2024-09-20 17:55:43

使用脚本文件(jnlp)来发布Java程序的相关文章

jasperReport+iReport生成一个jasper文件后,用java程序调用该文件,报错误

问题描述 jasperReport+iReport生成一个jasper文件后,用java程序调用该文件,报错误 java.lang.ClassNotFoundException: org.codehaus.groovy.runtime.callsite.CallSiteArray at java.lang.ClassLoader.findClass(ClassLoader.java:531) at java.lang.ClassLoader.loadClass(ClassLoader.java:

Linux下启动java程序的通用脚本sh

在网上找到一个挺好的通用shell脚本. 只需要修改一些配置变量,就可以用来做起动脚本了. 并且除了能起动.还支持关闭.重启.查看是否正在运行的功能. 原文地址:http://www.tudaxia.com/archives/10 start函数中,nohup部分其实也可以提出来放入一个配置变量中.这里没有修改直接贴上作者的原文 #!/bin/sh #该脚本为Linux下启动java程序的通用脚本.即可以作为开机自启动service脚本被调用, #也可以作为启动java程序的独立脚本来使用. #

不错的linux下通用的java程序启动脚本(转载)

  转自:http://www.cnblogs.com/langtianya/p/4164151.html 虽然写起动shell的频率非常不高...但是每次要写都要对付一大堆的jar文件路径,新加jar包也必须要修改起动shell. 在网上找到一个挺好的通用shell脚本. 只需要修改一些配置变量,就可以用来做起动脚本了. 并且除了能起动.还支持关闭.重启.查看是否正在运行的功能. 原文地址:http://www.tudaxia.com/archives/10 start函数中,nohup部分其

java程序编码问题

问题描述 我在本地开发的程序,从本地文件中读取中文后,入库没有编码问题:但是我,把这个程序传到服务器上,我们的服务器是Linux的系统,文件系统是utf-8的.同样的程序,在Linux上运行读取文件里的中文,入库就是乱码了:在服务器上,如果我将中文直接写在程序里面入库,没有乱码问题.感觉应该是编码转换的事儿,我试了如下几种办法:1.String sql = new String(sql.getBytes("GBK"),"UTF-8");2.String sql =

java-如何使用Java程序或shell脚本删除某目录下匹配文件名的文件.

问题描述 如何使用Java程序或shell脚本删除某目录下匹配文件名的文件. 如何使用Java程序或shell脚本删除某目录下匹配文件名的文件. 解决方案 Java的话,直接调用File的delete方法就可以了.比如你拿到了要删除文件的路径为path.代码如下 File file = new File(path); file.delete(); 解决方案二: 先判断file是目录还是文件,如果是文件就匹配文件名删除,是目录就遍历,继续判断目录或文件(递归) 解决方案三: 要使用shell脚本删

利用 Java Web Start发布你用java程序

web|程序 前言:关于 JWSJWS 是作为 JSR-56 的一部分而创建的,目的是提供一种方法来分发在客户端上的 JVM 中运行的 Java 应用程序.JWS 包括以下特征: 部署 运行 JWS 应用程序包括选择 HTML 链接,与打开新的页面没有什么区别,惟一的不同之处在于 Web 服务器页面是 .jnlp 文件,该文件启动 JWS 插件来在客户端上本地下载和执行应用程序. 缓存 一旦应用程序下载完毕,就可以把它缓存在客户端电脑上.每当应用程序重新启动时,JWS 就检查服务器,查看是否有更

J2SE综合:浅谈java程序发布之jre篇

Java开发程序,发布时总要考虑的问题就是怎么在使用者的机器上装好JRE.要考虑的问题很多:使用者有没有能力独自安装JRE,使用者已有的 JRE 和我们需要的版本是不是一致,会不会出现版本问题,等等.使用.NET要考虑的问题就少些.现在.NET CLR似乎已经很普及了,看好多D版的 Win XP都会自己安装最新的.NET CLR,而且似乎它的安装界面也比JRE友好些.彻底解决安装JRE的问题的方案,就是让我们的应用程序自己背着JRE!这样,我们的程序就像传统的Win32应用程序一样,双击就可以执

java-操作数据库的.exe程序,可以批量执行sql脚本文件

问题描述 操作数据库的.exe程序,可以批量执行sql脚本文件 求大神帮忙啊~用java可以做这个东西吗?完全没有思路啊,要求是可以操作局域网内的另一台电脑上的mysql数据库 解决方案 如果有访问权限的话,直接运行Runtime.getRuntime().exec("远程IP文件路径exe文件");如果没有,那可以先用java进行telnet连接到那台机器,然后调用exe程序,再不行就只能在远程机器上写webservice服务然后调用了. 解决方案二: 批量执行SQL脚本 解决方案三

linux下执行java程序的sh脚本分享_java

今天大概耗费了快一天的时间研究怎么用脚本执行java程序,终于实现了,分享一下 (1)在linux下写一个.sh文件 (2)文件内容如下: 复制代码 代码如下: #!/bin/sh         //bash文件头 APP_HOME=/home/blmcrm/crm/A      //要执行的java文件中bin文件的上一个目录,我的目录是/home/blmcrm/crm/A/bin/blm......(后面不写了),总之就是写bin目录前面的部分,因为jar包在bin目录里面,如果不在bin