java提供的一种让你可以通过浏览器直接执行java应用程序的途径,它使你可以直接通过一个网页上的url连接打开一个 java应 用程序.好处就不用说了,如果你的java应用程序以jnlp 的方式发布,如果版本升级后,不需要再向所有用户发布版本,只需要更新服务器的版本,这就相当于让java应用程序有了web应用的优点了.
jnlp文件的具体说明:
应用JNLP部署应用
(1)编写相关应用,打包成一系列jar;
(2)根据jnlp文件说明修改相应的jnlp内容,修改相应的url和jar;
(3)部署jnlp文件和jar到相应的web容器;
(4)编写访问网页,即可使用该应用〔亦可下载jnlp文件使用jws运行应用〕;
补充:如果jar需要访问本地文件资源,需要为你的jar文件签名
之前做过的一个系统部署如下:
1使用ant文件进行打包生成相应的jar文件,及进行文件签名等,生成工程所需的所有架包文件到指定到某个工程目录下,然后指定签证的路径(一般是指定到登陆客户端的project下)
2打好包之后,所有的架包都需要在login的页面加入以下代码;
<jnlp codebase="<%=realPath%>">
<information>
<title>Transfers-inforesRES-参数开通平台</title>
<vendor>
...
</vendor>
</information>
<resources>
//所有的架包,都绑定了版本号,每次发布都需要给本地工程的jar +1,例如 :paraClient.jar
<j2se version="1.5+" java-vm-args="-Xms64m -Xmx512m" />
<jar href="parasigned/paraClient.jar" version="1.1"/>
<jar href="parasigned/rc_res.jar" version="1.1"/>
<jar href="parasigned/ant.jar" version="1.0"/>
<jar href="parasigned/antlr-2.7.6.jar" version="1.0"/>
<jar href="parasigned/asm-2.2.3.jar" version="1.0"/>
<jar href="parasigned/aspectjrt.jar" version="1.0"/>
<jar href="parasigned/aspectjweaver.jar" version="1.0"/>
<jar href="parasigned/cglib-nodep-2.1_3.jar" version="1.0"/>
<jar href="parasigned/com.springsource.com.caucho-3.1.6.jar" version="1.0"/>
<jar href="parasigned/commons-beanutils.jar" version="1.0"/>
<jar href="parasigned/commons-io-1.3.2.jar" version="1.0"/>
<jar href="parasigned/commons-lang.jar" version="1.0"/>
<jar href="parasigned/commons-logging-1.1.1.jar" version="1.0"/>
<jar href="parasigned/dozer-5.0.jar" version="1.0"/>
<jar href="parasigned/flexjson.jar" version="1.0"/>
<jar href="parasigned/forms-1.2.1.jar" version="1.0"/>
<jar href="parasigned/jakarta-oro-2.0.8.jar" version="1.0"/>
<jar href="parasigned/jakarta-regexp-1.5.jar" version="1.0"/>
<jar href="parasigned/jcalendar.jar" version="1.0"/>
<jar href="parasigned/jdom.jar" version="1.0"/>
<jar href="parasigned/jide-oss-2.5.3.jar" version="1.0"/>
<jar href="parasigned/JImage.jar" version="1.0"/>
<jar href="parasigned/jwf-1.0.1.jar" version="1.0"/>
<jar href="parasigned/jxl.jar" version="1.0"/>
<jar href="parasigned/jxls-core-0.9.8.jar" version="1.0"/>
<jar href="parasigned/jxls-reader-0.9.8.jar" version="1.0"/>
<jar href="parasigned/log4j-1.2.15.jar" version="1.0"/>
<jar href="parasigned/looks.jar" version="1.0"/>
<jar href="parasigned/neethi-2.0.4.jar" version="1.0"/>
<jar href="parasigned/OpenSwing.jar" version="1.1"/>
<jar href="parasigned/OpenSwingBeanInfo.jar" version="1.0"/>
<jar href="parasigned/poi-3.2-FINAL-20081019.jar" version="1.0"/>
<jar href="parasigned/poi-contrib-3.2-FINAL-20081019.jar" version="1.0"/>
<jar href="parasigned/poi-scratchpad-3.2-FINAL-20081019.jar" version="1.0"/>
<jar href="parasigned/simple-json.jar" version="1.0"/>
<jar href="parasigned/slf4j-api-1.5.0.jar" version="1.0"/>
<jar href="parasigned/slf4j-log4j12-1.5.0.jar" version="1.0"/>
<jar href="parasigned/spring.jar" version="1.0"/>
<jar href="parasigned/swing-layout.jar" version="1.0"/>
<jar href="parasigned/twaver.jar" version="1.0"/>
<jar href="parasigned/substance.jar" version="1.0"/>
<jar href="parasigned/DJNativeSwing.jar" version="1.0"/>
<jar href="parasigned/DJNativeSwing-SWT.jar" version="1.0"/>
<jar href="parasigned/jna_WindowUtils.jar" version="1.0"/>
<jar href="parasigned/jna-3.2.4.jar" version="1.0"/>
<jar href="parasigned/MozillaInterfaces-1.8.1.3.jar" version="1.0"/>
<jar href="parasigned/swt-3.6M6-win32-win32-x86.jar" version="1.0"/>
<jar href="parasigned/dom4j-1.6.1.jar" version="1.0"/>
<jar href="parasigned/commons-collections-3.1.jar" version="1.0"/>
</resources>
<security>
<all-permissions />
</security>
//登陆时候需要认证的参数;
<application-desc main-class="Launch">
<argument><%=URL%></argument>
<argument><%=port%></argument>
<argument><%=staffcode%></argument>
<argument><%=passwdMd5%></argument>
<argument>product</argument>
<argument><%=SysCode%></argument>
<argument><%=timestamp%></argument>
</application-desc>
</jnlp>
ant 文件:
<?xml version="1.0"?>
<project name="backend" default="upload">
<description>
This is the build.xml for ant in the ddz project
</description>
<property environment="env" />
<property name="base.dir" value="." />
<property name="shared.dir" value="../rcSharedProject" />
<property name="project.name" value="backend" />
<property name="application.name" value="lobby" />
<target name="detect.file" >
<echo>正在检查是否存在${base.dir}/build-${user.name}.properties文件....</echo>
<condition property="fileIsExists" >
<and>
<available file="${base.dir}/build-${user.name}.properties"/>
</and>
</condition>
</target>
<target name="loadUserProperty" if="fileIsExists" depends="detect.file">
<echo>存在${base.dir}/build-${user.name}.properties文件....</echo>
<property file="${base.dir}/build-${user.name}.properties"/>
</target>
<target name="loadDefaultProperty" unless="fileIsExists" depends="loadUserProperty">
<echo>不存在${base.dir}/build-${user.name}.properties文件!使用默认TOMCAT配置..</echo>
<property file="build.properties"/>
</target>
<target name="init" depends="loadDefaultProperty">
<echo>tomcat.root=${tomcat.root}/</echo>
<property name="app.root" value="${tomcat.root}/webapps/${application.name}" />
<property name="cache.root" value="${tomcat.root}/work/Catalina/localhost/${application.name}" />
<property name="base.dir" value="." />
<property name="shared.dir" value="../transSharedProject" />
<property name="global.dir" value="${shared.dir}/global" />
<property name="domains.dir" value="${shared.dir}/domains" />
<property name="servicesInterface.dir" value="${shared.dir}/services" />
<property name="uis.dir" value="${base.dir}/UIS" />
<property name="config.dir" value="${base.dir}/config" />
<property name="classes.dir" value="${base.dir}/publish/classes" />
<property name="WebRoot.dir" value="${base.dir}/WebRoot" />
<property name="lib.dir" value="${base.dir}/lib" />
<property name="dist.dir" value="${base.dir}/publish/dist" />
<property name="jarfile" value="${project.name}.jar" />
<property name="publish.dir" value="${base.dir}/publish" />
<path id="classpath">
<fileset dir="${lib.dir}">
<include name="*.jar" />
</fileset>
<path location="${classes.dir}" />
</path>
<mkdir dir="${classes.dir}" />
<mkdir dir="${dist.dir}" />
</target>
<!-- 数字签名用的密钥信息参数 -->
<property name="keystoreName" value="gpdi.inforessystem"/>
<property name="storepass" value="gpdi.inforessystem"/>
<property name="keystore" location="${base.dir}/publish/${keystoreName}"/>
<property name="keypass" value="gpdi.inforessystem"/>
<property name="keysize" value="1024"/>
<property name="alias" value="gpdi.inforessystem"/>
<property name="validity" value="3650"/>
<target name="compile" depends="init">
<copy todir="${dist.dir}">
<fileset dir="${uis.dir}">
<include name="**" />
</fileset>
<fileset dir="${global.dir}">
<include name="**" />
</fileset>
<fileset dir="${domains.dir}">
<include name="**" />
</fileset>
<fileset dir="${servicesInterface.dir}">
<include name="**" />
</fileset>
</copy>
<javac srcdir="${dist.dir}" encoding="utf-8" destdir="${classes.dir}" includes="**" debug="on">
<classpath refid="classpath" />
</javac>
<copy todir="${classes.dir}">
<fileset dir="${uis.dir}">
<include name="**" />
</fileset>
<fileset dir="${config.dir}">
<include name="**" />
</fileset>
<fileset dir="${domains.dir}">
<include name="**" />
</fileset>
</copy>
</target>
<target name="jar" depends="compile">
<mkdir dir="${publish.dir}" />
<mkdir dir="${publish.dir}/lib" />
<mkdir dir="${publish.dir}/signed" />
<jar destfile="${publish.dir}/lib/${jarfile}">
<fileset dir="${classes.dir}">
<include name="**" />
</fileset>
</jar>
<copy todir="${publish.dir}/lib">
<fileset dir="${lib.dir}">
<include name="*.jar" />
</fileset>
</copy>
<copy todir="${publish.dir}">
<fileset dir="${base.dir}">
<include name="*.bat" />
</fileset>
</copy>
</target>
<!-- 创建证书 -->
<target name="genericKey">
<echo message="genkey..."/>
<delete>
<fileset dir="${base.dir}/publish">
<include name="${keystoreName}"/>
</fileset>
</delete>
<genkey keystore="${keystore}" storepass="${storepass}" alias="${alias}" keypass="${keypass}" keysize="${keysize}"
verbose="true" validity="${validity}" dname="CN=GPDI, OU=Infores, O=gpdi.com, C=ZH">
</genkey>
<echo message="genkey... done"/>
</target>
<!-- 对JAR进行数字签名 -->
<target name="signJar" depends="jar, genericKey">
<echo message="jarsigner..." />
<delete>
<fileset dir="${base.dir}/publish/signed">
<include name="**.jar"/>
</fileset>
</delete>
<signjar destDir="${base.dir}/publish/signed"
alias="${alias}" keystore="${keystore}"
storepass="${storepass}">
<path>
<fileset dir="${base.dir}/publish/lib" includes="**.jar" />
</path>
<flattenmapper />
</signjar>
<echo message="jarsigner... done." />
</target>
<target name="clean-cache" depends="signJar">
<mkdir dir="${cache.root}" />
<delete>
<fileset dir="${cache.root}">
<include name="**"/>
</fileset>
</delete>
</target>
<target name="deploy" depends="clean-cache">
<mkdir dir="${app.root}" />
<mkdir dir="${app.root}/signed" />
<mkdir dir="${app.root}/WEB-INF" />
<mkdir dir="${app.root}/WEB-INF/lib" />
<mkdir dir="${app.root}/WEB-INF/classes" />
<!--<copy todir="${app.root}/">
<fileset dir="${WebRoot.dir}">
<include name="**" />
</fileset>
</copy>-->
<copy todir="${app.root}/signed">
<fileset dir="${base.dir}/publish/signed">
<include name="**.jar" />
</fileset>
</copy>
</target>
<target name="upload" depends="clean-cache">
<mkdir dir="${app.root}" />
<mkdir dir="${app.root}/signed" />
<mkdir dir="${app.root}/WEB-INF" />
<mkdir dir="${app.root}/WEB-INF/lib" />
<mkdir dir="${app.root}/WEB-INF/classes" />
<!--<copy todir="${app.root}/">
<fileset dir="${WebRoot.dir}">
<include name="**" />
</fileset>
</copy>-->
<copy todir="${app.root}/signed">
<fileset dir="${base.dir}/publish/signed">
<include name="**.jar" />
</fileset>
</copy>
<copy todir="${app.root}">
<fileset dir="${base.dir}/publish">
<include name="start.bat" />
</fileset>
</copy>
</target>
<!-- 远程部署TOMCAT属性
<property name="server.address" value="211.155.23.240" />
<property name="server.sshport" value="22" />
<property name="server.tomcat.port" value="8080" />
<property name="server.tomcat.service" value="Tomcat6" />
<property name="server.tomcat.path" value="D:\env\apache-tomcat-6.0.14\webapps" />
<property name="server.username" value="gpdi.infores" />
<property name="server.password" value="1qaz2wsx" />
-->
<target name="detect">
<condition property="tomcat.running" >
<and>
<socket server="${server.address}" port="${server.tomcat.port}" />
</and>
</condition>
</target>
<target name="tomcat.stop" if="tomcat.running" description="停止TOMCAT" depends="init">
<echo> rexec 到${server.address}</echo>
<echo message="正在停止TOMCAT..." />
<sshexec
host="${server.address}"
username="${server.username}"
password="${server.password}"
port="${server.sshport}"
trust="true"
command="net stop ${server.tomcat.service}"/>
<waitfor>
<not>
<socket server="${server.address}" port="${server.tomcat.port}" />
</not>
</waitfor>
</target>
<target name="tomcat.start"
description="modify application database and sysid"
depends="init">
<echo> rexec 到${server.address}</echo>
<echo message="正在启动TOMCAT..." />
<sshexec
host="${server.address}"
username="${server.username}"
password="${server.password}"
port="${server.sshport}"
trust="true"
command="net start ${server.tomcat.service}"/>
<waitfor>
<and>
<socket server="${server.address}" port="${server.tomcat.port}" />
</and>
</waitfor>
</target>
<!--增量上传: 把所有自己写的代码打包JAR包 -->
<target name="uploadJarToServer" depends="init">
<scp todir="${server.username}:${server.password}@${server.address}:${server.tomcat.path}\${application.name}"
trust="true"
verbose="true"
port="${server.sshport}"
>
<fileset dir="${base.dir}/publish/">
<include name="signed" />
<include name="signed/**" />
</fileset>
</scp>
</target>
<!-- 增量上传 -->
<target name="增量上传" depends="init,detect, tomcat.stop,uploadJarToServer,tomcat.start"></target>
</project>
登陆时候的lauch:
import java.util.Map;
import javax.swing.JFrame;
import javax.swing.WindowConstants;
import cn.dcalf.swing.WindowUtils;
import cn.dcalf.util.ClientLaunchArgs;
import com.gpdi.infores.client.util.MsgDlgFuns;
import com.gpdi.infores.global.client.GlobalVars;
import com.gpdi.infores.global.client.MyUIManager;
import com.gpdi.infores.rc.start.client.LoginFrame;
import com.gpdi.infores.rc.start.client.MainFrame;
import com.gpdi.infores.rc.task.OnlineUserSynTask;
public class Launch {
/**
* 启动程序
*
* @param args
*/
public static void main(String[] args) {
Map<String,String> argMap = ClientLaunchArgs.getArgMap(args);
if (argMap==null || argMap.get(ClientLaunchArgs.IP)==null){
MsgDlgFuns.showMsg("非法的传入参数。");
return;
}
try {
GlobalVars.setAddress(argMap.get(ClientLaunchArgs.IP));
GlobalVars.setPort(argMap.get(ClientLaunchArgs.PORT));
GlobalVars.setVersion(argMap.get(ClientLaunchArgs.VERSION));
GlobalVars.setProjectId(argMap.get(ClientLaunchArgs.PROJECT_ID));
GlobalVars.getInstance();
MyUIManager.init();
OnlineUserSynTask.setStartWork(false);
String staffcode = argMap.get(ClientLaunchArgs.USER);
String password = argMap.get(ClientLaunchArgs.PASSWORD);
String timestatmp=argMap.get(ClientLaunchArgs.TIMESTAMP);
if (timestatmp==null)
timestatmp="0";
String sysCode = argMap.get(ClientLaunchArgs.SYSTEM_CODE);
if(staffcode!=null && !staffcode.isEmpty()){
boolean result = false;
if(sysCode!=null && !sysCode.isEmpty()){
result = GlobalVars.getInstance().auhenticate(staffcode, password, sysCode , timestatmp);
}else{
result = GlobalVars.getInstance().auhenticate(staffcode, password,null,timestatmp);
}
if(!result){
GlobalVars.getInstance().showErrorDialog("登录验证失败,用户名/密码错误,或者登录超时(30分钟).");
System.exit(0);
return;
}
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
//JFrame main = new MainFrame();
JFrame main = MainFrame.getInstance();
String title = GlobalVars.getInstance().buildTitle();
main.setTitle(title);
main.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
main.setExtendedState(JFrame.MAXIMIZED_BOTH);
WindowUtils.center(main);
main.setVisible(true);
}
});
}else{
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
JFrame frame = new JFrame();
String title = GlobalVars.getInstance().getConfigValueByName("system.title");
frame.setTitle(title);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
LoginFrame panel = new LoginFrame(frame);
panel.setVisible(true);
try{
panel.requestFocus();
}catch(Exception e){
}
}
});
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
生成的数字签证:version.xml
<jnlp-versions>
<resource>
<pattern>
<name>rcClient.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>rcClient.jar</file>
</resource>
<resource>
<pattern>
<name>rc_res.jar</name>
<version-id>1.1</version-id>
</pattern>
<file>rc_res.jar</file>
</resource>
<resource>
<pattern>
<name>ant.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>ant.jar</file>
</resource>
<resource>
<pattern>
<name>antlr-2.7.6.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>antlr-2.7.6.jar</file>
</resource>
<resource>
<pattern>
<name>asm-2.2.3.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>asm-2.2.3.jar</file>
</resource>
<resource>
<pattern>
<name>aspectjrt.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>aspectjrt.jar</file>
</resource>
<resource>
<pattern>
<name>aspectjweaver.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>aspectjweaver.jar</file>
</resource>
<resource>
<pattern>
<name>cglib-nodep-2.1_3.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>cglib-nodep-2.1_3.jar</file>
</resource>
<resource>
<pattern>
<name>com.springsource.com.caucho-3.1.6.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>com.springsource.com.caucho-3.1.6.jar</file>
</resource>
<resource>
<pattern>
<name>commons-beanutils.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>commons-beanutils.jar</file>
</resource>
<resource>
<pattern>
<name>commons-io-1.3.2.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>commons-io-1.3.2.jar</file>
</resource>
<resource>
<pattern>
<name>commons-lang.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>commons-lang.jar</file>
</resource>
<resource>
<pattern>
<name>commons-logging-1.1.1.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>commons-logging-1.1.1.jar</file>
</resource>
<resource>
<pattern>
<name>dozer-5.0.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>dozer-5.0.jar</file>
</resource>
<resource>
<pattern>
<name>flexjson.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>flexjson.jar</file>
</resource>
<resource>
<pattern>
<name>forms-1.2.1.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>forms-1.2.1.jar</file>
</resource>
<resource>
<pattern>
<name>jakarta-oro-2.0.8.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>jakarta-oro-2.0.8.jar</file>
</resource>
<resource>
<pattern>
<name>jakarta-regexp-1.5.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>jakarta-regexp-1.5.jar</file>
</resource>
<resource>
<pattern>
<name>jcalendar.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>jcalendar.jar</file>
</resource>
<resource>
<pattern>
<name>jdom.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>jdom.jar</file>
</resource>
<resource>
<pattern>
<name>jide-oss-2.5.3.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>jide-oss-2.5.3.jar</file>
</resource>
<resource>
<pattern>
<name>JImage.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>JImage.jar</file>
</resource>
<resource>
<pattern>
<name>jwf-1.0.1.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>jwf-1.0.1.jar</file>
</resource>
<resource>
<pattern>
<name>jxl.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>jxl.jar</file>
</resource>
<resource>
<pattern>
<name>jxls-core-0.9.8.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>jxls-core-0.9.8.jar</file>
</resource>
<resource>
<pattern>
<name>jxls-reader-0.9.8.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>jxls-reader-0.9.8.jar</file>
</resource>
<resource>
<pattern>
<name>log4j-1.2.15.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>log4j-1.2.15.jar</file>
</resource>
<resource>
<pattern>
<name>looks.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>looks.jar</file>
</resource>
<resource>
<pattern>
<name>neethi-2.0.4.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>neethi-2.0.4.jar</file>
</resource>
<resource>
<pattern>
<name>OpenSwing.jar</name>
<version-id>1.1</version-id>
</pattern>
<file>OpenSwing.jar</file>
</resource>
<resource>
<pattern>
<name>OpenSwingBeanInfo.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>OpenSwingBeanInfo.jar</file>
</resource>
<resource>
<pattern>
<name>poi-3.2-FINAL-20081019.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>poi-3.2-FINAL-20081019.jar</file>
</resource>
<resource>
<pattern>
<name>poi-contrib-3.2-FINAL-20081019.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>poi-contrib-3.2-FINAL-20081019.jar</file>
</resource>
<resource>
<pattern>
<name>poi-scratchpad-3.2-FINAL-20081019.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>poi-scratchpad-3.2-FINAL-20081019.jar</file>
</resource>
<resource>
<pattern>
<name>simple-json.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>simple-json.jar</file>
</resource>
<resource>
<pattern>
<name>slf4j-api-1.5.0.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>slf4j-api-1.5.0.jar</file>
</resource>
<resource>
<pattern>
<name>slf4j-log4j12-1.5.0.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>slf4j-log4j12-1.5.0.jar</file>
</resource>
<resource>
<pattern>
<name>spring.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>spring.jar</file>
</resource>
<resource>
<pattern>
<name>swing-layout.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>swing-layout.jar</file>
</resource>
<resource>
<pattern>
<name>twaver.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>twaver.jar</file>
</resource>
<resource>
<pattern>
<name>substance.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>substance.jar</file>
</resource>
<resource>
<pattern>
<name>DJNativeSwing.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>DJNativeSwing.jar</file>
</resource>
<resource>
<pattern>
<name>DJNativeSwing-SWT.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>DJNativeSwing-SWT.jar</file>
</resource>
<resource>
<pattern>
<name>jna_WindowUtils.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>jna_WindowUtils.jar</file>
</resource>
<resource>
<pattern>
<name>jna-3.2.4.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>jna-3.2.4.jar</file>
</resource>
<resource>
<pattern>
<name>MozillaInterfaces-1.8.1.3.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>MozillaInterfaces-1.8.1.3.jar</file>
</resource>
<resource>
<pattern>
<name>swt-3.6M6-win32-win32-x86.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>swt-3.6M6-win32-win32-x86.jar</file>
</resource>
<resource>
<pattern>
<name>dom4j-1.6.1.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>dom4j-1.6.1.jar</file>
</resource>
<resource>
<pattern>
<name>pipeline.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>pipeline.jar</file>
</resource>
<resource>
<pattern>
<name>jRegistryKey.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>jRegistryKey.jar</file>
</resource>
<resource>
<pattern>
<name>jRegistryKey.dll.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>jRegistryKey.dll.jar</file>
</resource>
<resource>
<pattern>
<name>commons-collections-3.1.jar</name>
<version-id>1.0</version-id>
</pattern>
<file>commons-collections-3.1.jar</file>
</resource>
</jnlp-versions>
以上为一个C/S架构系统的每次发布的流程
1使用ant文件编译,生成jar
2 生成签证
3在登陆客户端保证好与签证中的jary版本一样
4 给打好的架放入到服务器启动成功即可,登陆客户端 在下载客户端程序认证成功。