环境准备:
1. 安装JDK及JWS。在安装JDK时会自动安装Java Web Start,当然,也可以单独对JWS进行安装。一般不需要另行安装。
2. 对于RCP Examples应用的工程文件,也可以使用其它的RCP应用,只需改变JNLP的相应配置项即可。
3. Eclipse开发环境,Eclipse3.2。
(1)基于plugins的配置方式
以我们当前的项目配置为例(下面是当前的工程):
创建JNLP功能部件
首先,为了方便的导出基于WebStart的RCP应用,我们需要创建一个包含RCP应用中所有插件的外围功能部件(即对应的feature工程),用来对RCP应用进行打包。这个功能部件也会包含RCP的启动类org.eclipse.core.launcher.WebStartMain所在的startup.jar文件,以便在打包时一起发布。
启动Eclipse,打开菜单File->New->Project, 选中 Feature Project 并且键入工程名称,比如 cn.bestwiz.jhf.dealer.demo.jnlp。直接点击Finish使用默认设置结束工程的创建。
在插件清单编辑器中,切换到Plug-ins页,添加所包含的功能部件cn.bestwiz.jhf.dealer.demo。
在功能部件清单编辑器中,切换到Included Features页,添加rcp程序所需要的功能部件org.eclipse.rcp。(网上资料一般都没有写,但这却是最关键的)
在打包时,要保持原来RCP应用的目录结构,即根目录下有plugins和features(可无)子目录,并且使用一个可执行文件(比如eclipse.exe)去调用startup.jar。对于使用WebStart来启
动的RCP应用来说,由WebStart代替了原来的可执行文件,并使用JNLP配置文件代替原来的eclipse.ini及config.ini。为了将startup.jar打包到根目录,我们在此功能部件目录下创建一个子目录。
选中功能部件cn.bestwiz.jhf.dealer.demo.jnlp,点击右键弹出菜单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 examples(密钥名,任意取名) -keypass 12345678(密钥密码,任意取名) -storepass (密钥密码对,与上一密码密码一致) -keystore .mykeystore(生成密钥文件名,任意取名)
接下来,将所生成的.mykeystore文件拷贝到一个目录,在打包过程中会使用此文件对所有的插件Jar包进行数字签名。
为项目cn.bestwiz.jhf.dealer.demo创建product
将生成的product文件更改为:the project configration is based on : features
将生成的product文件的configration清单编辑器中加入cn.bestwiz.jhf.dealer.demo.jnlp
打包并进行数字签名
首先,准备一个目录,比如D:/temp/examples,作为打包目录,同时也是放置主JNLP文件的目录。
在Eclipse中,打开菜单File->Export,选中Plug-in Development下的Deployable features,点击Next。在可用功能部件列表中,将cn.bestwiz.jhf.dealer.demo.jnlp选中。
在Destination页,输入或浏览选定所准备的打包目录
在Options页,选中"Package as individual JAR archives…":
在JAR Signing页,输入或浏览选定放置KeyStore的目录,所使用的别名及密钥库的库密码(在创建.mykeystore时指定):
这里需要确认Eclipse开发环境是基于JDK的,而不是基于JRE,因为打包工具会调用JDK Bin目录下的Jarsigner程序对所有RCP应用所包含的Plugin Jar文件进行数字签名。
在Java Web Start页,选中"Create JNLP manifests for the JAR archives"并指定所创建的JNLP文件所使用的CodeBase(这里我们使用本地文件系统以方便测试,正式发布时一般是
用一个WEB站点的URL:如tomcat服务器下面的某路径)及JRE版本:
最后一步,使用相同的密钥库及库密码,还需要对startup.jar文件进行数字签名:
jarsigner -keystore .mykeystore(密钥文件) startup.jar examples(密钥名)
创建主JNLP文件
主JNLP文件是启动应用程序的入口,在此文件中会指定所要运行的主类及需要下载的Jar包文件。
创建一个JNLP配置文件RcpDemo.jnlp:
<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+" codebase="file://d:/temp/examples" href="RcpDemo.jnlp"> <!--指定发布站点的URL,这里我们使用本地文件系统-->
<information> <!-- 下面是有关此应用程序的一些基本信息 -->
<title>rcp demo</title>
<vendor>wangshaochuan</vendor>
<homepage href="http://www.eclipse.org"/>
<description kind="short">RCP Demo Application</description>
<icon kind="splash" href="splash.gif"/> <!--Web Start应用程序的启动图标-->
<offline-allowed/>
</information>
<security>
<all-permissions/>
</security>
<application-desc main-class="org.eclipse.core.launcher.WebStartMain"> <!-- 设置此应用程序的启动类,RCP应用总是由此类来引导启动 -->
<argument>-nosplash</argument> <!-- 这里可以设置应用程序启动时所要传递的参数,与eclipse.exe所使用的参数类似 -->
</application-desc>
<resources>
<j2se version="1.5+" />
<jar href="startup.jar"/> <!-- 指定启动类所在的Jar包,发布RCP应用时总是要下载此Jar包 -->
<extension name="Rcp Demo Feature" href="features/cn.bestwiz.jhf.dealer.demo.jnlp_1.0.0.jnlp"/> <!-- 这里设置扩展配置文件的地址,对于JWS管理器来说,一个扩展配置文件即对应一个库,主应用程序可以使用多个库来完成<property name="osgi.configuration.area" value="@user.home/RcpDemo/configuration"/> <!-- 这里设置RCP应用程序的工作空间目录,与普通RCP应用中config.ini的配置项类似 -->
<property name="osgi.instance.area" value="@user.home/RcpDemo/workspace"/>
<property name="eclipse.product" value="cn.bestwiz.jhf.dealer.demo.product"/> <!-- 设置RCP应用启动时所要运行的产品Id,与config.ini中的配置相同 -->
</resources>
</jnlp>
最后,将主配置文件也放在JNLP功能部件的rootfiles目录下,在打包时即可一块打到发布站点上。
打包后的文件结构:
要使用JWS运行此RCP应用,可以在资源管理器中将JNLP文件类型与应用程序Java Web Start Launch相关联,双击即可运行。或者创建一个WEB页面文件,如:
<html>
<a href="file:/d:/temp/examples/RcpDemo.jnlp">RCP Demo</a>
</html>
注:如果要是更新其中的jar包,只要替换掉以前的原始jar包就可以,Web Start会自动跟据更新时间来下载更新的所更新的程序
如上的操作可能会出现加载错误的问题,主要原因是导出时:
site URL: file:/d:/temp/examples d的盘符冒号会丢失,个人解决采用jsp来动态拼装JLNP这个文件,该文件本质就是一个xml文件。选择这样的解决方法,步骤如下:
1. 将site URL修改成:
2. jsp代码如下tutorial.jsp:
<%@ page contentType="application/x-java-jnlp-file" %> <% StringBuffer codeBase = new StringBuffer(); codeBase.append(request.getScheme()).append("://").append(request.getServerName()); if (request.getServerPort() != (request.isSecure() ? 443 : 80)) codeBase.append(':').append(request.getServerPort()); codeBase.append(request.getContextPath()).append('/'); %> <?xml version="1.0" encoding="UTF-8"?> <jnlp spec="1.0+" codebase="<%= codeBase %>" href="<%= request.getRequestURL() %>"> <information> <title>RCP Demo</title> <vendor>Lianjianhua</vendor> <description>RCP</description> <icon href="icon.jpeg"/> </information> <security> <all-permissions/> </security> <resources> <j2se version="1.5+"/> <%-- Launcher --%> <jar href="startup.jar"/> <extension name="Rcp Demo Feature" href="features/com.glnpu.demo.jnlp_1.0.0.jnlp"/> <property name="osgi.configuration.area" value="@user.home/RcpDemo/configuration"/> <property name="osgi.instance.area" value="@user.home/RcpDemo/workspace"/> <property name="eclipse.product" value="com.glnpu.demo.product"/> </resources> <application-desc main-class="org.eclipse.core.launcher.WebStartMain"> <argument>-nosplash</argument> </application-desc> </jnlp> |
3. 页面调用代买index.html,如下:
<html> <head> <title>WebRCP Demo</title> </head> <body> <h1><a href="tutorial.jsp">Launch RCP com.glnpu.demo</a></h1> </body> </html> |
针对JNLP配置文件的详解:
临时翻译,错误难免,仅供参考:
<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,应是gif或jpeg格式。需自行修改。
Offline-allowed:选择项,允许用户离线运行应用程序,一般都会有,不用修改。
<security>元素
选择项,如果没有指明<security>,默认是不允许应用程序访问用户的本地资源,即应用程序是沙箱运行。
如果设定为<all-permissions/>,则表示允许应用程序访问用户的本地资源。一般都会设定此值。
<resource>元素
<j2se version = 指定jdk版本>
<jar href = 指定需发布的应用程序的jar包存放的位置>
<application-desc>元素
main-class:应用程序运行启动的主类
<argument>:应用程序运行时的参数,可以有多个,每一个参数用一对<argument>参数</argument>。
上面已经就本例子中的jnlp文件做了简单的说明。这里进行各个元素的详细说明。
JNLP文件有5个主要的元素:
|
引用外部资源:
在JNLP文件中所有引用的外部资源都通过href属性来引用,例如:
|
作为一个链接的资源,其地址可以是相对的路径,也可以是绝对路径,读过上面的发布部分,已经可以认识到这一点了,EG:
|
在引用相应jar包时,链接也可以与jar的版本成对出现。EG:
<jar href="classes/MyApp.jar" version = "1.4.0_04 1.4*&1.4.1_02+" /> |