软件结构如下:一个客户端软件。
1 包含 入口的jar文件
2. 一些必要的lib 包
3. 一些配置文件。需求:
1.能自动更新的最新版本。包括jar, 配置文件等.
2.能回退到以前的版本。
3.更精准的控制,具到某个用户用那个版本。
4.必须考虑更新的准确性(如网络问题,造成更新错误). 还是性能问题,等等。请大家提供下现有可供参考的开源框架。 或提供自己的思路均可。

解决方案 »

  1.   

    自动升级模块做以下的事情:
       1.下载最新包放入到update文件夹中
       2.下载完毕后通知主线程,主线程探知有更新,将提示用户自动更新完毕。请用户重启程序,然后自动把update目录中jar包和相关lib覆盖现有版本(只要切断自己应用中的相关业务,你的jar包和lib是可以被覆盖的,若不能覆盖,请写个批处理文件,进行更新)
      3.配置文件同上处理
    回滚版本模块做如下事情:
       1.通知服务器用户想回滚的具体版本,服务器上应该保存用户每次更新版本的细节信息
       2.服务器响应有此版本,则开始做和升级模块一样的事情。
    更新准确性问题:
      所有文件更新前,去更改自己包中某一个配置文件(它永远不更新,或者很少更新),里面有一个值表明是否正在更新,更新完毕后将此值更新会原值。每次启动时自动检查此值,若发现值不正常,则通知用户继续更新。
      

  2.   

    Java Web Start(以下简称JWS)是SUN提供的一种通过Web来部署和发布Java 程序的新技术,它既可以用来发布Application,也可以用来发布Applet,它获去年全球Java技术最佳创意奖。它仅在第一次运行时下载程序,以后的事情,就全全交给JWS,包括版本的自动更新和维护。这是我们曾经梦寐以求的事情,程序运行在客户端(本地运行,当然有足够的速度),但不用去安装配置客户端,也不用去考虑版本升级后对客户端的维护,这就是JWS提供给我们的好处之一。OK,下面我们就来看看如何玩转JWS,本文仅用发布 Application来做说明。
    http://www.ibm.com/developerworks/cn/java/l-webstart/index.html
      

  3.   

    谢谢楼上各位,提供了很好的思想、建议。Java Web Start确实是考虑过,但是它是否能支持这两点呢?
       2.能回退到以前的版本。
       3.更精准的控制,具到某个用户用那个版本。
      

  4.   

    现成的框架没听说过,即便有也不一定满足你自己项目的需求,说说大体思路:1. 首先确保现在的项目结构清晰,一般桌面应用把构成软件的文件及资源分成三大类,类库(各种jar包或class文件)、资源(图标图片html文档音频文件视频文件等等,也可以打包成相应的jar包)、配置(包括用户的配置文件程序本身的等等)。2. 更新程序自称体系,和你的应用完全分离开,便于移植到之后的项目里,和主程序间的通信可通过管道或本机开的端口或干脆通过启动更新程序时的命令行参数进行。3. JAR文件命名时带版本号便于今后管理,是否有更新或更新下载是否无误通过JAR的MD5或SHA1校验(比较保险),更新的JAR经校验无误后直接和老版本JAR放到相同目录下(JAR文件名称带版本号所有不会冲突),使用哪些JAR启动应用程序可以通过更新管理器在更新完成时生成的版本清单配置。清单中可以把JAR按不同的程序版本编组分类,在应用启动时可以读取此清单,默认使用最新的JAR组做classpath启动应用。如果想返回之前的版本也无需回滚安装,只需使用清单中之前版本的JAR组启动应用即可。不同用户可以单独保存自己的清单文件和使用哪个版本启动应用等配置信息到自己的用户目录下(可以通过环境变量获取)。4. 更新站点等信息和查找更新的策略等也可通过配置文件保存,可以参考一下 Eclipse 的更新程序,Eclipse 的程序更新系统是我见过的最好的了。
      

  5.   

    忘了最重要的一点,你的程序恐怕需要由更新系统提供的启动器来启动整个应用,不然就得自己实现或使用更新框架提供的API来自己读取版本清单生成classpath来启动应用了。还有个比较重要的功能得在完善你自己的更新框架时实现,系统完整性校验。用于启动时校验各个JAR包版本是否匹配是否遭篡改,资源文件是否完整等等。
      

  6.   

    我觉得可以参考maven的实现,可以借用现成的部分,自己在开发一部分
      

  7.   

    谢谢 huntor,我仔细看了下Java web start. 觉得还是有可行性的。2.能回退到以前的版本。
    3.更精准的控制,具到某个用户用那个版本
         
    原因如下:
        a.由于 resource中的jar是可以跟版本号的
        b.jnlp文件是可以动态生成的,比如我用个sevelet去生成,似乎可以。但既便如此,仍有问题:那些配置文件我没有办法给版本号啊.
      

  8.   

    sagezk,想得非常周全,如果一定要自己动手从头开始,你得意见一定要好好参考。
    其实我不一定要某个框架完全实现我的全部功能,部分实现也可,只要是开源的,我可以在它的基础上改,也可以省写功夫。
      

  9.   

    Eclipse的RCP框架有软件更新功能,本地或者web方式都可以,但是版本回退。这种似乎是高难度
      

  10.   

      1.下载最新包放入到update文件夹中
      2.下载完毕后通知主线程,主线程探知有更新,将提示用户自动更新完毕。请用户重启程序,然后自动把update目录中jar包和相关lib覆盖现有版本(只要切断自己应用中的相关业务,你的jar包和lib是可以被覆盖的,若不能覆盖,请写个批处理文件,进行更新)
      3.配置文件同上处理
    回滚版本模块做如下事情:
      1.通知服务器用户想回滚的具体版本,服务器上应该保存用户每次更新版本的细节信息
      2.服务器响应有此版本,则开始做和升级模块一样的事情。
    更新准确性问题:
      所有文件更新前,去更改自己包中某一个配置文件(它永远不更新,或者很少更新),里面有一个值表明是否正在更新,更新完毕后将此值更新会原值。每次启动时自动检查此值,若发现值不正常,则通知用户继续更新。
      

  11.   

    http://chenxiaobu.blog.163.com/blog/static/48251110200946112653482/
      

  12.   

    软件自己提供更新管理器,用来disable或者uninstall某个版本,达到切换版本的目的。
      

  13.   

    研究一下OSGi,就是Eclipse用的这一套。估计是最好的了。
      

  14.   

    要学习java,用来笔试和进阶有什么书啊?我有一点点java基础的
      

  15.   


    JWS,技术比较新的技术,期待学习下
      

  16.   

    webstart
    不过web start只支持更新到最新的,不支持回滚的。
      

  17.   

    可以直接在代码里实现在网络上的链接·链接的URL则是sun公司Java板块的更新信息··如果有更新信息就执行更新···初步思想···
      

  18.   

    做过一个。需要单独做一个线程,要独立于你要更新的jar,否则本地的jar不能被替换。服务端保留所有版本号对应的文件的备份(包括删除的)启动时检查本地版本号和服务器最新版本号
    如果不同,取最新版本中变化的部分。重启java(用程序调用 msdos或者shell)
      

  19.   

    在软件中添加独立的引导模块,如果需要升级,就对现有的jar包进行升级,如果不需要,就启动软件,并关闭自已
      

  20.   

    是否可以使用svn来做服务器的版本控制
      使用java方式来操作更新与还原版本,(svnkit可以在非商业软件中免费使用)
      

  21.   

    嗯,我也感觉maven已经实现了所有需求检测pom工程版本
    parent pom自我更新
    最后一个不太清楚