内容


使用 WebStart 发布 RCP 应用程序

Comments

Java WebStart简介

Java Web Start技术通过网络连接,旨在提供一种运行客户端应用程序的框架。用户不需要进行安装,只需在浏览器上点击一个超级链接,即可启动应用程序,并可与用户桌面进行无缝集成。Java Web Start使用JNLP配置文件对应用程序进行管理,下载后会在客户端进行缓存,下次启动时,如果网络连接可用,会首先检查是否有更新版本,自动完成应用程序的版本控制; 如果网络连接不可用,也可以以离线方式运行。

由于在JNLP配置文件中可以指定应用程序所使用的JRE版本(比如1.4+),所以当应用程序启动时,JWS会自动匹配已有的正确版本的JRE,如果没有找到,则会自动进行安装。同时,每一个应用程序都可以使用自己的JRE版本,互相不会影响。为了更加方便的启动应用程序,用户还可以通过"Java应用程序高速缓存查看器"(javaws.exe,位于JDK的Bin目录下)进行配置,在桌面上创建快捷方式,这样就不必每次重新打开浏览器页进行启动。

对于使用WebStart技术来运行的Java应用来说,用户使用它就和使用本地应用程序一样的简单,具体的技术知识可以从http://java.sun.com中寻找相关文档,这里不一一赘述。

环境准备

1. 安装JDK及JWS。一般来说,在安装JDK时会自动安装Java Web Start,当然,也可以单独对JWS进行安装。

2. RCP Examples应用的工程文件,见另一篇文章"使用Update Manager更新RCP应用程序"。或者也可以使用其它的RCP应用,只需改变JNLP的相应配置项即可。

3. Eclipse开发环境。建议使用3.2正式发行版。

创建JNLP功能部件

首先,为了方便的导出基于WebStart的RCP应用,我们需要创建一个包含RCP应用中所有功能部件的外围功能部件,用来对RCP应用进行打包。这个功能部件也会包含RCP的启动类org.eclipse.core.launcher.WebStartMain所在的startup.jar文件,以便在打包时一起发布。

启动Eclipse,打开菜单File->New->Project, 选中 Feature Project 并且键入工程名称,比如 com.ibm.csdl.guardian.examples.jnlp.feature。直接点击Finish使用默认设置结束工程的创建。

在功能部件清单编辑器中,切换到Included Features页,添加所包含的功能部件com.ibm.csdl.guardian.examples.feature。

在打包时,要保持原来RCP应用的目录结构,即根目录下有plugins和features(可无)子目录,并且使用一个可执行文件(比如eclipse.exe)去调用startup.jar。对于使用WebStart来启动的RCP应用来说,由WebStart代替了原来的可执行文件,并使用JNLP配置文件代替原来的eclipse.ini及config.ini。为了将startup.jar打包到根目录,我们在此功能部件目录下创建一个子目录。

选中功能部件com.ibm.csdl.guardian.examples.jnlp.feature,点击右键弹出菜单New->Folder,输入目录名,比如rootfiles,点击Finish。

切换到资源管理器,将Eclipse安装目录下的startup.jar文件拷贝到此根目录下。接下来需要修改此功能部件的build.properties文件如下:

root = rootfiles

这就告诉PDE的打包工具,所有rootfiles目录下的文件都会打包到指定打包目录的根目录下。

创建KeyStore

Java Web Start的安全机制要求所有的Jar文件必须进行数字签名,才能有对本地文件系统或网络资源进行访问的权限。对于使用JWS启动的应用程序来说,是运行在一个有限制的环境中的,称为沙箱。通过对Jar文件进行数字签名,可以赋予此沙箱以更多的访问各种资源的能力。具体的安全机制请参考JWS相关文献。

为了对Jar文件进行数字签名,我们需要先创建一个KeyStore文件,这可以使用JDK或JRE自带的keytool工具来完成(确保环境变量Path中包JDK或JRE的Bin目录):

keytool -genkey -alias alias_name -keypass key_pwd -storepass store_pwd -keystore keystore_file

接下来,将所生成的KeyStore文件拷贝到一个目录,在打包过程中会使用此文件对所有的插件Jar包进行数字签名。

打包并进行数字签名

首先,准备一个目录,比如D:\temp\examples,作为打包目录,同时也是放置主JNLP文件的目录。

在Eclipse中,打开菜单File->Export,选中Plug-in Development下的Deployable features,点击Next。在可用功能部件列表中,将com.ibm.csdl.guardian.examples.jnlp.feature选中。

在Destination页,输入或浏览选定所准备的打包目录:

在Options页,选中"Package as individual JAR archives…":

在JAR Signing页,输入或浏览选定放置KeyStore的目录,所使用的别名及密钥库的库密码(在创建KeyStore时指定):

这里需要确认Eclipse开发环境是基于JDK的,而不是基于JRE,因为打包工具会调用JDK Bin目录下的Jarsigner程序对所有RCP应用所包含的Plugin Jar文件进行数字签名。

在Java Web Start页,选中"Create JNLP manifests for the JAR archives"并指定所创建的JNLP文件所使用的CodeBase(这里我们使用本地文件系统以方便测试,正式发布时一般使用一个WEB站点的URL)及JRE版本:

点击Finish,完成打包过程。注意所生成的features目录下的com.ibm.csdl.guardian.examples.feature_1.0.0.jnlp文件,我们将使用此文件作为主JNLP的扩展配置文件,在下一节将详细分析此配置文件。

最后一步,使用相同的密钥库及库密码,还需要对startup.jar文件进行数字签名:

jarsigner -keystore keystore_file startup.jar alias_name

创建主JNLP文件

主JNLP文件是启动应用程序的入口,在此文件中会指定所要运行的主类及需要下载的Jar包文件。

创建一个JNLP配置文件examples.jnlp:

<?xml version="1.0" encoding="UTF-8"?>
<jnlp
spec="1.0+"
<!--指定发布站点的URL,这里我们使用本地文件系统-->
codebase="file:/d:/temp/examples"
<!-- 这里设定JNLP配置文件 -->
href="examples.jnlp">
  <!-- 下面是有关此应用程序的一些基本信息 -->
  <information>
    <title>Examples RCP Application</title>
    <vendor>Jerome</vendor>
    <homepage href="http://www.eclipse.org"/>
    <description>Examples RCP Application</description>
    <icon kind="splash" href="splash.gif"/>
    <offline-allowed/>
  </information>
  <security>
     <!-- 设置此RCP应用对文件系统进行完全的访问权限 -->
     <all-permissions/>
  </security>
  <!-- 设置此应用程序的启动类,RCP应用总是由此类来引导启动 -->
  <application-desc main-class="org.eclipse.core.launcher.WebStartMain">
     <!--  这里可以设置应用程序启动时所要传递的参数,
	 与eclipse.exe所使用的参数类似 -->
     <argument>-nosplash</argument>
  </application-desc>
  <resources>
   <!--  指定此应用程序所使用的JRE版本 -->
   <j2se version="1.4+" />
   <!--  指定启动类所在的Jar包,发布RCP应用时总是要下载此Jar包 -->
   <jar href="startup.jar"/>
   <!--  这里设置扩展配置文件的地址,对于JWS管理器来说,
   一个扩展配置文件即对应一个库,主应用程序可以使用多个库来完成特定的功能。
   扩展配置文件也是可以再包含扩展配置文件的,即可以递归使用 -->
   <extension
      name="Examples RCP Feature"
      href="features/com.ibm.csdl.guardian.examples.feature_1.0.0.jnlp"/>
  <!--  这里设置RCP应用程序的工作空间目录,
  与普通RCP应用中config.ini的配置项类似 -->
  <property
      name="osgi.instance.area"
      value="@user.home/Application Data/examples"/>
  <!--  设置RCP应用的配置文件目录 -->
  <property
      name="osgi.configuration.area"
      value="@user.home/Application Data/examples"/>
  <!--  设置RCP应用启动时所要运行的产品Id,与config.ini中的配置相同 -->
  <property
      name="eclipse.product"
      value="com.ibm.csdl.guardian.examples.product"/>
  </resources>
</jnlp>

主JNLP配置文件作为启动应用程序的入口,会调用其扩展配置文件――由PDE生成的com.ibm.csdl.guardian.examples.feature_1.0.0.jnlp配置文件中的设置项。

下面是此扩展配置文件的内容,与主JNLP配置文件的结构相同:

<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+" codebase="file:/d:/temp/examples">
	<information>
		<title>Examples Feature</title>
		<vendor>Jerome</vendor>
		<offline-allowed/>
	</information>
	<security>
		<all-permissions/>
	</security>
	<component-desc/>
	<resources>
		<j2se version="1.4+" />
	</resources>
	<resources>
     <!--  这里指定所有需要下载的Jar文件 -->
		<jar href="plugins/com.ibm.csdl.guardian.examples_1.0.0.jar"/>
		<jar href="plugins/com.ibm.icu_3.4.4.1.jar"/>
		<jar href="plugins/org.eclipse.core.commands_3.2.0.
		I20060511-0800a.jar"/>
		<jar href="plugins/org.eclipse.core.
		contenttype_3.2.0.v20060601a.jar"/>
		<jar href="plugins/org.eclipse.core.
		expressions_3.2.0.v20060602-0010.jar"/>
		<jar href="plugins/org.eclipse.core.jobs_3.2.0.v20060601a.jar"/>
		<jar href="plugins/org.eclipse.core.runtime_3.2.0.v20060601b.jar"/>
		<jar href="plugins/org.eclipse.
		equinox.common_3.2.0.v20060601a.jar"/>
		<jar href="plugins/org.eclipse.
		equinox.preferences_3.2.0.v20060601.jar"/>
		<jar href="plugins/org.eclipse.
		equinox.registry_3.2.0.v20060601.jar"/>
		<jar href="plugins/org.eclipse.help_3.2.0.v20060518.jar"/>
		<jar href="plugins/org.eclipse.jface_3.2.0.I20060602-0010.jar"/>
		<jar href="plugins/org.eclipse.osgi_3.2.0.v20060601.jar"/>
		<jar href="plugins/org.eclipse.swt_3.2.0.v3232l.jar"/>
		<jar href="plugins/org.eclipse.
		swt.win32.win32.x86_3.2.0.v3232l.jar"/>
		<jar href="plugins/org.eclipse.ui_3.2.0.I20060602-0010.jar"/>
		<jar href="plugins/org.eclipse.ui.forms_3.2.0.v20060530.jar"/>
		<jar href="plugins/org.eclipse.
		ui.workbench_3.2.0.I20060602-0010.jar"/>
		<jar href="plugins/org.eclipse.
		update.configurator_3.2.0.v20060511.jar"/>
		<jar href="plugins/org.eclipse.update.core_3.2.0.v20060602.jar"/>
		<jar href="plugins/org.eclipse.update.ui_3.2.0.v20060601.jar"/>
		<jar href="plugins/org.eclipse.
		update.scheduler_3.2.0.v20060511.jar"/>
	</resources>
</jnlp>

最后,将主配置文件也放在JNLP功能部件的rootfiles目录下,在打包时即可一块打到发布站点上。

打包后的文件结构:

要使用JWS运行此RCP应用,可以在资源管理器中将JNLP文件类型与应用程序Java Web Start Launch相关联,双击即可运行。或者创建一个WEB页面文件,如:

<html>
   <a href="file:/d:/temp/examples/examples.jnlp">Start RCP
   Examples</a>
</html>

在WEB浏览器中打开此页面,点击超链接即可运行此RCP应用(取决于浏览器的类型,可能要事先配置其MIME类型,将jnlp扩展名与application/x-java-jnlp-file MIME类型相关联)。

发布基于 Plug-in 的 RCP 应用

即使 RCP 应用不是基于功能部件的,也可以使用 WebStart 技术来进行发布。同基于功能部件的 RCP 应用类似,也是先创建一个外围功能部件以方便打包,只不过此功能部件要包含所有要使用的插件。

启动Eclipse,打开菜单File->New->Project, 选中 Feature Project 并且键入工程名称,比如 com.ibm.csdl.guardian.examples.jnlp,点击Next。在这一页,选中所有此RCP应用所要使用的插件(具体参考另一篇文章),如下图,点击Finish。

另外,需要修改主JNLP文件,不使用扩展配置文件,而直接下载所有要使用的插件:

<?xml version="1.0" encoding="UTF-8"?>
<jnlp
    spec="1.0+"
    codebase="file:/d:/temp/examples"
    href="examples.jnlp">
  <information>
    <title>Examples RCP Application</title>
    <vendor>Jerome</vendor>
    <homepage href="http://www.eclipse.org"/>
    <description>Examples RCP Application</description>
    <icon kind="splash" href="splash.gif"/>
    <offline-allowed/>
  </information>
  <security>
     <all-permissions/>
  </security>
  <application-desc main-class="org.eclipse.core.launcher.WebStartMain">
     <argument>-nosplash</argument>
  </application-desc>
  <resources>
   <j2se version="1.4+" />
   <jar href="startup.jar"/>
   <!--  这里不使用扩展配置文件,直接下载所使用的插件 -->
   <jar href="plugins/com.ibm.csdl.guardian.examples_1.0.0.jar"/>
<jar href="plugins/com.ibm.icu_3.4.4.1.jar"/>
<jar href="plugins/org.eclipse.core.commands_3.2.0.I20060511-0800a.jar"/>
<jar href="plugins/org.eclipse.core.contenttype_3.2.0.v20060601a.jar"/>
<jar href="plugins/org.eclipse.core.expressions_3.2.0.v20060602-0010.jar"/>
<jar href="plugins/org.eclipse.core.jobs_3.2.0.v20060601a.jar"/>
<jar href="plugins/org.eclipse.core.runtime_3.2.0.v20060601b.jar"/>
<jar href="plugins/org.eclipse.equinox.common_3.2.0.v20060601a.jar"/>
<jar href="plugins/org.eclipse.equinox.preferences_3.2.0.v20060601.jar"/>
<jar href="plugins/org.eclipse.equinox.registry_3.2.0.v20060601.jar"/>
<jar href="plugins/org.eclipse.help_3.2.0.v20060518.jar"/>
<jar href="plugins/org.eclipse.jface_3.2.0.I20060602-0010.jar"/>
<jar href="plugins/org.eclipse.osgi_3.2.0.v20060601.jar"/>
<jar href="plugins/org.eclipse.swt_3.2.0.v3232l.jar"/>
<jar href="plugins/org.eclipse.swt.win32.win32.x86_3.2.0.v3232l.jar"/>
<jar href="plugins/org.eclipse.ui_3.2.0.I20060602-0010.jar"/>
<jar href="plugins/org.eclipse.ui.forms_3.2.0.v20060530.jar"/>
<jar href="plugins/org.eclipse.ui.workbench_3.2.0.I20060602-0010.jar"/>
<jar href="plugins/org.eclipse.update.configurator_3.2.0.v20060511.jar"/>
<jar href="plugins/org.eclipse.update.core_3.2.0.v20060602.jar"/>
<jar href="plugins/org.eclipse.update.ui_3.2.0.v20060601.jar"/>
<jar href="plugins/org.eclipse.update.scheduler_3.2.0.v20060511.jar"/>
  <property
      name="osgi.instance.area"
      value="@user.home/Application Data/examples"/>
  <property
      name="osgi.configuration.area"
      value="@user.home/Application Data/examples"/>
  <!--  这里不使用product扩展来启动,而使用application扩展来启动 -->
  <property
      name="eclipse.application"
      value="com.ibm.csdl.guardian.examples.application"/>
  </resources>
</jnlp>

最后,导出及数字签名过程与基于功能部件的RCP应用基本相同。

结论

使用JWS来发布RCP应用程序除了可以简化用户端的安装配置,还可以自动具备版本更新功能,只需在JNLP配置文件中所指定的CodeBase处放置新版本的Jar包,JWS即会自动进行下载并替换。但缺点是如果新版本出现问题不能Rollback到上一个版本,所以在发布新版本时事先要进行充分的测试,使缺陷降到最低程度。即便如此,使用JWS来发布小型的RCP应用程序不失为一个完备的解决方案。


相关主题

  • Java Web Start White Paper:http://java.sun.com
  • Eclipse Online Help:Eclipse.org
  • Eclipse Rich Client Platform-Designing, Coding, and Packaging Java Applications:Jeff McAffer, Jean-Michel Lemieux

评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Open source
ArticleID=170928
ArticleTitle=使用 WebStart 发布 RCP 应用程序
publish-date=10262006