CN105404524A - Java应用中的类加载隔离方法及装置 - Google Patents

Java应用中的类加载隔离方法及装置 Download PDF

Info

Publication number
CN105404524A
CN105404524A CN201410469375.2A CN201410469375A CN105404524A CN 105404524 A CN105404524 A CN 105404524A CN 201410469375 A CN201410469375 A CN 201410469375A CN 105404524 A CN105404524 A CN 105404524A
Authority
CN
China
Prior art keywords
class
assembly
load
bag
assigned catalogue
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
Application number
CN201410469375.2A
Other languages
English (en)
Other versions
CN105404524B (zh
Inventor
倪超
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Taobao China Software Co Ltd
Original Assignee
Alibaba Group Holding Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Alibaba Group Holding Ltd filed Critical Alibaba Group Holding Ltd
Priority to CN201410469375.2A priority Critical patent/CN105404524B/zh
Publication of CN105404524A publication Critical patent/CN105404524A/zh
Application granted granted Critical
Publication of CN105404524B publication Critical patent/CN105404524B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Landscapes

  • Stored Programmes (AREA)

Abstract

本申请公开了Java应用中的类加载隔离方法及装置,预先在隔离容器的第一指定目录下存放有多个需要隔离加载的组件包,每个组件包的第二指定目录中存放有对应组件需导出的类的信息,第三指定目录中保存有组件内各个类及其依赖项的类代码;所述方法包括:接收启动指令;解析所述第一指定目录下的各个组件包;分别以各个组件的第三指定目录为类路径,为各个组件创建类加载器;针对各个组件,分别用各自对应的类加载器对组件内需要导出的类进行加载;将所述需导出的类导出到所述第三方应用程序所在的运行环境中。通过本申请,在实现模块化的同时,无需为实现动态化而耗费过多的系统资源以及人力、时间成本。

Description

Java应用中的类加载隔离方法及装置
技术领域
本申请涉及Java应用技术领域,特别是涉及Java应用中的类加载隔离方法及装置。
背景技术
在Java开发领域,组件是一个重要的概念。所谓组件,是能够完成某种功能并且向外提供若干个使用这个功能的接口的可重用的代码集。组件内部由多个类来协同实现指定的功能,同时组件对外暴露一个或多个接口,供外界调用。插件、框架等都属于组件的范畴。
开发人员在进行Java应用开发时,可能会用到多个组件,通过多个组件之间的协同,共同完成应用中的某项或多项功能。在传统的开发过程中,开发人员直接将各个组件依赖在应用中,但是,由于不同的组件之间可能存在不同版本之间的冲突,以及各自的依赖项的不同版本之间的冲突等原因,给应用开发带来很多不便。
为此,OSGi(OpenServiceGatewayInitiative,开放服务网关协议)技术也就应运而生了。OSGi技术是面向Java的动态模型系统,其主要职责就是为了让开发者可以构建动态化、模块化的Java系统。
也就是说,OSGi平台具有两大方面的特点:模块化以及动态化。其中,所谓的模块化,就是指可以将一个大型系统分解为多个较小的互相协作的逻辑单元,通过强制设定模块之间的逻辑边界来改善系统的维护性和封装性。所谓的动态化,就是指可以提供在多种网络设备上无需重启的动态改变构造的功能。
可见,OSGi平台的功能可谓非常强大,其提供的模块化特点,尤其是隔离机制,由于可以避免组件间的冲突等问题,在实际应用中得到了普遍的认可。但是,在衡量一个平台是否优秀时,其标准往往不仅在于功能强大与否,还需要从实用性等角度进行衡量,例如,需要考虑是否易于维护、实现复杂度等因素。目前的OSGi平台在实际的应用过程中就遇到了类似的问题,主要体现在:
从实用性角度来讲,目前的大部分应用其实对于热部署、动态替换等并没有太强烈的需求,开发人员通常都能够接受功能更新等导致的应用重启;
从复杂从复杂性角度来讲,想要做到平滑热替换,尤其是对于那些运行期有状态的组件而言,实现动态化相当复杂;
从可行性角度来讲,实现动态化,需要改变开发人员和运维人员的开发与运维习惯,在推广上面临极大的挑战。
以上问题都是由于OSGi提供了动态化特点而导致的。但是,对于开发人员而言,要想利用OSGi平台提供的模块化特点,就不得不接受其动态化特点,但由此会带来巨大的工作量,需要耗费大量的系统资源以及人力、时间成本来实现这种动态化。因此,对于在使用OSGi平台进行开发的过程中,在系统资源以及人力、时间成本方面都存在着比较大的浪费。
总之,如何降低上述的各种浪费,是迫切需要本领域技术人员解决的技术问题。
发明内容
本申请提供了Java应用中的类加载隔离方法及装置,可以在实现模块化的同时,无需为实现动态化而耗费过多的系统资源以及人力、时间成本。
本申请提供了如下方案:
一种Java应用中的类加载隔离方法,预先在隔离容器的第一指定目录下存放有多个需要隔离加载的组件包,每个组件包的第二指定目录中存放有对应组件需导出的类的信息,第三指定目录中保存有组件内各个类及其依赖项的类代码;所述方法包括:
在所述隔离容器被下载并保存到第三方应用程序所在目录下之后,接收启动指令;所述第三方应用程序为使用所述隔离容器提供的接口包开发的应用程序;
解析所述第一指定目录下的各个组件包;
分别以各个组件的第三指定目录为类路径,为各个组件创建类加载器;
针对各个组件,分别用各自对应的类加载器对组件内需要导出的类进行加载;
将所述需导出的类导出到所述第三方应用程序所在的运行环境中,以便在所述第三方应用程序运行时使用各个组件提供的功能。
一种Java应用中的类加载隔离装置,预先在隔离容器的第一指定目录下存放有多个需要隔离加载的组件包,每个组件包的第二指定目录中存放有对应组件需导出的类的信息,第三指定目录中保存有组件内各个类及其依赖项的类代码;所述装置包括:
启动指令接收单元,用于在所述隔离容器被下载并保存到第三方应用程序所在目录下之后,接收启动指令;所述第三方应用程序为使用所述隔离容器提供的接口包开发的应用程序;
解析单元,用于解析所述第一指定目录下的各个组件包;
类加载器创建单元,用于分别以各个组件的第三指定目录为类路径,为各个组件创建类加载器;
类加载单元,用于针对各个组件,分别用各自对应的类加载器对组件内需要导出的类进行加载;
类导出单元,用于将所述需导出的类导出到所述第三方应用程序所在的运行环境中,以便在所述第三方应用程序运行时使用各个组件提供的功能。
根据本申请提供的具体实施例,本申请公开了以下技术效果:
通过本申请实施例,提供了一个轻量级的隔离容器,该容器中的第一指定目录下存放有多个需要隔离加载的组件包,每个组件包的第二指定目录中存放有对应组件需导出的类的信息,第三指定目录中保存有组件内各个类及其依赖项的类代码。第三方开发者可以使用该隔离容器提供的API接口包开发其应用程序,并将隔离容器保存到应用程序所在的目录下,这样,在启动J2EE容器运行其应用程序时,隔离容器就可以首先被启动,并且可以解析各个组件包,以组件包中的类路径为参数,分别为各个组件创建类加载器,这样,就可以分别用各自的类加载器来加载组件内的类,以此实现组件之间的相互隔离,互不干扰。可见,本申请实施例提供的隔离容器可以帮助开发人员实现组件间的隔离,避免由于版本等出现的冲突问题,并且,无需为实现动态化而耗费过多的系统资源以及人力、时间成本。
当然,实施本申请的任一产品并不一定需要同时达到以上所述的所有优点。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本申请实施例提供的隔离容器的容器级目录结构示意图;
图2是本申请实施例提供的隔离容器的模块级目录结构示意图;
图3是本申请实施例提供的方法的流程图;
图4是本申请实施例提供的装置的示意图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员所获得的所有其他实施例,都属于本申请保护的范围。
在本申请实施例中,提供了轻量级的隔离容器,该容器只通过类隔离实现模块化,而忽略动态化。这样,开发人员在基于该隔离容器进行应用的开发时,可以很好的实现组件之间的隔离,同时又不必为实现动态化而耗费更好的资源以及人力、时间成本。下面对具体的实现方案进行详细地介绍。
首先需要说明的是,本申请实施例提供的隔离容器,一方面作为可以起到存储作用,用于存储各个组要隔离的组件包等信息,每个组件包中存放有对应组件自身的代码、需导出的类的信息,等等;另一方面,该隔离容器本身还属于一种可执行程序,在具体的第三方应用的运行环境中,该隔离容器可以被启动,启动之后,可以执行组件包的解析、类加载器的创建等一系列操作,使得隔离容器中的组件可以导出给具体的第三方应用,供第三方应用调用。
其中,具体实现时,首先可以基于每个组件的源代码进行打包,将多个这样的组件,连同隔离容器自己的内核代码,一起组成隔离容器。之后可以将该隔离容器进行发布(例如,发布到官方网站等处),同时向第三方开发人员提供API接口包;这样,开发人员在开发自己的应用程序的时候,可以使用隔离容器提供给他们的API接口包。开发人员在完成应用程序的开发之后,可以将自己的应用程序(*.war)和隔离容器一起放入一个J2EE容器中去。开发人员启动J2EE容器之后,J2EE容器会首先启动该隔离容器,由隔离容器将其中存放的各个组件部署到J2EE环境中,之后就可以启动应用程序。
需要说明的是,本申请实施例为隔离容器中各种信息的存储方式(包括目录结构、各目录中的文件命名方式等)进行了定义。具体的,参见图1,在该例子中,将隔离容器称为Pandora容器,其部署包的名称为taobao-hsf.sar。该部署包下包括Lib、META-INF、Plugins这样三个目录,其中:
Lib目录放置的是与各个应用服务器(jboss,jetty,tomcat等)对接需要使用的类及隔离容器启动与运行时需要的类。这些类属于隔离容器的核心类,主要用于容器的启动与运行以及与应用服务器的对接。
META-INF目录放置应用服务器需要使用的配置文件,该目录并非必需。
Plugins目录下放置需要隔离的组件包,每个组件包的名称唯一。另外考虑到独立部署及以后统一编程模型,plugins目录下可能会放置通用服务器组件。Plugins目录下,所有以jar.plugin方式命名的模块,默认为导出类行为,也即需要导出到第三方应用程序的运行环境中供第三方应用程序使用。如果有自定义后缀的,可以根据不同的后缀自定义追加部署器进行部署。
Plugins目录下的每个组件包可以看作是一个模块,例如,参见图2,其为将图1中的Plugins目录打开后的显示状态示意图(201区域内的“Plugins”对应的图标显示为选中状态),202区域显示的就是该Plugins目录下的各个组件包的名称,包括config-client.jar.plugin,eagleeye-core.jar.plugin,hsf.jar.plugin,等等。通过该隔离容器使得各个模块之间相互隔离,从而达到模块化的效果。开发人员可以直接通过该隔离容器调用各个组件的功能,而不必再担心组件之间的相互冲突等问题。
每个组件包在隔离容器中以*.jar.plugin的文件形式存在,其实质上是一个jar文件。每个组件包内的目录结构可以如图2中的203区域所示,其为将hsf.jar.plugin组件包选中之后,显示出的包内的目录结构。可见,其中包括conf、lib、META-INF这样三个目录,另外组件包的根目录下还可以放置有一个version.properties文件,其用来标示其组件包版本,方便隔离容器管理及升级,内容可以在第一行,版本号可自定义,默认状态下,可以使用要隔离的组件包名称中的版本号。
其中,Conf目录下放置export.properties文件,export.properties用来标示该组件导出的类,例如,具体可以有如下几种表示方式:
classes=com.taobao.hsf.XXXClass,com.taobao.xx.xxClass
package=com.taobao.xxxpackage,com.taobao.xxpackage
jar=hsf.jar,xxx.jar
usebizclassloader=true|false
也即,可以按照classes、package和jar三种形式来导出类,其中,classes方式下,可以直接列举出各个需要导出的类的名称,例如,上述例子中的第一行,com.taobao.hsf.XXXClass是其中一个需要导出的类,com.taobao.xx.xxClass是其中另一个需要导出的类。
在package方式下,可以列举出需要将哪些包下的类导出,也即以包为单位,指出需要导出的类。例如,前述例子中的第二行,是指需要将com.taobao.xxxpackage以及com.taobao.xxpackage这两个包下所有的类也都需要导出。
在jar方式下,可以列举出需要将哪些库下的类导出,也即以库为单位,指出需要导出的类。例如,前述例子中的第三行,是指需要将hsf.jar以及xxx.jar这两个库下所有的类都导出。
Usebizclassloader标示该组件是否需要使用外部三方容器的类加载器来进行类加载,比如hsf就必须使用外部三方容器的类加载器来加载相关的类(做序列化及反序列化用)。
另外,该Conf目录下还可以包括一个priority.properties文件,该文件用于表明各个组件包的加载优先级,以一个数字标示,比如:100等。不同的组件包可以具有不同的加载优先级,其作用在于:在后续进行加载时,可以根据这种优先级的高低来确定各个组件的加载先后顺序,优先级越高,越优先加载。具体实现时,这种优先级信息可以是根据组件之间的依赖关系设定的。例如,某组件A需要依赖组件B,也即,组件A需要使用组件B中的某个或者某些类,则组件B的加载优先级要高于组件A,也就是说,被依赖的组件可以优先加载。并且先加载的组件中的类可以先导出到缓存中,这样,在加载组件A中的各个类时,可以首先查询缓存中是否已经存在该类,如果是,则可以直接从缓存中加载。这种已经存在缓存中的类,就是之前在加载其他高优先级的组件时已经加载的类,也即,优先级高的组件导出的类可以与其他组件共享。
组件包下的Lib目录下用于放置组件自身的jar包及其依赖其他组件的jar包。
以上介绍的内容主要为图2中的组件包下的目录结构,当然,在实际应用中,有的组件可能是隔离容器自己需要使用的,例如,用于提供管理等方面的服务,对于这类组件,一般可能不需要导出给第三方应用,因此,一般称为“服务型组件”;,对于这种服务型组件包的目录结构,本申请实施例也可以预先进行定义;相应的,图2中所述的以*.jar.plugin的文件形式存在的可导出给第三方应用的组件可以称为“导出型组件”。例如,如图3所示,301区域内被选中状态的qos.service就是一个服务型组件,目录结构如302区域所示。其中包括conf以及lib两个目录,其中,conf目录包含两个配置文件,priority.properties配置该服务优先级,service.properties文件里面包含容器提供的服务接口实现。lib目录放置服务启动的接口实现jar包及依赖jar包。
在根据以上所述的目录结构生成组件包,并放置在隔离容器的指定目录下之后,就可以生成隔离容器,之后就可以将隔离容器进行发布,开发人员在使用隔离容器提供给他们的API接口包开发完成应用程序之后,可以下载该隔离容器,并存放在应用程序所在的目录下,之后就可以启动J2EE容器,关于启动之后的具体实现后续会进行详细的介绍。这里需要说明的是,对于一个隔离容器而言,其中具体放置哪些组件,以及组件中具体的代码实现,都可以是由隔离容器的提供方来决定的,放置不同组件的隔离容器可以用不同的版本号进行标识,开发人员可以根据自己的实际需要,选择下载使用适合的版本。
另外需要说明的是,以上图1、图2中所示的各个目录的名称等都是举例进行介绍,在实际应用中,也可以使用其他的名称,并且有些目录或者有些目录下的具体文件可能并不是必需的。例如,如果某组件不存在依赖的其他组件,则在组件包下的lib目录中,可以只存放组件自身的jar包,而不再存在其依赖的jar包。或者,关于优先级信息也不是必需的。总之,在本申请实施例中,可以预先在隔离容器的第一指定目录下存放有多个需要隔离加载的组件包,每个组件包的第二指定目录中存放有对应组件需导出的类的信息,第三指定目录中保存有对应组件中各个类及其依赖项的类代码,之后就可以将隔离容器进行发布,供第三方应用使用。具体在进行使用时,参见图3,本申请实施例提供了一种Java虚拟机中的类加载隔离方法,该方法可以包括以下步骤:
S301:在所述隔离容器被下载并保存到第三方应用程序所在目录下之后,接收启动指令;所述第三方应用程序为使用所述隔离容器提供的接口包开发的应用程序;
在将隔离容器进行发布时,还可以向第三方应用开发人员提供隔离容器的API接口包,这样,第三方开发人员就可以使用这些API接口进行应用程序的开发。在开发完成之后,开发人员可以下载该隔离容器,并保存到应用程序所在的目录下。之后,开发人员可以启动J2EE容器来运行其应用程序,由于应用程序所在的目录下还保存了隔离容器,因此J2EE容器被启动之后,会首先启动隔离容器。相应的,隔离容器就可以接收到启动指令。
S302:解析所述第一指定目录下的各个组件包;
隔离容器被启动之后,可以启动自身的类加载器,这个类加载器是整个隔离容器隔离机制的关键所在,它既可以与外部三方容器(外部三方容器就是指托管第三方应用程序的j2ee容器,例如tomcat,jetty,jboss等)联通,同时也将组件与外部三方容器隔离。隔离容器自身的类加载器被启动之后,可以解析容器中的第一指定目录下的各个组件包,例如,图1所示的plugins下的各个组件包。解析的目的主要是获取各个组件包中的目录结构,以及各个目录下保存的信息。例如,获取到保存有需要导出的类信息的第二指定目录的路径,如果其中保存有优先级文件,则还可以从优先级文件中读取出各个组件的优先级信息,等等。
S303:分别以各个组件的第三指定目录为路径为参数,为各个组件创建类加载器;
在解析了各个组件包之后,可以获取到其中保存有需要导出的类信息的第三指定目录(例如,图2中的lib目录)的路径,因此,可以分别以各个组件的第三指定目录为类路径,为各个组件创建类加载器。也就是说,每个组件会对应一个类加载器,同一个组件内的各个类由同一个类加载器进行加载,而不同组件中的类则会有不同的类加载器进行加载,这样,可以起到组件之间相互隔离互不干扰的作用。
S304:针对各个组件,分别用各自对应的类加载器对组件内需要导出的类进行加载;
具体在使用类加载器进行类加载时,在前文所述的组件包目录结构中已经提到,每个组件包都包含一个lib目录,因此,可以从这个类路径中来加载类。通常情况下,组件中的类都可以从该类路径下完成加载。
当然,在实际应用中,还有一些特殊情况存在:
第一,一些特殊的类可能需要从外部三方容器加载。例如,如果是servlet或spring的相关类,则需要从外部三方容器加载。也就是说,在进行加载时,可以首先判断需要加载的类是否为servlet或spring的相关类,如果是,则可以将这些类转交给外部三方容器bizclassloader去加载。这主要是考虑到一些组件,比如HSF,需要与具体的应用程序使用同一个spring。
第二,隔离容器的开发者在向隔离容器中添加组件时,如果希望其中某个类从外部三方容器加载,则可以在组件包中声明,这样,类加载器可以根据这种声明,从外部三方容器加载该类。
第三,如前文所述,容器中的组件一般会有多个,而一般会按照一定的先后顺序加载各个组件,并且先加载的组件,可以将各个类加载到缓存中,这样,后加载的类,也可以首先判断缓存中是否存在该类,如果存在,则证明该类已经在其他组件中被加载,并且直接从缓存中加载即可,这样可以实现类在不同组件之间的共享。当然,为了使得这种共享机制得到更好的应用,还可以根据组件之间的依赖关系来确定各个组件的加载优先级,并使得被依赖的组件中的类总是被优先加载。由于类一般是在具有依赖关系的组件之间才会存在共享的情况,因此,通过将被依赖的组件中的类优先加载的方式,可以使得后加载的组件中的类已经在缓存中存在的概率得到提高。由于从缓存中加载的效率要高于从外部三方容器或者隔离容器的类路径下加载,因此,可以从整体上提高类加载的效率。
基于以上各种情况,在具体实现时,对于某组件中的某个类,可以按照以下顺序来进行加载:
步骤1:判断是否为servlet或spring的相关类,如果是,则从外部三方容器加载;否则,进入步骤2;
步骤2:判断缓存中是否存在该类,如果存在,则从缓存加载,否则进入步骤3;
步骤3:尝试从该组件的类路径下(例如,图2中所示的lib目录)加载该类,如果能够完成加载,则结束对该类的加载,否则进入步骤4;
步骤4:判断是否具有从外部三方容器加载的声明信息,如果有,则从外部三方容器加载。
以上四个步骤,可以按序进行,一旦成功加载到类,那么将直接返回,不再进行后续步骤。如果四个过程都无法加载到类,那么将抛出异常。
S305:将所述需导出的类导出到所述第三方应用程序所在的运行环境中,以便在所述第三方应用程序运行时使用各个组件提供的功能。
完成类的加载后,就可以将类导出到应用程序所在的运行环境中,主要是指J2EE环境,这样,应用程序就可以使用各个组件提供的功能了。其中,具体实现时,如前文所述,为了便于在不同的组件之间进行类的共享,在进行类的导出时,可以首先将需导出的类导出到预置的缓存中,待所有组件中需导出的类都导出到缓存中后,再将这些需导出的类导出到外部三方容器的类加载器中。
总之,在本申请实施例中,提供了一个轻量级的隔离容器,该容器中的第一指定目录下存放有多个需要隔离加载的组件包,每个组件包的第二指定目录中存放有对应组件需导出的类的信息,第三指定目录中保存有组件内各个类及其依赖项的类代码。第三方开发者可以使用该隔离容器提供的API接口包开发其应用程序,并将隔离容器保存到应用程序所在的目录下,这样,在启动J2EE容器运行其应用程序时,隔离容器就可以首先被启动,并且可以解析各个组件包,以组件包中的类路径为参数,分别为各个组件创建类加载器,这样,就可以分别用各自的类加载器来加载组件内的类,以此实现组件之间的相互隔离,互不干扰。可见,本申请实施例提供的隔离容器可以帮助开发人员实现组件间的隔离,避免由于版本等出现的冲突问题,并且,无需为实现动态化而耗费过多的系统资源以及人力、时间成本。
与本申请实施例提供的Java应用中的类加载隔离方法相对应,本申请实施例还提供了一种Java应用中的类加载隔离装置,具体的,预先在隔离容器的第一指定目录下存放有多个需要隔离加载的组件包,每个组件包的第二指定目录中存放有对应组件需导出的类的信息,第三指定目录中保存有组件内各个类及其依赖项的类代码;参见图4,所述装置具体可以包括:
启动指令接收单元401,用于在所述隔离容器被下载并保存到第三方应用程序所在目录下之后,接收启动指令;所述第三方应用程序为使用所述隔离容器提供的接口包开发的应用程序;
解析单元402,用于解析所述第一指定目录下的各个组件包;
类加载器创建单元403,用于分别以各个组件的第三指定目录为类路径,为各个组件创建类加载器;
类加载单元404,用于针对各个组件,分别用各自对应的类加载器对组件内需要导出的类进行加载;
类导出单元405,用于将所述需导出的类导出到所述第三方应用程序所在的运行环境中,以便在所述第三方应用程序运行时使用各个组件提供的功能。
其中,为了实现类在不同组件之间的共享,所述类导出单元405具体可以包括:
预导出子单元,用于将所述需导出的类导出到预置的缓存中;
导出子单元,用于待所有组件中需导出的类都导出到所述缓存中后,将所述需导出的类导出到所述第三方应用程序所在的运行环境中;
这样,所述类加载单元404在利用类加载器对组件内需要导出的类进行加载时,可以首先判断所述缓存中是否存在该类,如果是,则从所述缓存中加载该类。
为了使得从缓存中加载的概率得到的提高,组件包的第三指定目录中还可以保存当前组件与其他组件之间的依赖关系信息,所述第二指定目录中还可以存放有根据所述依赖关系生成的组件优先级信息,这样,所述类加载单元404具体可以包括:
顺序确定子单元,用于按照所述优先级信息确定各个组件在加载时的先后顺序;
顺序加载子单元,用于按照所述先后顺序分别用各自对应的类加载器对组件内需导出的类进行加载。
由于类一般是在具有依赖关系的组件之间才会存在共享的情况,因此,通过将被依赖的组件中的类优先加载的方式,可以使得后加载的组件中的类已经在缓存中存在的概率得到提高。由于从缓存中加载的效率要高于从其他地方加载,因此,可以从整体上提高类加载的效率。
具体实现时,可能存在一些特殊的类,需要从外部三方容器中加载,因此,所述类加载单元404还可以包括:
第一判断子单元,用于在所述判断所述缓存中是否存在该类之前,判断该类是否为预置的需优先从外部三方容器加载的类;
第一外部加载子单元,用于如果是,则从所述外部三方容器加载该类;
触发子单元,用于否则触发所述判断所述缓存中是否存在该类的步骤。
另外,类加载单元404还可以包括:
类路径加载子单元,用于如果所述缓存中不存在该类,则从所述隔离容器的所述第三指定目录对应的路径加载该类。
另外,类加载单元404还可以包括:
第二判断子单元,用于如果从所述隔离容器的所述第三指定目录对应的路径无法加载该类,则判断对应的组件包中是否保存有关于该类的声明信息,且所述声明信息表明需要从外部三方容器中加载该类;
第二外部加载子单元,用于如果是,则从外部三方容器中加载该类。
其中,所述组件包的根目录下还存放有版本文件,所述版本文件用于标识组件包的版本,方便隔离容器管理及升级。
总之,通过本申请实施例,提供了一个轻量级的隔离容器,该容器中的第一指定目录下存放有多个需要隔离加载的组件包,每个组件包的第二指定目录中存放有对应组件需导出的类的信息,第三指定目录中保存有组件内各个类及其依赖项的类代码。第三方开发者可以使用该隔离容器提供的API接口包开发其应用程序,并将隔离容器保存到应用程序所在的目录下,这样,在启动J2EE容器运行其应用程序时,隔离容器就可以首先被启动,并且可以解析各个组件包,以组件包中的类路径为参数,分别为各个组件创建类加载器,这样,就可以分别用各自的类加载器来加载组件内的类,以此实现组件之间的相互隔离,互不干扰。可见,本申请实施例提供的隔离容器可以帮助开发人员实现组件间的隔离,避免由于版本等出现的冲突问题,并且,无需为实现动态化而耗费过多的系统资源以及人力、时间成本。
通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到本申请可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例或者实施例的某些部分所述的方法。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统或系统实施例而言,由于其基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。以上所描述的系统及系统实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
以上对本申请所提供的Java应用中的类加载隔离方法及装置,进行了详细介绍,本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其核心思想;同时,对于本领域的一般技术人员,依据本申请的思想,在具体实施方式及应用范围上均会有改变之处。综上所述,本说明书内容不应理解为对本申请的限制。

Claims (14)

1.一种Java应用中的类加载隔离方法,其特征在于,预先在隔离容器的第一指定目录下存放有多个需要隔离加载的组件包,每个组件包的第二指定目录中存放有对应组件需导出的类的信息,第三指定目录中保存有组件内各个类及其依赖项的类代码;所述方法包括:
在所述隔离容器被下载并保存到第三方应用程序所在目录下之后,接收启动指令;所述第三方应用程序为使用所述隔离容器提供的接口包开发的应用程序;
解析所述第一指定目录下的各个组件包;
分别以各个组件的第三指定目录为类路径,为各个组件创建类加载器;
针对各个组件,分别用各自对应的类加载器对组件内需要导出的类进行加载;
将所述需导出的类导出到所述第三方应用程序所在的运行环境中,以便在所述第三方应用程序运行时使用各个组件提供的功能。
2.根据权利要求1所述的方法,其特征在于,所述将所述需导出的类导出到所述第三方应用程序所在的运行环境中,包括:
将所述需导出的类导出到预置的缓存中;
待组件中需导出的类导出到所述缓存中后,将所述需导出的类导出到所述第三方应用程序所在的运行环境中;
其中,在利用类加载器对组件内需要导出的类进行加载时,判断所述缓存中是否存在该类,如果是,则从所述缓存中加载该类。
3.根据权利要求2所述的方法,其特征在于,所述组件包的第三指定目录中还保存当前组件与其他组件之间的依赖关系信息,所述第二指定目录中还存放有根据所述依赖关系生成的组件优先级信息,所述针对各个组件,分别用各自对应的类加载器对组件内需导出的类进行加载,包括:
按照所述优先级信息确定各个组件在加载时的先后顺序;
按照所述先后顺序分别用各自对应的类加载器对组件内需导出的类进行加载。
4.根据权利要求2所述的方法,其特征在于,在所述判断所述缓存中是否存在该类之前还包括:
判断该类是否为预置的需优先从外部三方容器加载的类;
如果是,则从所述外部三方容器加载该类;
否则触发所述判断所述缓存中是否存在该类的步骤。
5.根据权利要求2所述的方法,其特征在于,还包括:
如果所述缓存中不存在该类,则从所述隔离容器的所述第三指定目录对应的路径加载该类。
6.根据权利要求5所述的方法,其特征在于,还包括:
如果从所述隔离容器的所述第三指定目录对应的路径无法加载该类,则判断对应的组件包中是否保存有关于该类的声明信息,且所述声明信息表明需要从外部三方容器中加载该类;
如果是,则从外部三方容器中加载该类。
7.根据权利要求1至6任一项所述的方法,其特征在于,所述组件包的根目录下还存放有版本文件,所述版本文件用于标识组件包的版本。
8.一种Java应用中的类加载隔离装置,其特征在于,预先在隔离容器的第一指定目录下存放有多个需要隔离加载的组件包,每个组件包的第二指定目录中存放有对应组件需导出的类的信息,第三指定目录中保存有组件内各个类及其依赖项的类代码;所述装置包括:
启动指令接收单元,用于在所述隔离容器被下载并保存到第三方应用程序所在目录下之后,接收启动指令;所述第三方应用程序为,使用所述隔离容器提供的接口包开发的应用程序;
解析单元,用于解析所述第一指定目录下的各个组件包;
类加载器创建单元,用于分别以各个组件的第三指定目录为类路径,为各个组件创建类加载器;
类加载单元,用于针对各个组件,分别用各自对应的类加载器对组件内需要导出的类进行加载;
类导出单元,用于将所述需导出的类导出到所述第三方应用程序所在的运行环境中,以便在所述第三方应用程序运行时使用各个组件提供的功能。
9.根据权利要求8所述的装置,其特征在于,所述类导出单元,包括:
预导出子单元,用于将所述需导出的类导出到预置的缓存中;
导出子单元,用于待组件中需导出的类导出到所述缓存中后,将所述需导出的类导出到所述第三方应用程序所在的运行环境中;
其中,所述类加载单元在利用类加载器对组件内需要导出的类进行加载时,判断所述缓存中是否存在该类,如果是,则从所述缓存中加载该类。
10.根据权利要求9所述的装置,其特征在于,所述组件包的第三指定目录中还保存当前组件与其他组件之间的依赖关系信息,所述第二指定目录中还存放有根据所述依赖关系生成的组件优先级信息,所述类加载单元包括:
顺序确定子单元,用于按照所述优先级信息确定各个组件在加载时的先后顺序;
顺序加载子单元,用于按照所述先后顺序分别用各自对应的类加载器对组件内需导出的类进行加载。
11.根据权利要求10所述的装置,其特征在于,所述类加载单元还包括:
第一判断子单元,用于在所述判断所述缓存中是否存在该类之前,判断该类是否为预置的需优先从外部三方容器加载的类;
第一外部加载子单元,用于如果是,则从所述外部三方容器加载该类;
触发子单元,用于否则触发所述判断所述缓存中是否存在该类的步骤。
12.根据权利要求10所述的装置,其特征在于,所述类加载单元还包括:
类路径加载子单元,用于如果所述缓存中不存在该类,则从所述隔离容器的所述第三指定目录对应的路径加载该类。
13.根据权利要求12所述的装置,其特征在于,所述类加载单元还包括:
第二判断子单元,用于如果从所述隔离容器的所述第三指定目录对应的路径无法加载该类,则判断对应的组件包中是否保存有关于该类的声明信息,且所述声明信息表明需要从外部三方容器中加载该类;
第二外部加载子单元,用于如果是,则从外部三方容器中加载该类。
14.根据权利要求8至13任一项所述的装置,其特征在于,所述组件包的根目录下还存放有版本文件,所述版本文件用于标识组件包的版本。
CN201410469375.2A 2014-09-15 2014-09-15 Java应用中的类加载隔离方法及装置 Active CN105404524B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201410469375.2A CN105404524B (zh) 2014-09-15 2014-09-15 Java应用中的类加载隔离方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201410469375.2A CN105404524B (zh) 2014-09-15 2014-09-15 Java应用中的类加载隔离方法及装置

Publications (2)

Publication Number Publication Date
CN105404524A true CN105404524A (zh) 2016-03-16
CN105404524B CN105404524B (zh) 2019-01-15

Family

ID=55470026

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201410469375.2A Active CN105404524B (zh) 2014-09-15 2014-09-15 Java应用中的类加载隔离方法及装置

Country Status (1)

Country Link
CN (1) CN105404524B (zh)

Cited By (21)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106815056A (zh) * 2017-02-17 2017-06-09 银联国际有限公司 基于jcl框架的应用热部署方法和装置
CN107391202A (zh) * 2017-07-27 2017-11-24 北京奇虎科技有限公司 一种插件前期绑定方法、装置和电子设备
CN108089873A (zh) * 2017-12-21 2018-05-29 福建天泉教育科技有限公司 一种应用组件即时更新的方法及终端
CN108279940A (zh) * 2016-12-30 2018-07-13 华为软件技术有限公司 一种web容器中的模块加载方法和装置
CN108319482A (zh) * 2018-02-11 2018-07-24 北京恒华伟业科技股份有限公司 一种JavaWeb模块管理方法及装置
CN108334374A (zh) * 2017-01-18 2018-07-27 北京京东尚科信息技术有限公司 组件动态加载与执行的方法和装置
CN108595246A (zh) * 2018-03-15 2018-09-28 阿里巴巴集团控股有限公司 一种运行应用的方法、装置及设备
CN110210188A (zh) * 2019-06-04 2019-09-06 武汉神算云信息科技有限责任公司 Spring框架下代码加密方法、装置、设备及存储介质
CN110209427A (zh) * 2018-02-28 2019-09-06 阿里巴巴集团控股有限公司 应用系统及其启动方法、电子设备、存储介质
CN110968340A (zh) * 2018-09-29 2020-04-07 京东数字科技控股有限公司 一种实现多版本依赖隔离的方法和装置
CN112052044A (zh) * 2020-08-14 2020-12-08 深圳市欢太科技有限公司 应用加载方法、装置、存储介质和电子设备
CN112148378A (zh) * 2020-08-25 2020-12-29 新华三大数据技术有限公司 一种冲突类的隔离方法及装置
CN112219188A (zh) * 2019-09-26 2021-01-12 深圳市大疆创新科技有限公司 显示界面控制方法、通信控制方法、系统及控制终端
CN112328329A (zh) * 2020-11-25 2021-02-05 深圳市欢太科技有限公司 数据处理方法、装置、电子设备及存储介质
CN112445543A (zh) * 2020-11-26 2021-03-05 杭州趣链科技有限公司 智能合约的类调用方法、装置及电子设备
CN112631685A (zh) * 2020-12-30 2021-04-09 中国农业银行股份有限公司 一种类加载方法及装置
CN112764827A (zh) * 2020-12-31 2021-05-07 重庆广播电视大学重庆工商职业学院 一种具有安全验证的Java类热加载方法
CN113391852A (zh) * 2021-06-07 2021-09-14 广州通达汽车电气股份有限公司 一种平台软件扩展方法及装置
CN114995962A (zh) * 2022-08-08 2022-09-02 浩鲸云计算科技股份有限公司 一种通过初始化容器来加载应急补丁的方法
CN115543546A (zh) * 2022-11-25 2022-12-30 金现代信息产业股份有限公司 一种基于Spring的模块热部署方法及系统
CN116594717A (zh) * 2023-05-24 2023-08-15 上海汉朔信息科技有限公司 一种类加载隔离方法、装置、设备及介质

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
EP1830265A2 (en) * 2006-02-23 2007-09-05 Samsung Electronics Co., Ltd. Method of providing partially isolated execution environment for multiple applications and digital information apparatus using the same
CN101105757A (zh) * 2007-08-31 2008-01-16 金蝶软件(中国)有限公司 一种类装载隔离的方法及一种类装载隔离的装置
CN103116510A (zh) * 2013-01-21 2013-05-22 北京东方通科技股份有限公司 基于osgi的类加载隔离系统和方法

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
EP1830265A2 (en) * 2006-02-23 2007-09-05 Samsung Electronics Co., Ltd. Method of providing partially isolated execution environment for multiple applications and digital information apparatus using the same
CN101105757A (zh) * 2007-08-31 2008-01-16 金蝶软件(中国)有限公司 一种类装载隔离的方法及一种类装载隔离的装置
CN103116510A (zh) * 2013-01-21 2013-05-22 北京东方通科技股份有限公司 基于osgi的类加载隔离系统和方法

Cited By (28)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108279940A (zh) * 2016-12-30 2018-07-13 华为软件技术有限公司 一种web容器中的模块加载方法和装置
CN108334374A (zh) * 2017-01-18 2018-07-27 北京京东尚科信息技术有限公司 组件动态加载与执行的方法和装置
CN106815056A (zh) * 2017-02-17 2017-06-09 银联国际有限公司 基于jcl框架的应用热部署方法和装置
CN106815056B (zh) * 2017-02-17 2020-09-08 银联国际有限公司 基于jcl框架的应用热部署方法和装置
CN107391202B (zh) * 2017-07-27 2020-12-08 北京奇虎科技有限公司 一种插件前期绑定方法、装置和电子设备
CN107391202A (zh) * 2017-07-27 2017-11-24 北京奇虎科技有限公司 一种插件前期绑定方法、装置和电子设备
CN108089873A (zh) * 2017-12-21 2018-05-29 福建天泉教育科技有限公司 一种应用组件即时更新的方法及终端
CN108319482A (zh) * 2018-02-11 2018-07-24 北京恒华伟业科技股份有限公司 一种JavaWeb模块管理方法及装置
CN108319482B (zh) * 2018-02-11 2021-07-06 北京恒华伟业科技股份有限公司 一种JavaWeb模块管理方法及装置
CN110209427A (zh) * 2018-02-28 2019-09-06 阿里巴巴集团控股有限公司 应用系统及其启动方法、电子设备、存储介质
CN110209427B (zh) * 2018-02-28 2022-07-15 阿里巴巴集团控股有限公司 应用系统及其启动方法、电子设备、存储介质
CN108595246A (zh) * 2018-03-15 2018-09-28 阿里巴巴集团控股有限公司 一种运行应用的方法、装置及设备
CN110968340A (zh) * 2018-09-29 2020-04-07 京东数字科技控股有限公司 一种实现多版本依赖隔离的方法和装置
CN110210188A (zh) * 2019-06-04 2019-09-06 武汉神算云信息科技有限责任公司 Spring框架下代码加密方法、装置、设备及存储介质
CN112219188A (zh) * 2019-09-26 2021-01-12 深圳市大疆创新科技有限公司 显示界面控制方法、通信控制方法、系统及控制终端
CN112052044A (zh) * 2020-08-14 2020-12-08 深圳市欢太科技有限公司 应用加载方法、装置、存储介质和电子设备
CN112148378A (zh) * 2020-08-25 2020-12-29 新华三大数据技术有限公司 一种冲突类的隔离方法及装置
CN112328329A (zh) * 2020-11-25 2021-02-05 深圳市欢太科技有限公司 数据处理方法、装置、电子设备及存储介质
CN112445543A (zh) * 2020-11-26 2021-03-05 杭州趣链科技有限公司 智能合约的类调用方法、装置及电子设备
CN112631685B (zh) * 2020-12-30 2024-04-12 中国农业银行股份有限公司 一种类加载方法及装置
CN112631685A (zh) * 2020-12-30 2021-04-09 中国农业银行股份有限公司 一种类加载方法及装置
CN112764827A (zh) * 2020-12-31 2021-05-07 重庆广播电视大学重庆工商职业学院 一种具有安全验证的Java类热加载方法
CN113391852A (zh) * 2021-06-07 2021-09-14 广州通达汽车电气股份有限公司 一种平台软件扩展方法及装置
CN113391852B (zh) * 2021-06-07 2024-06-04 广州通达汽车电气股份有限公司 一种平台软件扩展方法及装置
CN114995962A (zh) * 2022-08-08 2022-09-02 浩鲸云计算科技股份有限公司 一种通过初始化容器来加载应急补丁的方法
CN115543546A (zh) * 2022-11-25 2022-12-30 金现代信息产业股份有限公司 一种基于Spring的模块热部署方法及系统
CN116594717A (zh) * 2023-05-24 2023-08-15 上海汉朔信息科技有限公司 一种类加载隔离方法、装置、设备及介质
CN116594717B (zh) * 2023-05-24 2024-03-08 上海汉朔信息科技有限公司 一种类加载隔离方法、装置、设备及介质

Also Published As

Publication number Publication date
CN105404524B (zh) 2019-01-15

Similar Documents

Publication Publication Date Title
CN105404524A (zh) Java应用中的类加载隔离方法及装置
CN107147704B (zh) 一种面向区块链的通用服务中间件系统
CN110912734B (zh) 云管理平台实现容器应用多维度灰度发布方法及装置
CN102981915B (zh) 一种应用程序间通信方法及装置
CN102013994B (zh) 网管中实现网元版本兼容的方法、终端及系统
US10866841B2 (en) Communication system and method for accessing and deploying temporary microservices on a heterogeneous platform
CN105677302A (zh) 一种应用程序模块化开发方法以及装置
CN105159771A (zh) 处理应用间链式启动的方法及装置
US20110258620A1 (en) Method and Apparatus for Making a BPM Application Available to Multiple Tenants
CN108809683B (zh) 部署云应用系统的方法及装置
CN103034546B (zh) iOS系统中应用程序间通信的方法及装置
CN104572054A (zh) 一种能力调用方法和设备
CN113626128B (zh) 视听媒体微服务第三方模块接入方法、系统、电子设备
CN112860282A (zh) 集群插件的升级方法、装置和服务器
CN111651169B (zh) 基于web容器的区块链智能合约运行方法及系统
CN107861742A (zh) 一种程序的运行方法和终端设备
CN104636122A (zh) 一种能力组件的共享方法和设备
EP2897053B1 (en) Device management method and apparatus
CN115658237A (zh) 一种容器应用自动部署方法、设备、装置、设备及介质
CN107918543B (zh) 安装包生成的方法、装置、计算机设备和存储介质
CN110119279B (zh) 一种应用及其升级的方法和装置
CN103530155A (zh) 一种用于应用程序的安装方法及装置
CN106325923A (zh) 功能插件的管理方法及装置
CN114047933A (zh) 多开Android应用的方法、装置、设备和介质
CN111988383B (zh) 一种校验应用开启微服务治理条件的方法及装置

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant
TR01 Transfer of patent right
TR01 Transfer of patent right

Effective date of registration: 20211117

Address after: Room 554, floor 5, building 3, No. 969, Wenyi West Road, Wuchang Street, Yuhang District, Hangzhou City, Zhejiang Province

Patentee after: TAOBAO (CHINA) SOFTWARE CO.,LTD.

Address before: Box 847, four, Grand Cayman capital, Cayman Islands, UK

Patentee before: ALIBABA GROUP HOLDING Ltd.