使用Java Web Start部署java application

标签: javaapplicationwebjartomcatsecurity
3847人阅读 评论(2) 收藏 举报
分类:

使用Java Web Start部署java application

 

Java Web Start(以下简称JWS)是SUN提供的一种通过Web来部署和发布Java 程序的新技术,它既可以用来发布Application,也可以用来发布Applet,它仅在第一次运行时下载程序,以后的事情,就全全交给JWS,包括版本的自动更新和维护。这是我们曾经梦寐以求的事情,程序运行在客户端(本地运行,当然有足够的速度),但不用去安装配置客户端,也不用去考虑版本升级后对客户端的维护,这就是JWS提供给我们的好处之一。

 

本文所应用的平台是JDK5.0tomcat5.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 valuekey)

会提示你输入用户名、密码、公司、省、国家等,不用管,随意输入一些就可以了,但是必须要记住密码,不要忘了,否则就得重新签名了。在这一堆问题的最后,会提示你保存[],这里输入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页面
编写web项目的index.jsp文件,以便打开时使用。
代码如下

<%@page contentType="text/html;charset=gb2312"%>

<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的客户端,你可以自己提供下载或是直接链接到SunJWS下载。

//分为两种,如果客户端已经安装了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,应是gifjpeg格式。需自行修改。

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.sfjwstest是你在进行签名时-alias后的命名)文件,他详细的列出了所有已签名的文件,以分析签名失败的原因。

 

 

 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1712923次
    • 积分:20446
    • 等级:
    • 排名:第401名
    • 原创:492篇
    • 转载:112篇
    • 译文:19篇
    • 评论:217条
    文章存档
    最新评论
    老婆