CN102141919A - 模块化java应用软件在线更新系统及方法 - Google Patents
模块化java应用软件在线更新系统及方法 Download PDFInfo
- Publication number
- CN102141919A CN102141919A CN2010101032266A CN201010103226A CN102141919A CN 102141919 A CN102141919 A CN 102141919A CN 2010101032266 A CN2010101032266 A CN 2010101032266A CN 201010103226 A CN201010103226 A CN 201010103226A CN 102141919 A CN102141919 A CN 102141919A
- Authority
- CN
- China
- Prior art keywords
- class
- module
- file
- dependence
- information
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Abstract
本发明公开了一种模块化JAVA应用软件在线更新系统,包括有软件资源信息挖掘子系统和软件动态更新子系统,其中,所述软件资源信息挖掘子系统包括有系统文件监视器、源代码加载分析器、系统类分析器、类依赖关系产生器、树或有向图依赖关系产生器和模块划分产生器;所述软件动态更新子系统包括有接口、总代理单元、模块代理单元及管理平台;总代理单元包括:工厂模块、时间戳模块和注册中心;模块代理单元包括:对象管理器、类加载器和模块描述器。本发明不必重新启动业务系统即可实现业务的加载。本发明同时公开了一种模块化JAVA应用软件在线更新方法。本发明在不重启系统的情况下实现了业务的加载。
Description
技术领域
本发明涉及一种模块化JAVA应用软件在线更新系统及方法。
背景技术
随着信息化社会的不断发展,一个软件系统随需求的变化不断地更新已变得非常普遍,由此,软件更新对于一个软件系统来说也变得至关重要,只有持续不断的进行软件的更新才能适应用户不断变化的用户需求。
为了适应软件的易更新性,优秀的设计模式不断被投入到软件设计中,对软件更新在设计时提供了巨大的支持,新的技术及体系架构也不断涌现以实现软件更新的易用性,例如面向方面编程及面向服务的体系结构,这些设计模式、技术以及体系结构都能实现代码的独立性和易扩展性,以达到软件易更新和易扩展的目的,但是这些技术只是解决了开发阶段的软件更新,却未能解决系统运行时进行软件动态更新的问题。
目前,对于一个已经上线的软件系统,如果对其进行更新必须停止服务器的运行,并对更新后的软件系统重新编译发布并进行部署,这必然会导致软件系统的服务在一定时间内处于停滞状态,从而会影响到用户的使用,对于拥有大量用户的业务系统来说,如空中交通管制系统、全球性的金融交易系统、工业控制系统、网络服务系统等,通过停止、更新和重启来实现维护和更新将导致不可接受的延迟、代价和危险,并造成大量的经济损失。
发明内容
有鉴于此,本发明的主要目的在于提供一种模块化JAVA应用软件在线更新系统及方法,能在不停止系统业务的情况下实现新增或更新业务的加载,业务加载后不必重启业务系统。
为达到上述目的,本发明的技术方案是这样实现的:
一种模块化JAVA应用软件在线更新系统,包括有软件资源信息挖掘子系统和软件动态更新子系统,其中,所述软件资源信息挖掘子系统包括有系统文件监视器、源代码加载分析器、系统类分析器、类依赖关系产生器、树或有向图依赖关系产生器和模块划分产生器;其中:
所述系统文件监视器用于配置客户软件系统的监控目录并提取出所述监控目录中的文件信息;
所述源代码加载分析器用于将所述客户软件系统中获取的源代码文件以文件为单位以字符流的方式加载到内存;
所述系统类分析器用于从所述客户软件系统中获取文件信息及源代码中提取出所述客户软件系统中所有的类及类本身的信息,并将所述类本身的信息依次注册到接口描述文件中;
所述类依赖关系产生器用于读取所述系统类分析器产生的类信息,并结合所述类本身的信息在所述源代码加载分析器中进行逆向分析,产生每个类对其它类的依赖关系,并将产生的关系依次注册到所述接口描述文件中;
所述树或有向图依赖关系产生器用于读取所述类依赖关系产生器中产生的类的依赖关系,并结合所述类本身的信息产生相应的依赖关系树结构或有向图,以供所述软件动态更新子系统进行分析读取,以在更新过程中确定类的加载顺序;
所述模块划分产生器用于对所述客户软件系统以依赖关系为单位进行模块划分,并产生模块结构,将所述模块结构提供给所述软件动态更新子系统,所述软件动态更新子系统在更新时按照所划分的模块分别按阶段独立更新;
所述软件动态更新子系统包括有接口、总代理单元、模块代理单元及管理平台;其中:
所述总代理单元用于在接收到用户输入的待加载的类的参数后生成所述类的实例对象或应用程序的调用结果;
所述模块代理单元用于利用用户输入的类的参数对管理模块内所有类的加载、对象的实例化和类的更新;
管理平台用于管理所述客户软件系统,并为所述软件动态更新子系统提供必要的工具支持,主要包括创建动态配置文件及其读取和写入、类依赖关系的解析、模块依赖关系的解析、文件及目录的复制工具;
所述接口包括内部接口和外部接口,所述内部接口为所述软件资源挖掘子系统与所述软件动态更新子系统之间的接口;所述外部接口用于向开发人员提供编程接口及类的参数输入接口。
其中,所述总代理单元包括:
工厂模块,用于负责创建和维护所述模块代理单元处理的实例,即维护模块名到实例的映射,并将所述总代理单元的请求进行参数处理,调用对应的模块代理单元进行处理;在当前请求为获取对象请求时,在将实例对象返回给所述总代理单元之前触发时间戳模块,通过对所述代理实例对象设定时间戳后再返回给所述总代理单元;
时间戳模块,用于在应用软件更新时,记录下所有更新类的更新时刻,接收到应用系统对所述应用软件的调用请求时,首先将参数中的时间与所设置的更新时间戳进行对比,若早于更新时间则返回调用旧类的结果,否则返回调用更新后的类的结果;在应用请求为获取对象请求时,在实例对象返回给应用请求之前设定其生成时间,即将实例对象的属性字段设定为当前的时间;
注册中心,用于记录当前所有的模块及每个模块涉及的具体的类、确定所述类是否注册及其所属的模块。
其中,所述模块代理单元包括:
对象管理器,用于根据索取的对象实例的具体请求来返回不同的实例对象;即通过调用类加载器索取类的类型对象,并通过反射方式返回实例化对象;
类加载器,用于根据请求将指定的类文件加载至内存,同时返回对应类的类型对象的引用;通过调用模块描述器读取当前请求类的更新时间,之后与参数中的时间进行对比,若所述参数的时间早于时间戳的时间则返回旧的类的类型实例对象,否则返回新的类的类型实例对象;
模块描述器,用于描述模块内所有类文件的信息,包括类名、类名所对应的路径、有无更新、对应更新后类的信息、更新的时间点。
其中,所述类依赖关系产生器先使用正则表达式将源文件中的所有非编译部分的注释全部去除,然后通过总结一个类在JAVA源代码中被调用的方式,使用正则表达式与类名进行组合,然后再在全文件中进行搜索匹配,保证依赖关系生成的正确性。
其中,所述模块划分产生器在模块划分的过程中对每个模块设立标志位,对于纵向划分过程中使用切割生成的模块,对于其他模块有依赖关系进行标志,并对模块下的起始类设置上层关联类存储字段以存储在切割之前的上层类,通过该上层类所在的模块而确定模块之间的依赖关系。
一种模块化JAVA应用软件在线更新方法,包括:
监视客户软件系统输入的扫描路径,提取并分析扫描路径下的文件目录,以文件为单位以字符流的方式加载到内存;对系统文件监视器中生成的文件目录进行分析,提取客户软件系统中所有的类及类信息,并将类信息注册到所设置的中间文件中;读取所述类信息,并在所加载的源代码信息中进行逆向分析,产生每个类对于其他类的依赖关系,并将产生的依赖关系依次注册到所述中间文件中;根据类之间的依赖关系,结合类信息生成依赖关系树结构或有向图结构,并对依赖关系树结构或有向图结构进行分割,生成模块结构,同时生成包含有模块划分和模块内部所有类关系的类配置文件和模块间依赖关系的模块配置文件;并将两配置文件部署到服务器上,同时配置启动所需的文件;读取类配置文件和模块配置文件,将从上述类配置文件和模块配置文件中读取的类和模块信息注册到注册中心新生成的新配置文件中,并生成模块代理和对应模块的描述文件;
接收到更新类的选择输入后,根据更新前类名提取出新类所在位置,将新类拷贝到对应的文件目录中;
接收新增扫描指令后,监视所输入的扫描路径,提取并分析扫描路径下的新增模块源代码文件目录列表,以文件为单位以字符流的方式加载到内存,并对系统文件监视器中产生的文件目录进行分析,提取客户软件系统中所有的新增类及类信息,读取所述类信息,在加载的新增源代码信息中进行逆向分析,生成每个新增类对于其他类的依赖关系,并将生成的依赖关系依次注册到新增类模块配置文件中,同时生成新增模块间的依赖关系,注册到新增配置文件中;根据新增类配置文件及新增模块配置文件,对新增模块解压缩,并将解压后的类拷贝入目标位置,该位置由新增模块的内部文件结构指定;读入所述模块配置文件,对其进行修剪并将修剪后的信息加入所述类配置文件中,读入新增模块配置文件,对其进行修剪并将修剪后的信息加入所述模块配置文件中;将新增的类和模块信息注册到注册中心,即加入到所述新配置文件中,并生成新增模块的模块代理和对应模块的描述文件,执行所述扫描文件。
本发明首先获取客户软件系统中所有的类,确定所有类之间的关系,将这些类划分为不同的模块,并对当前的客户软件系统中的类文件进行监控,确定有新的类文件导入时,确定该新导入的类文件与当前类文件之间的关系,确定出执行该新导入的类文件的配置文件,并将所确定的新导入类文件的配置文件加载到客户软件系统中的内存中,在接收到客户的调用请求时执行该新导入的类文件。这样,无论导入多少业务文件,只要该类文件的编译没有问题,均可直接获得执行,从而不必重新启动业务系统即可实现业务的加载。本发明在不重启系统的情况下实现了业务的加载。
附图说明
图1为本发明模块化JAVA应用软件在线更新系统的结构示意图;
图2为本发明总代理单元的结构示意图;
图3为本发明模块代理单元的结构示意图;
图4为本发明客户软件系统部署前及新增前的处理流程图;
图5为本发明客户软件系统运行时的流程图。
具体实施方式
以下结合附图对本发明作进一步详细描述。
图1为本发明模块化JAVA应用软件在线更新系统的结构示意图,如图1所示,本发明模块化JAVA应用软件在线更新系统包括有软件资源信息挖掘子系统10和软件动态更新子系统11,其中,软件资源信息挖掘子系统10包括有系统文件监视器101、源代码加载分析器103、系统类分析器102、类依赖关系产生器104、树或有向图依赖关系产生器105和模块划分产生器106;其中,系统文件监视器101用于配置客户软件系统的监控目录并提取出所述监控目录中的文件信息;源代码加载分析器103用于将所述客户软件系统中获取的源代码文件以文件为单位以字符流的方式加载到内存;系统类分析器102用于从所述客户软件系统中获取文件信息及源代码中提取出所述客户软件系统中所有的类及类本身的信息,并将所述类本身的信息依次注册到接口描述文件中;类依赖关系产生器104用于读取系统类分析器102产生的类信息,并结合所述类本身的信息在所述源代码加载分析器中进行逆向分析,产生每个类对其它类的依赖关系,并将产生的关系依次注册到所述接口描述文件中;树或有向图依赖关系产生器105用于读取类依赖关系产生器104中产生的类的依赖关系,并结合所述类本身的信息产生相应的依赖关系树结构或有向图,以供所述软件动态更新子系统进行分析读取,以在更新过程中确定类的加载顺序;模块划分产生器106用于对所述客户软件系统以依赖关系为单位进行模块划分,并产生模块结构,将所述模块结构提供给软件动态更新子系统11,软件动态更新子系统11在更新时按照所划分的模块分别按阶段独立更新;软件动态更新子系统11包括有接口111、总代理单元112、模块代理单元113及管理平台114;其中,总代理单元112用于在接收到用户输入的待加载的类的参数后生成所述类的实例对象或应用程序的调用结果;模块代理单元113用于利用用户输入的类的参数对管理模块内所有类的加载、对象的实例化和类的更新;管理平台114用于管理所述客户软件系统,并为软件动态更新子系统提供必要的工具支持,主要包括创建动态配置文件及其读取和写入、类依赖关系的解析、模块依赖关系的解析、文件及目录的复制工具;接口111包括内部接口和外部接口,所述内部接口为所述软件资源挖掘子系统与所述软件动态更新子系统之间的接口;所述外部接口用于向开发人员提供编程接口及类的参数输入接口。
其中,类依赖关系产生器104先使用正则表达式将源文件中的所有非编译部分的注释全部去除,然后通过总结一个类在JAVA源代码中被调用的方式,使用正则表达式与类名进行组合,然后再在全文件中进行搜索匹配,保证依赖关系生成的正确性。
模块划分产生器106在模块划分的过程中对每个模块设立标志位,对于纵向划分过程中使用切割生成的模块,对于其他模块有依赖关系进行标志,并对模块下的起始类设置上层关联类存储字段以存储在切割之前的上层类,通过该上层类所在的模块而确定模块之间的依赖关系。
具体的,软件资源挖掘子系统总体包括四个包结构,分别为com.evolution.struct包、com.evolution.mining包、com.evolution.modular包和com.evolution.run包,其中,com.evolution.struct包负责客户软件系统中所有类的信息以及模块的信息的存储,是系统的公共访问区,属于所有系统模块的共享资源,用于存储各个模块产生的类及模块信息以及供各个模块对类及模块信息的读取。com.evolution.struct包中包含有三个类:ClassInf、AllInfor和Module,其中,ClassInf类用于存储每个类的内部信息,包括类名,类的完全限定名,类所在文件的存储路径,类是否入度大于1的标记,类的入度,类所属模块,依赖于该类的类列表,以及该类所依赖的类列表。同时,为了保证该类的封装性以及类信息的可存储性,该类为每个类的信息属性提供了相应的set及get方法进行存取。Module类用于存储每个模块的内部信息,包括模块名,模块是否依赖于其他模块的标记,模块所依赖的模块列表,以及模块中所存在的类列表。同时,为了保证该类的封装性以及模块信息的可存储性,该类为每个模块的信息属性提供了相应的set及get方法进行存取。AllInfor类用于存储系统中所有的类信息及模块信息,且所有的类信息及模块信息能够被系统中所有的类所共享,故将其所有的类信息属性及模块信息属性设为静态属性,同时为其提供相应的静态set方法及静态get方法对其进行存取。
com.evolution.mining包集成了系统文件监视器,源代码加载分析器,系统类分析器,单个类的依赖关系产生器,树及有向图依赖关系产生器五个主要功能模块,分别用于监视用户接口文件及系统中的源代码文件,将系统中的源代码文件内容载入内存,通过分析系统源代码获取系统中所有类的信息并进行类信息的存储,通过分析源代码产生类之间的依赖关系并进行类之间依赖关系信息的存储,通过读取类信息产生依赖关系的树结构及有向图结构并分别以relations.xml及struct.xml接口文件的形式进行体现。com.evolution.mining包中包含有三个类:FileScan、Convert和DealXml,其中,FileScan类集成了系统文件监视器、源代码加载分析器、系统类分析器三个模块的功能。该类主要用于监视系统配置文件,获取系统的配置目录,并对系统目录下的所有文件进行扫描,提取出符合要求的程序源文件,并将源文件加入到内存中进行自动分析,提取出系统中的所有类及根据源代码特征获取各个类之间的依赖关系,并将所有类的信息及类的依赖关系信息写入AllInfor类中的相应成员变量中供其它模块进行访问。该类中各个方法的功能如下:
getFiles():该方法用于监视用户接口文件monitor.properties文件中的内容并获取相应的路径,并调用scanFiles方法,指导整个classes.xml文件的生成,并将所获取的类信息存储到AllInfor类中。
scanFiles():该方法实现了源代码加载分析器的功能,用于通过加载系统源代码获取系统中的类的信息。
createXml():该方法用于生成classes.xml文件的初始化工作。
writeToXml():该方法用于将系统中类的信息写入classes.xml文件中。
finishXml():该方法用于关闭写入classes.xml文件的输出流。
DealXml类实现了系统中树或有向图依赖关系产生器模块中的依赖关系有向图结构产生功能。该类通过从AllInfor类中提取出所有的类信息及类之间的依赖关系信息,以有向图的结构形式进行体现,并以xml文件的形式进行描述,即自动生成系统的内部接口struct.xml文件。该类中各个方法的功能如下:
createXml():该方法用于生成struct.xml文件的初始化工作。
checkAndWrite():该方法用于通过分析系统源代码,提取出各个类之间的依赖关系,并将获取到的依赖关系存储到Allinfor类中,并将系统中类之间的依赖关系信息写入struct.xml文件中。
finishXml():该方法用于关闭写入struct.xml文件的输出流。
Convert类实现了系统中树或有向图依赖关系产生器模块中的依赖关系树结构产生功能。该类通过从AllInfor类中提取出所有的类信息及类之间的依赖关系信息,以树的结构形式进行体现,并以xml文件的形式进行描述,即自动生成系统的内部接口relations.xml文件。该类中各个方法的功能如下:
createXml():该方法用于生成relations.xml文件的初始化工作。
convert():该方法用于从AllInfor类中获取类之间的依赖关系信息,并调用createTree()方法,完成整个生成relations.xml文件的工作。
createTree():该方法采用递归的方式创建类之间依赖关系的树结构
finishXml():该方法用于关闭写入relations.xml文件的输出流。
com.evolution.modular包包含了模块划分产生器的功能,主要根据系统中类之间的依赖关系对系统中的类进行模块划分,生成模块间的依赖关系,并将模块信息及模块之间的依赖关系信息进行存储,最终生成module.xml接口文件及ModuleRelations.xml接口文件。com.evolution.modular包中包含有两个类:ModuleRefs和Modula,其中,Modular类实现了系统中模块划分产生器中的模块划分功能。该类利用横向切片及纵向切片相结合的方式对系统中所有的类进行模块划分,横向切片即依赖关系的有向图结构中各个不相关的有向图进行切片划分,纵向切片即对于单独的一个有向图中,将入度大于一的节点进行入度的切割,将其及其节点下的图单独划分一个模块并以此递归。采用横向切片及纵向切片的结合的方法进行模块划分算法可以较好的避免模块粒度过于庞大的问题和和粒度太小而导致模块数量过多的问题。该类将最终划分出的模块信息及模块内类的信息存入AllInfor类中的相应成员变量中供其它模块进行访问。该类中各个方法的功能如下:
createXml():该方法用于生成module.xml文件的初始化工作。
divideModules():该方法应用横向切片及纵向切片结合的算法将系统中的类进行模块划分,并将模块信息写入到Allinfor类中。
addClasses():该方法被divideModules()所调用,用于将各棵独立的树递归的进行遍历并将遍历所得的类添加到其所对应的模块中,并将信息存储到Allinfor类中。
generateModuleXml():该方法通过从Allinfor类中获取所有的模块信息生成完整的module.xml文件。
finishXml():该方法用于关闭写入module.xml文件的输出流。
ModuleRefs类实现了系统中模块划分产生器中的模块依赖关系产生功能。该类从AllInfor类中获取相应的模块信息,从各模块中存在的类与其它模块中存在的类之间的依赖关系中自动进行分析获取出摸块之间的依赖关系,并以树的结构形式进行体现,并以xml文件的方式进行描述,即自动生成系统的内部接口ModuleRelations.xml文件。该类中各个方法的功能如下:
createXml():该方法用于生成ModuleRelations.xml文件的初始化工作。
generateRelations():该方法通过读取Allinfor类中的模块信息及类信息生成模块之间的依赖关系,并将模块间的依赖关系信息写回到Allinfor类中。
createTree():该方法采用递归的方式创建模块之间依赖关系的树结构
generateXml():该方法通过从Allinfor类中获取所有的模块信息及模块间的依赖关系信息生成完整的ModuleRelations.xml文件。
finishXml():该方法用于关闭写入ModuleRelations.xml文件的输出流。
图2为本发明总代理单元的结构示意图,如图2所示,本发明总代理单元112包括工厂模块1120、时间戳模块1121和注册中心1122,其中,工厂模块1120用于负责创建和维护模块代理单元113所处理的实例,即维护模块名到实例的映射,并将总代理单元112的请求进行参数处理,调用对应的模块代理单元113进行处理;在当前请求为获取对象请求时,在将实例对象返回给总代理单元112之前触发时间戳模块,通过对所述代理实例对象设定时间戳后再返回给总代理单元112;时间戳模块1121用于在应用软件更新时,记录下所有更新类的更新时刻,接收到应用系统对所述应用软件的调用请求时,首先将参数中的时间与所设置的更新时间戳进行对比,若早于更新时间则返回调用旧类的结果,否则返回调用更新后的类的结果;在应用请求为获取对象请求时,在实例对象返回给应用请求之前设定其生成时间,即将实例对象的属性字段设定为当前的时间;注册中心1122用于记录当前所有的模块及每个模块涉及的具体的类、确定所述类是否注册及其所属的模块。
图3为本发明模块代理单元的结构示意图,如图3所示,本发明模块代理单元113包括对象管理器1130、类加载器1131和模块描述器1132,其中,对象管理器1130用于根据索取的对象实例的具体请求来返回不同的实例对象;即通过调用类加载器索取类的类型对象,并通过反射方式返回实例化对象;类加载器1131用于根据请求将指定的类文件加载至内存,同时返回对应类的类型对象的引用;通过调用模块描述器读取当前请求类的更新时间,之后与参数中的时间进行对比,若所述参数的时间早于时间戳的时间则返回旧的类的类型实例对象,否则返回新的类的类型实例对象;模块描述器1132用于描述模块内所有类文件的信息,包括类名、类名所对应的路径、有无更新、对应更新后类的信息、更新的时间点。
软件动态更新子系统主要包括三个软件包com.evolution.proxy包、com.evolution.subproxy包和com.evolution.tools包,其中,com.evolution.proxy包中主要包括总代理单元的相关实现,包括总代理类、工厂类、时间戳类和注册中心类的实现。总代理类是对用户开放的统一的访问接口,开发人员只需传入简单的参数就能获得对应的正确的实例对象或者方法调用结果,至于到底是怎样调用和返回的,返回的是哪一个类型对程序员是透明的。该接口包括对象获取接口和静态方法调用等接口。对于每个应用系统只有一个总代理为用户服务,每个总代理逻辑上由一个工厂模块、一个时间戳模块和一个注册中心三部分组成。com.evolution.proxy包中具体包括:proxy类、Factory类、Register类和TimeStamp类,其中,proxy类包括:Proxy():私有构造方法,不允许外部类实例化该类的对象。getInstance(String className,Date date):根据类名和时间获取类的实例对象,将实例对象以泛型的形式返回。getInstance(StringclassName,Date date,Object...object):根据类名、时间和构造函数的参数对象列表来获取类的实例对象,将实例对象以泛型的形式返回。staticCall(Datedate,String className,String methodName,Object...args):静态方法调用接口。根据类名、方法名和参数对象列表来取得方法调用结果,结果以泛型的形式返回。
Factory类包括:subProxys:所有模块的模块名到对应模块代理对象实例的映射集合。Factory():私有构造方法,不允许外部类实例化该类的对象。getInstance(String className,Date date):根据类名和时间获取类的实例对象,将实例对象以泛型的形式返回。该方法对参数进行相应的处理之后再调用模块代理的相关方法来实现,并且对返回的对象设置相应的时间属性。getInstance(String className,Date date,Object...object):根据类名、时间和构造函数的参数对象列表来获取类的实例对象,将实例对象以泛型的形式返回。该方法对参数进行相应的处理之后再调用模块代理的相关方法来实现,并且对返回的对象设置相应的时间属性。getClassInstance(String className,Date date):根据类名和时间获取类的Class类型对象。createAllSubproxy():创建所有模块代理代理实例对象。建立模块代理到模块代理实例的映射关系赋值给属性subProxys。getSubProxy(String moduleName):根据模块名获得子代理实例对象。createSubXml(String moduleName):根据模块名创建模块描述文件。
Registere类包括:moduleAndClass:模块名到其对应的类名列表的映射集合。path:软件信息挖掘子模块的模块划分结果的路径。Register():私有构造方法,不允许外部类实例化该类的对象。register(String fileName):读取参数给定的文件名,将其中的信息注册到注册中心。register(String oldClassName,String moduleName):将该类注册到该模块下。getModuleNames():返回存有所有模块名的字符串数组。belong(String className):根据类名推出其属于哪个模块。如果不属于任何模块返回null。getModuleNum():返回模块总数。
TimeStamp类包括:TimeStamp():私有构造方法,不允许外部类实例化该类的对象。setTimeStamp(Object o,Date date):设定对象的产生时刻,即把参数的时间反射赋值给该对象的时间属性。removeAllTimeStamp():删除所有更新时刻信息。setUpdate(String oldName,String newName,Date date):设定一个类的更新信息,将旧类名、新类名和更新时间信息写入所属模块的更新配置文件。
com.evolution.subproxy包主要包括模块代理类、对象管理器类、类加载器类和模块描述器类的实现。每个模块代理实例由后三部分的实例组成。
com.evolution.subproxy包包含的类具体包括SubProxy类、ObjectManager类、ClassManager类、ModuleDes类,其中,SubProxy类包括:objectManager:该模块代理实例所包含的唯一对象管理器。classManager:该模块代理实例所包含的唯一类管理器。moduleDes:该模块代理实例所包含的唯一模块描述器。name:该模块代理实例的唯一模块名。SubProxy(String moduleName):根据模块名实例化模块代理对象。为每个模块代理实例配备一个类管理器实例、一个对象管理器实例和一个模块描述器实例。getInstance(String className,Datedate):根据类名和时间获取类的实例对象,将实例对象以泛型的形式返回。该方法通过调用objectManager的相应方法来实现。getInstance(StringclassName,Date date,Object...object):根据类名、时间和构造函数的参数对象列表来获取类的实例对象,将实例对象以泛型的形式返回。该方法通过调用objectManager的相应方法来实现。getClassInstance(String className,Date date):根据类名和时间获取类的Class类型对象。该方法通过调用classManager的相应方法来实现。其余方法为相应的getter方法,不再赘述。
ObjectManager类包括:subProxy:当前ObjectManager实例对象所属的模块代理实例对象。ObjectManager(SubProxy subProxy):创建实例时为其指定一个模块代理实例对象。getInstance(String className,Date date):根据类名和时间获取类的实例对象,将实例对象以泛型的形式返回。该方法首先通过调用类管理器来获取相应的类对象,然后反射生成相应的实例对象。getInstance(String className,Date date,Object...object):根据类名、时间和构造函数的参数对象列表来获取类的实例对象,将实例对象以泛型的形式返回。该方法首先通过调用类管理器来获取相应的类对象,然后根据相关参数反射生成相应的实例对象。ClassManager类包括:subProxy:当前ClassManager实例对象所属的模块代理实例对象。ClassManager(SubProxy subProxy):创建实例时为其指定一个模块代理实例对象。getClass(String className,Date date):根据类名和时间来返回Class类型的对象。它将调用checkTime方法来决定返回新类类对象还是旧类类对象。checkTime(String className,Date date):与更新时间对比,根据类名和日期来确定应该加载哪个类。该方法通过调用ModuleDes类相关方法来实现。getNewName(String oldName):根据旧类名查找相应的新类名,该方法通过调用ModuleDes类相关方法来实现。
ModuleDes类包括:path:该模块的模块描述文件路径。subProxy:当前ClassManager实例对象所属的模块代理实例对象。nameMap:每个类名到新类名的映射集合。timeMap:每个类名到更新时间的映射集合。ClassManager(SubProxy subProxy):创建实例时为其指定一个模块代理实例对象。setNameMap():从模块描述文件中读取该模块中所有类的更新信息,建立旧类名到新类名的映射集合,赋值给nameMap属性。getNewName(StringoldName):根据旧类名返回新类名。setUpdateTimeMap():从模块描述文件中读取该模块中所有类的更新信息,建立旧类名到更新时间的映射集合,赋值给timeMap属性。getUpdateTime(String className):根据旧类名返回类的更新时间。setUpdate(String oldName,String newName,Date date):描述一条更新记录,即向模块描述文件中写入旧类名、新类名和更新时间的对应关系。
com.evolution.tools包主要为动态更新子系统提供必要的工具类支持,主要功能包括创建动态配置文件及其读取和写入、类依赖关系的解析、模块依赖关系的解析、文件及目录的复制等工具。该包的设计主要是为了实现程序的清晰和复用。com.evolution.tools包包括CopyFiles类、ElementForQueue类、ForProxy类、InverseType类、ListClasses类,其中,CopyFiles类包括:CopyFiles():空的构造函数。copy(String from,String to):拷贝单个文件,从一个目录拷贝到另一个目录。xcopy(String from,String to):拷贝目录下所有文件,从一个目录拷贝到另一个目录。
ElementForQueue类主要是为树的层次遍历提供一个数据结构,该数据结构对基本元素进行包装,以便遍历时使用,包括:level:包装的元素所属的层次。element:包装的元素。ElementForQueue():空的构造函数。其余为相应的setter和getter方法,在此不再赘述。
ForProxy类是总代理功能的补充,主要功能是进行动态更新系统的初始化工作。该类继承HttpServlet类,是一个Servlet类,包括:ForProxy():空的构造函数。init():重写父类的方法,初始化动态更新系统,应用服务器启动后便运行。writeUnload(String moduleName):为指定个模块生成空的模块描述文件中。
InverseType类主要功能是实现不同类型之间的转换,包括:InverseType:私有的空构造函数。conversion(Class changeClass):将包装器类型的Class类型转换为对应的基本数据类型对应的Class类型。conversion(Class[]cs):将类类型数组中包装器类型对应的Class类型转换为基本数据类型的Class类型。conversion(Object[]obj):将对象数组转换为对应类类型的数组。
ListClasses类主要负责读取软件信息挖掘子系统的结果。包括依赖关系的推理、依赖树的层次遍历等功能,包括:path:基路径,寻找其他路径的参照。relation:模块描述文件的路径。mRelation:模块依赖描述文件的路径。saxReader:dom4j相关类。document:dom4j相关类。ListClasses():空的构造函数。getModuleNamesByRelation():读取模块依赖描述文件,按依赖关系返回所有的模块名,其顺序与依赖关系相反,即被依赖的模块在前。levelTraversal(Stringmodule):读取一棵树的所有类结点,自顶向下依层次遍历该树,将遍历结果放入List,然后逆序输出。modlevelTraversal(String module):读取一棵树的所有模块结点,自顶向下依层次遍历该树,将遍历结果放入List,然后逆序输出。
管理平台主要包括三个类:ListClasses、WriteUpdateInfo和ModuleDes。其中,ListClasses.JAVA的功能描述为:这个类主要是读取整个工程的依赖关系文件relations.xml,从中获取更新时要需要的所有相关信息,如根据类名查找其模块名,返回模块总数等,同时再遍历模块时为每个模块生成相应的模块描述文件。
其对应的接口描述:public int getModuleNum():读取整个工程的依赖关系文件relations.xml,返回划分的模块总数;public List<String>getModuleNames():读取整个工程的依赖关系文件relations.xml,返回所有的模块名;publicString getModuleName(int i):获得依赖关系文件relations.xml中第i个模块的名;public String getModuleName(String className):根据类名获得其所属的模块名;public void writeUnload(String name):根据类名为每个模块生成空的配置文件;public List<String>levelTraversal(String module):读取一棵树的所有结点,自顶向下依层次遍历该树,将遍历结果放入List。
WriteUpdateInfo.JAVA类功能描述为:这个类主要完善各模块对应的更新配置文件,根据更新实施细节插入每个待更新类的新旧类名以及更新时间等信息。
其对应的接口描述:public void write(String name):根据name从依赖关系文件relations.xml中读取出其所属的模块,然后修改该模块的更新配置文件中name对应的节点,若已存在该类的配置信息,删除,然后,插入最新更新后的类名(包名+类名)以及更新时间。
ModuleDes.JAVA类的功能描述为:主要是管理模块描述文件中的信息,包括查询以及写入更新类的新旧类名以及类更新时间。
其对应的接口描述:public String getNewName(String oldName):根据旧类名返回更新后的类名;public Date getUpdateTime(String className):根据旧类名返回更新时间;public void setUpdate(String oldName,String newName,Date date):根据旧类名完善各模块的配置文件,插入新的类名以及更新时间。
本发明中的接口包括内部接口和外部接口,其中,内部接口主要是软件资源挖掘子系统与软件动态更新子系统之间的接口,主要包括relations.xml、moduleRelations.xml等二个文件。下面分别具体描述一下这二个接口文件。
relations.xml
本配置文件是系统启动时需要的配置文件之一,它主要记录了整个系统内部的类关系。
<?xml version=″1.0″encoding=″UTF-8″?>
<rela tions>
<module name=″模块1″>
<level1 name=″类11″>
<level2 name=″类12″/>
</level1>
</module>
<module name=″模块2″>
<level1 name=″类21″/>
</module>
……
</relations>
moduleRelations.xml
该配置文件主要是记录模块之间的依赖关系,即模块之间的调用关系。
<?xml version=″1.0″encoding=″UTF-8″?>
<moduleRelations>
<module name=″模块1″>
<level1 name=″模块2″>
<level2 name=″模块3″/>
</level1>
</module>
<module name=″模块4″>
<level1 name=″模块5″>
<level2 name=″模块6″/>
</level1>
<level1 name=″模块7″/>
</module>
</moduleRelations>
关于外部接口,由于本发明的系统支持Windows系统和Unix系统,支持对JAVA语言开发的软件系统进行操作。软件资源挖掘子系统提供的用户接口主要采用图形界面的形式,文件监视器监视的文件目录通过界面输入实现。
软件动态更新子系统为开发人员提供的接口主要是指开发人员必须坚持面向接口编程,主要的编程规则如下:
1)所有类均按接口编程。
2)每个类都有私有属性date和相应的getter和setter方法。
3)每当创建对象实例时按以下方式创建:
NewObject no=Proxy.getInstance(java.lang.String className,
java.util.Date date,
java.lang.Object...args);no.sayHello();
参数:
className:完整类名形如com.evolution.xx-date:时间属性args:参数对象数组
4)在静态方法中创建对象实例时按以下方式创建:
NewObject no=Proxy.getInstance(java.lang.String thisClassName,
java.lang.String thisMethodName,
java.lang.String classNameToGet,
java.lang.Object...args);
no.sayHello();
参数:
thisClassName:该静态方法所在的类的完全限定名-thisMethodName:该静态方法的名称classNameToGet:要获取的实例对象对应的类名args:参数对象数组
5)调用静态方法时按以下方式调用:
Proxy.staticCall(java.util.Date date,
java.lang.String className,
java.lang.String methodName,
java.lang.Object...args);
参数:
第一个参数是调用方法的时间,第二个参数是类名,第三个参数是方法名,其余是方法的参数列表
6)调用新增方法时按以下方式调用:
Interface 1 instance=Proxy.getInstance(″A″,date,1,″test″);instance.call(object,″method1″,args0,args1,...);
新增的方法属于类A
参数:
第一个参数是调用方法的对象,第二个参数是方法名,其余是方法的参数列表
软件动态更新子系统提供了用户接口是一个可视化的管理界面。
系统总体流程分以下四个部分,正常运行时基本从部署前开始,对客户软件系统进行分析处理流程(1.1),然后对处理后的客户系统以及分析得到的配置文件同时部署,运行系统即可以进行更新流程(1.2)和新增操作,新增前要对新增的模块进行分析处理(1.3),之后可以正常新增(1.4)。
1.1客户软件系统部署前处理流程
图4为本发明客户软件系统部署前及新增前的处理流程图,如图4所示,步骤1.1的具体处理流程具体如下:
资源挖掘子系统启动,接收客户软件系统扫描指令,接收客户软件系统扫描路径输入,由系统文件监视器监视该路径,确认该目录是否存在,不存在则提示错误,存在则提取路径下文件目录,由源码加载分析器对上一步获取的源代码文件目录列表进行分析,以文件为单位以字符流的方式加载到内存,由系统类分析器对系统文件监视器中产生的文件目录进行分析,提取客户软件系统中所有的类及类本身的信息,将该类本身的信息依次注册到中间文件classRelation.xml中,由类依赖关系产生器读取类分析器产生的类信息,并结合类本身的信息,在源代码加载分析器加载的源代码信息中进行逆向分析,产生每个类对于其他类的依赖关系,并将产生的依赖关系依次注册到中间文件classRelation.xml中。由树或有向图依赖依赖关系产生器根据类依赖关系,结合类本身的信息产生相应的依赖关系树结构或有向图结构,由模块划分产生器对依赖关系树结构或有向图结构进行分割,以产生模块结构,模块结构产生后便可以产生包含有模块划分和模块内部所有类关系的配置文件relations.xml和模块间依赖关系的配置文件moduleRelations.xml。资源挖掘子系统运行结束。
1.2客户软件系统运行启动及更新流程
图5为本发明客户软件系统运行时的流程图,如图5所示,客户软件系统运行启动及更新流程包括:
经过分析的客户软件系统和由(1.1)流程中分析得到的配置文件relations.xml和moduleRelations.xml同时部署到服务器上,配置web.xml,将启动所需的Servlet配置到服务器上。
系统运行,软件动态更新系统初始化,读取配置文件relations.xml和moduleRelations.xml,由总代理模块的注册中心生成配置文件register.xml,并将所读取的类和模块信息注册到该配置文件中,由总代理模块的工厂模块生成模块代理和对应模块的描述文件moduleA.xml(A对应着不同的模块名),系统正常运行。
管理平台运行,系统按依赖关系列出所有的模块及模块内部的类,通过图形界面的形式显示出来。
管理平台接收更新指令,接收更新模块选择输入,接收更新类选择输入,接收对应新类输入,根据更新前类名提取出新类所在位置,将新类拷贝到对应的目录中。以上操作由管理平台实现。拷贝完成,由总代理的时间戳模块将更新前后的类名及更新时间写入类所在模块的描述文件中,供类使用时区分。
1.3客户软件系统新增前处理流程
图4为本发明客户软件系统部署前及新增前的处理流程图,如图4所示,客户软件系统新增前处理流程包括:
资源挖掘子系统系统启动,接收新增扫描指令,接收系统整体扫描路径输入,接收系统新增模块扫描路径,由系统文件监视器监视相关路径,确认该目录是否存在,不存在则提示错误,存在则提取路径下文件目录,由源码加载分析器对上一步获取的新增模块源代码文件目录列表进行分析,以文件为单位以字符流的方式加载到内存,由系统类分析器对系统文件监视器中产生的文件目录进行分析,提取客户软件系统中所有的新增类及类本身的信息(包含新增类所依赖的类),由类依赖关系产生器读取类分析器产生的类信息,并结合类本身的信息,在源代码加载分析器加载的新增源代码信息中进行逆向分析,产生每个新增类对于其他类(包含原有类)的依赖关系,并将产生的依赖关系依次注册到配置文件addRelations.xml中。同时产生新增模块中模块间的依赖关系,注册到配置文件addModuleRelations.xml。资源挖掘子系统运行结束。
1.4客户软件系统运行时新增流程
图5为本发明客户软件系统运行时的流程图,如图5所示,客户软件系统运行时新增流程包括:
管理平台接收新增指令,接收新增模块选择输入(压缩格式),接收新增类配置文件addRelations.xml,接收新增模块配置文件addModuleRelations.xml,对新增模块解压缩并将解压后的类拷贝入目标位置,该位置由新增模块的内部文件结构指定。由管理平台读入配置文件addRelations.xml,对其进行修剪并将修剪后的信息加入relations.xml配置文件,读入配置文件addModuleRelations.xml,对其进行修剪并将修剪后的信息加入moduleRelations.xml配置文件。由总代理模块的注册中心将新增的类和模块信息注册到注册中心,即加入到配置文件register.xml中,由总代理模块的工厂模块生成新增模块的模块代理和对应模块的描述文件moduleA.xml(A对应着不同的模块名),新系统正常运行。
本领域技术人员应当理解,本发明中的模块化JAVA应用软件在线更新方法可参见前述模块化JAVA应用软件在线更新系统的相关描述而理解。
以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。
Claims (10)
1.一种模块化JAVA应用软件在线更新系统,其特征在于,包括有软件资源信息挖掘子系统和软件动态更新子系统,其中,所述软件资源信息挖掘子系统包括有系统文件监视器、源代码加载分析器、系统类分析器、类依赖关系产生器、树或有向图依赖关系产生器和模块划分产生器;其中:
所述系统文件监视器用于配置客户软件系统的监控目录并提取出所述监控目录中的文件信息;
所述源代码加载分析器用于将所述客户软件系统中获取的源代码文件以文件为单位以字符流的方式加载到内存;
所述系统类分析器用于从所述客户软件系统中获取文件信息及源代码中提取出所述客户软件系统中所有的类及类本身的信息,并将所述类本身的信息依次注册到接口描述文件中;
所述类依赖关系产生器用于读取所述系统类分析器产生的类信息,并结合所述类本身的信息在所述源代码加载分析器中进行逆向分析,产生每个类对其它类的依赖关系,并将产生的关系依次注册到所述接口描述文件中;
所述树或有向图依赖关系产生器用于读取所述类依赖关系产生器中产生的类的依赖关系,并结合所述类本身的信息产生相应的依赖关系树结构或有向图,以供所述软件动态更新子系统进行分析读取,以在更新过程中确定类的加载顺序;
所述模块划分产生器用于对所述客户软件系统以依赖关系为单位进行模块划分,并产生模块结构,将所述模块结构提供给所述软件动态更新子系统,所述软件动态更新子系统在更新时按照所划分的模块分别按阶段独立更新;
所述软件动态更新子系统包括有接口、总代理单元、模块代理单元及管理平台;其中:
所述总代理单元用于在接收到用户输入的待加载的类的参数后生成所述类的实例对象或应用程序的调用结果;
所述模块代理单元用于利用用户输入的类的参数对管理模块内所有类的加载、对象的实例化和类的更新;
管理平台用于管理所述客户软件系统,并为所述软件动态更新子系统提供必要的工具支持,主要包括创建动态配置文件及其读取和写入、类依赖关系的解析、模块依赖关系的解析、文件及目录的复制工具;
所述接口包括内部接口和外部接口,所述内部接口为所述软件资源挖掘子系统与所述软件动态更新子系统之间的接口;所述外部接口用于向开发人员提供编程接口及类的参数输入接口。
2.根据权利要求1所述的系统,其特征在于,所述总代理单元包括:
工厂模块,用于负责创建和维护所述模块代理单元处理的实例,即维护模块名到实例的映射,并将所述总代理单元的请求进行参数处理,调用对应的模块代理单元进行处理;在当前请求为获取对象请求时,在将实例对象返回给所述总代理单元之前触发时间戳模块,通过对所述代理实例对象设定时间戳后再返回给所述总代理单元;
时间戳模块,用于在应用软件更新时,记录下所有更新类的更新时刻,接收到应用系统对所述应用软件的调用请求时,首先将参数中的时间与所设置的更新时间戳进行对比,若早于更新时间则返回调用旧类的结果,否则返回调用更新后的类的结果;在应用请求为获取对象请求时,在实例对象返回给应用请求之前设定其生成时间,即将实例对象的属性字段设定为当前的时间;
注册中心,用于记录当前所有的模块及每个模块涉及的具体的类、确定所述类是否注册及其所属的模块。
3.根据权利要求1所述的系统,其特征在于,所述模块代理单元包括:
对象管理器,用于根据索取的对象实例的具体请求来返回不同的实例对象;即通过调用类加载器索取类的类型对象,并通过反射方式返回实例化对象;
类加载器,用于根据请求将指定的类文件加载至内存,同时返回对应类的类型对象的引用;通过调用模块描述器读取当前请求类的更新时间,之后与参数中的时间进行对比,若所述参数的时间早于时间戳的时间则返回旧的类的类型实例对象,否则返回新的类的类型实例对象;
模块描述器,用于描述模块内所有类文件的信息,包括类名、类名所对应的路径、有无更新、对应更新后类的信息、更新的时间点。
4.根据权利要求1所述的系统,其特征在于,所述类依赖关系产生器先使用正则表达式将源文件中的所有非编译部分的注释全部去除,然后通过总结一个类在JAVA源代码中被调用的方式,使用正则表达式与类名进行组合,然后再在全文件中进行搜索匹配,保证依赖关系生成的正确性。
5.根据权利要求1所述的系统,其特征在于,所述模块划分产生器在模块划分的过程中对每个模块设立标志位,对于纵向划分过程中使用切割生成的模块,对于其他模块有依赖关系进行标志,并对模块下的起始类设置上层关联类存储字段以存储在切割之前的上层类,通过该上层类所在的模块而确定模块之间的依赖关系。
6.一种模块化JAVA应用软件在线更新方法,其特征在于,包括:
监视客户软件系统输入的扫描路径,提取并分析扫描路径下的文件目录,以文件为单位以字符流的方式加载到内存;对系统文件监视器中生成的文件目录进行分析,提取客户软件系统中所有的类及类信息,并将类信息注册到所设置的中间文件中;读取所述类信息,并在所加载的源代码信息中进行逆向分析,产生每个类对于其他类的依赖关系,并将产生的依赖关系依次注册到所述中间文件中;根据类之间的依赖关系,结合类信息生成依赖关系树结构或有向图结构,并对依赖关系树结构或有向图结构进行分割,生成模块结构,同时生成包含有模块划分和模块内部所有类关系的类配置文件和模块间依赖关系的模块配置文件;并将两配置文件部署到服务器上,同时配置启动所需的文件;读取类配置文件和模块配置文件,将从上述类配置文件和模块配置文件中读取的类和模块信息注册到注册中心新生成的新配置文件中,并生成模块代理和对应模块的描述文件;
接收到更新类的选择输入后,根据更新前类名提取出新类所在位置,将新类拷贝到对应的文件目录中;
接收新增扫描指令后,监视所输入的扫描路径,提取并分析扫描路径下的新增模块源代码文件目录列表,以文件为单位以字符流的方式加载到内存,并对系统文件监视器中产生的文件目录进行分析,提取客户软件系统中所有的新增类及类信息,读取所述类信息,在加载的新增源代码信息中进行逆向分析,生成每个新增类对于其他类的依赖关系,并将生成的依赖关系依次注册到新增类模块配置文件中,同时生成新增模块间的依赖关系,注册到新增配置文件中;根据新增类配置文件及新增模块配置文件,对新增模块解压缩,并将解压后的类拷贝入目标位置,该位置由新增模块的内部文件结构指定;读入所述模块配置文件,对其进行修剪并将修剪后的信息加入所述类配置文件中,读入新增模块配置文件,对其进行修剪并将修剪后的信息加入所述模块配置文件中;将新增的类和模块信息注册到注册中心,即加入到所述新配置文件中,并生成新增模块的模块代理和对应模块的描述文件,执行所述扫描文件。
7.根据权利要求6所述的方法,其特征在于,所述方法还包括:
在当前请求为获取对象请求时,在将实例对象返回之前触发时间戳模块,通过对所述代理实例对象设定时间戳后再返回实例对;
在应用软件更新时,记录下所有更新类的更新时刻,接收到应用系统对所述应用软件的调用请求时,首先将参数中的时间与所设置的更新时间戳进行对比,若早于更新时间则返回调用旧类的结果,否则返回调用更新后的类的结果;在应用请求为获取对象请求时,在实例对象返回给应用请求之前设定其生成时间,即将实例对象的属性字段设定为当前的时间;
注册中心记录当前所有的模块及每个模块涉及的具体的类、确定所述类是否注册及其所属的模块。
8.根据权利要求7所述的方法,其特征在于,所述方法还包括:
根据索取的对象实例的具体请求来返回不同的实例对象;即通过调用类加载器索取类的类型对象,并通过反射方式返回实例化对象;根据请求将指定的类文件加载至内存,同时返回对应类的类型对象的引用;通过调用模块描述器读取当前请求类的更新时间,之后与参数中的时间进行对比,若所述参数的时间早于时间戳的时间则返回旧的类的类型实例对象,否则返回新的类的类型实例对象;以及,描述模块内所有类文件的信息,包括类名、类名所对应的路径、有无更新、对应更新后类的信息、更新的时间点。
9.根据权利要求6所述的方法,其特征在于,所述方法还包括:
先使用正则表达式将源文件中的所有非编译部分的注释全部去除,然后通过总结一个类在JAVA源代码中被调用的方式,使用正则表达式与类名进行组合,然后再在全文件中进行搜索匹配,保证依赖关系生成的正确性。
10.根据权利要求6所述的方法,其特征在于,在模块划分的过程中,对每个模块设立标志位,对于纵向划分过程中使用切割生成的模块,对于其他模块有依赖关系进行标志,并对模块下的起始类设置上层关联类存储字段以存储在切割之前的上层类,通过该上层类所在的模块而确定模块之间的依赖关系。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 201010103226 CN102141919B (zh) | 2010-01-28 | 2010-01-28 | 模块化java应用软件在线更新系统及方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 201010103226 CN102141919B (zh) | 2010-01-28 | 2010-01-28 | 模块化java应用软件在线更新系统及方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102141919A true CN102141919A (zh) | 2011-08-03 |
CN102141919B CN102141919B (zh) | 2013-03-13 |
Family
ID=44409461
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN 201010103226 Expired - Fee Related CN102141919B (zh) | 2010-01-28 | 2010-01-28 | 模块化java应用软件在线更新系统及方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102141919B (zh) |
Cited By (23)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102662736A (zh) * | 2012-03-09 | 2012-09-12 | 北京神州数码思特奇信息技术股份有限公司 | 一种基于系统源代码获取组件调用关系的方法 |
CN103020075A (zh) * | 2011-09-23 | 2013-04-03 | 启碁科技股份有限公司 | 分析目标对象的依赖关系的方法 |
CN103023978A (zh) * | 2012-11-20 | 2013-04-03 | 青岛海信传媒网络技术有限公司 | 应用聚合平台的应用属性信息同步方法和系统 |
CN103678240A (zh) * | 2012-09-18 | 2014-03-26 | 阿里巴巴集团控股有限公司 | 用于对分布式计算进行组件化管理的方法和系统 |
CN104199653A (zh) * | 2014-08-26 | 2014-12-10 | 上海天脉聚源文化传媒有限公司 | 一种Java集成开发环境的实现方法及装置 |
CN105051718A (zh) * | 2013-01-05 | 2015-11-11 | 微软技术许可有限责任公司 | 监视-挖掘-管理循环 |
CN105068852A (zh) * | 2015-09-22 | 2015-11-18 | 普元信息技术股份有限公司 | 云计算环境下实现Java类在线热更新的系统与方法 |
CN105681346A (zh) * | 2016-03-15 | 2016-06-15 | 福建星海通信科技有限公司 | 一种基于工厂类实现报文解析的方法 |
CN106202206A (zh) * | 2016-06-28 | 2016-12-07 | 哈尔滨工程大学 | 一种基于软件聚类的源码功能搜索方法 |
CN106209443A (zh) * | 2016-07-01 | 2016-12-07 | 成都镜杰科技有限责任公司 | 基于云计算的客户关系管理方法 |
CN107092491A (zh) * | 2017-04-21 | 2017-08-25 | 网宿科技股份有限公司 | 一种配置加载方法和系统 |
CN107291487A (zh) * | 2016-04-13 | 2017-10-24 | 平安科技(深圳)有限公司 | 系统配置文件修改方法和系统 |
CN107346252A (zh) * | 2016-05-07 | 2017-11-14 | 腾讯科技(深圳)有限公司 | 应用更新方法和装置 |
CN107508846A (zh) * | 2016-06-14 | 2017-12-22 | 北京京东尚科信息技术有限公司 | 应用客户端的更新方法和系统及终端设备 |
CN107870771A (zh) * | 2016-09-26 | 2018-04-03 | 平安科技(深圳)有限公司 | 应用程序构建与升级方法及系统 |
CN108089873A (zh) * | 2017-12-21 | 2018-05-29 | 福建天泉教育科技有限公司 | 一种应用组件即时更新的方法及终端 |
CN108228208A (zh) * | 2016-12-22 | 2018-06-29 | 北京神州泰岳软件股份有限公司 | 一种java应用程序的动态更新方法和装置 |
CN108304186A (zh) * | 2016-08-16 | 2018-07-20 | 阿里巴巴集团控股有限公司 | 一种基于合成配置文件执行多项操作的方法与设备 |
CN108475232A (zh) * | 2016-02-23 | 2018-08-31 | 桑迪士克科技有限责任公司 | 使用xcopy和多逻辑条带的优化的基于主机的垃圾收集策略的高效实现方式 |
CN109582382A (zh) * | 2018-10-15 | 2019-04-05 | 平安科技(深圳)有限公司 | 配置信息的加载方法、装置、存储介质及终端设备 |
CN109739526A (zh) * | 2017-10-30 | 2019-05-10 | 北京京东尚科信息技术有限公司 | 代码更新方法和装置 |
CN110045982A (zh) * | 2019-03-28 | 2019-07-23 | 宋子杰 | 一种基于源代码聚合的嵌入式系统配置方法 |
CN114741121A (zh) * | 2022-04-14 | 2022-07-12 | 哲库科技(北京)有限公司 | 用于模块加载的方法与装置、电子设备 |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9858059B2 (en) | 2015-09-14 | 2018-01-02 | International Business Machines Corporation | System module deployment optimization |
CN106980512A (zh) * | 2017-05-15 | 2017-07-25 | 中国建设银行股份有限公司 | 更新java应用服务的系统及方法 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20070061372A1 (en) * | 2005-09-14 | 2007-03-15 | International Business Machines Corporation | Dynamic update mechanisms in operating systems |
CN101174217A (zh) * | 2007-11-22 | 2008-05-07 | 上海交通大学 | Java程序可动态更新化实现方法 |
CN101477531A (zh) * | 2008-12-08 | 2009-07-08 | 山东浪潮齐鲁软件产业股份有限公司 | 一种流程模型从测试环境发布到生产环境的实现方法 |
-
2010
- 2010-01-28 CN CN 201010103226 patent/CN102141919B/zh not_active Expired - Fee Related
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20070061372A1 (en) * | 2005-09-14 | 2007-03-15 | International Business Machines Corporation | Dynamic update mechanisms in operating systems |
CN101174217A (zh) * | 2007-11-22 | 2008-05-07 | 上海交通大学 | Java程序可动态更新化实现方法 |
CN101477531A (zh) * | 2008-12-08 | 2009-07-08 | 山东浪潮齐鲁软件产业股份有限公司 | 一种流程模型从测试环境发布到生产环境的实现方法 |
Cited By (36)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103020075B (zh) * | 2011-09-23 | 2016-03-09 | 启碁科技股份有限公司 | 分析目标对象的依赖关系的方法 |
CN103020075A (zh) * | 2011-09-23 | 2013-04-03 | 启碁科技股份有限公司 | 分析目标对象的依赖关系的方法 |
CN102662736A (zh) * | 2012-03-09 | 2012-09-12 | 北京神州数码思特奇信息技术股份有限公司 | 一种基于系统源代码获取组件调用关系的方法 |
CN102662736B (zh) * | 2012-03-09 | 2015-04-22 | 北京思特奇信息技术股份有限公司 | 一种基于系统源代码获取组件调用关系的方法 |
CN103678240A (zh) * | 2012-09-18 | 2014-03-26 | 阿里巴巴集团控股有限公司 | 用于对分布式计算进行组件化管理的方法和系统 |
CN103678240B (zh) * | 2012-09-18 | 2018-08-24 | 阿里巴巴集团控股有限公司 | 用于对分布式计算进行组件化管理的方法和系统 |
CN103023978B (zh) * | 2012-11-20 | 2016-06-29 | 青岛海信传媒网络技术有限公司 | 应用聚合平台的应用属性信息同步方法和系统 |
CN103023978A (zh) * | 2012-11-20 | 2013-04-03 | 青岛海信传媒网络技术有限公司 | 应用聚合平台的应用属性信息同步方法和系统 |
CN105051718A (zh) * | 2013-01-05 | 2015-11-11 | 微软技术许可有限责任公司 | 监视-挖掘-管理循环 |
CN105051718B (zh) * | 2013-01-05 | 2018-08-28 | 微软技术许可有限责任公司 | 用于监视-挖掘-管理循环的方法和系统 |
US10095978B2 (en) | 2013-01-05 | 2018-10-09 | Microsoft Technology Licensing, Llc | Monitor-mine-manage cycle |
CN104199653B (zh) * | 2014-08-26 | 2017-12-15 | 上海天脉聚源文化传媒有限公司 | 一种Java集成开发环境的实现方法及装置 |
CN104199653A (zh) * | 2014-08-26 | 2014-12-10 | 上海天脉聚源文化传媒有限公司 | 一种Java集成开发环境的实现方法及装置 |
CN105068852A (zh) * | 2015-09-22 | 2015-11-18 | 普元信息技术股份有限公司 | 云计算环境下实现Java类在线热更新的系统与方法 |
CN108475232A (zh) * | 2016-02-23 | 2018-08-31 | 桑迪士克科技有限责任公司 | 使用xcopy和多逻辑条带的优化的基于主机的垃圾收集策略的高效实现方式 |
CN105681346A (zh) * | 2016-03-15 | 2016-06-15 | 福建星海通信科技有限公司 | 一种基于工厂类实现报文解析的方法 |
CN107291487A (zh) * | 2016-04-13 | 2017-10-24 | 平安科技(深圳)有限公司 | 系统配置文件修改方法和系统 |
CN107346252B (zh) * | 2016-05-07 | 2021-05-25 | 腾讯科技(深圳)有限公司 | 应用更新方法和装置 |
CN107346252A (zh) * | 2016-05-07 | 2017-11-14 | 腾讯科技(深圳)有限公司 | 应用更新方法和装置 |
CN107508846A (zh) * | 2016-06-14 | 2017-12-22 | 北京京东尚科信息技术有限公司 | 应用客户端的更新方法和系统及终端设备 |
CN106202206B (zh) * | 2016-06-28 | 2020-02-14 | 哈尔滨工程大学 | 一种基于软件聚类的源码功能搜索方法 |
CN106202206A (zh) * | 2016-06-28 | 2016-12-07 | 哈尔滨工程大学 | 一种基于软件聚类的源码功能搜索方法 |
CN106209443B (zh) * | 2016-07-01 | 2019-05-03 | 深圳市沃客非凡科技有限公司 | 基于云计算的客户关系管理方法 |
CN106209443A (zh) * | 2016-07-01 | 2016-12-07 | 成都镜杰科技有限责任公司 | 基于云计算的客户关系管理方法 |
CN108304186A (zh) * | 2016-08-16 | 2018-07-20 | 阿里巴巴集团控股有限公司 | 一种基于合成配置文件执行多项操作的方法与设备 |
CN108304186B (zh) * | 2016-08-16 | 2021-07-06 | 阿里巴巴集团控股有限公司 | 一种基于合成配置文件执行多项操作的方法与设备 |
CN107870771A (zh) * | 2016-09-26 | 2018-04-03 | 平安科技(深圳)有限公司 | 应用程序构建与升级方法及系统 |
CN108228208A (zh) * | 2016-12-22 | 2018-06-29 | 北京神州泰岳软件股份有限公司 | 一种java应用程序的动态更新方法和装置 |
CN107092491A (zh) * | 2017-04-21 | 2017-08-25 | 网宿科技股份有限公司 | 一种配置加载方法和系统 |
CN109739526A (zh) * | 2017-10-30 | 2019-05-10 | 北京京东尚科信息技术有限公司 | 代码更新方法和装置 |
CN108089873A (zh) * | 2017-12-21 | 2018-05-29 | 福建天泉教育科技有限公司 | 一种应用组件即时更新的方法及终端 |
CN109582382A (zh) * | 2018-10-15 | 2019-04-05 | 平安科技(深圳)有限公司 | 配置信息的加载方法、装置、存储介质及终端设备 |
CN109582382B (zh) * | 2018-10-15 | 2023-02-03 | 平安科技(深圳)有限公司 | 配置信息的加载方法、装置、存储介质及终端设备 |
CN110045982A (zh) * | 2019-03-28 | 2019-07-23 | 宋子杰 | 一种基于源代码聚合的嵌入式系统配置方法 |
CN114741121A (zh) * | 2022-04-14 | 2022-07-12 | 哲库科技(北京)有限公司 | 用于模块加载的方法与装置、电子设备 |
CN114741121B (zh) * | 2022-04-14 | 2023-10-20 | 哲库科技(北京)有限公司 | 用于模块加载的方法与装置、电子设备 |
Also Published As
Publication number | Publication date |
---|---|
CN102141919B (zh) | 2013-03-13 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102141919B (zh) | 模块化java应用软件在线更新系统及方法 | |
Potvin et al. | Why Google stores billions of lines of code in a single repository | |
Johnson et al. | The spring framework-reference documentation | |
US7194730B2 (en) | System and method for the configuration of software products | |
Kwon et al. | Cloud refactoring: automated transitioning to cloud-based services | |
US20070250574A1 (en) | Continuous deployment | |
US20120110030A1 (en) | Software database system and process of building and operating the same | |
WO2008064188A2 (en) | Method and apparatus of a build management system | |
JP2005522757A (ja) | ソフトウェア配布方法およびシステム | |
US10666744B2 (en) | Managing discovery and selection of service interface specifications | |
CN101866315A (zh) | 软件开发工具的测试方法及系统 | |
Gousios et al. | Conducting quantitative software engineering studies with Alitheia Core | |
Bottoni et al. | Specifying integrated refactoring with distributed graph transformations | |
Riva et al. | UML-based reverse engineering and model analysis approaches for software architecture maintenance | |
Nobrega et al. | LHCb computing technical design report | |
van der Burg et al. | Automated deployment of a heterogeneous service-oriented system | |
Deng et al. | Evolution in model-driven software product-line architectures | |
Beurer-Kellner et al. | A transformational approach to managing data model evolution of web services | |
Hamann et al. | Towards supporting multiple execution environments for uml/ocl models at runtime | |
Kaur et al. | Version management and composition of software components in different phases of software development life cycle | |
Hnětynka | Making deployment process of distributed component-based software unified | |
US20100023923A1 (en) | Method for medeling objects in a hetrogenious computing environment | |
LEHRHUBER | Pdf support for qualitative research in the cloud | |
Wipp | Workflows on Android: A framework supporting business process execution and rule-based analysis | |
Schmeling et al. | Application Design Decisions |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
C17 | Cessation of patent right | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20130313 Termination date: 20140128 |