US6748396B2 - Independent class loader for dynamic class loading - Google Patents

Independent class loader for dynamic class loading Download PDF

Info

Publication number
US6748396B2
US6748396B2 US09/872,963 US87296301A US6748396B2 US 6748396 B2 US6748396 B2 US 6748396B2 US 87296301 A US87296301 A US 87296301A US 6748396 B2 US6748396 B2 US 6748396B2
Authority
US
United States
Prior art keywords
class
components
loading
prerequisite
component
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.)
Expired - Lifetime, expires
Application number
US09/872,963
Other versions
US20020184226A1 (en
Inventor
Vladimir Klicnik
Jeffrey A. McAffer
John D. Wiegand
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.)
International Business Machines Corp
Original Assignee
International Business Machines Corp
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 International Business Machines Corp filed Critical International Business Machines Corp
Priority to US09/872,963 priority Critical patent/US6748396B2/en
Assigned to INTERNATIONAL BUSINESS MACHINES CORPORATION reassignment INTERNATIONAL BUSINESS MACHINES CORPORATION ASSIGNMENT OF ASSIGNORS INTEREST (SEE DOCUMENT FOR DETAILS). Assignors: MCAFFER, JEFFREY A., WIEGAND, JOHN D., KLICNIK, VLADIMIR
Publication of US20020184226A1 publication Critical patent/US20020184226A1/en
Application granted granted Critical
Publication of US6748396B2 publication Critical patent/US6748396B2/en
Adjusted expiration legal-status Critical
Expired - Lifetime legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/445Program loading or initiating
    • G06F9/44521Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
    • G06F9/44526Plug-ins; Add-ons
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/445Program loading or initiating
    • G06F9/44552Conflict resolution, i.e. enabling coexistence of conflicting executables
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y10TECHNICAL SUBJECTS COVERED BY FORMER USPC
    • Y10STECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y10S707/00Data processing: database and file management or data structures
    • Y10S707/99941Database schema or data structure
    • Y10S707/99944Object-oriented database structure
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y10TECHNICAL SUBJECTS COVERED BY FORMER USPC
    • Y10STECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y10S707/00Data processing: database and file management or data structures
    • Y10S707/99941Database schema or data structure
    • Y10S707/99944Object-oriented database structure
    • Y10S707/99945Object-oriented database structure processing

Definitions

  • the present invention relates to computer programming, and deals more particularly with methods, systems, and computer program products for improving the manner in which classes are dynamically loaded during program execution.
  • JavaTM is a trademark of Sun Microsystems, Inc.
  • the class loader is responsible for searching for a particular class, and making that class available to the run-time system if found. Once loaded, each Java class object retains a reference to the class loader with which it was loaded.
  • Java class loading is based on a delegation model, wherein a class loader first delegates the class loading responsibility to its immediate parent class loader.
  • the initial class loader is used for the loading operation. Inheritance in the class loader chain is under control of the programmer, who may specify an explicit parent relationship when creating a new class loader. Each time a class loader is created, it is associated with one or more locations (such as file tree structures, archives, etc.) that it will be searching for classes.
  • FIGS. 1A-1C illustrate this prior art dynamic class loading technique with a simple example.
  • Java code is encountered while running code in the class named “Foo”:
  • FIG. 1A illustrates syntax which may be used for this purpose, wherein a variable “C” is assigned to the result of invoking the “getClassLoader” method on the Foo class.
  • the next step is to use that class loader to load the class Bar. Syntax which may be used for this purpose is shown at 105 , wherein the method “loadClass” on class loader C is invoked with “Bar” as a parameter.
  • the flowchart in FIG. 1C illustrates the logic with which this loadClass method operates.
  • the class loader used (or one of its ancestors) must be able to load all of the class' superclasses and interfaces.
  • that loader must be a parent somewhere in the ancestor chain of the loader used to load the class (Bar, in this example).
  • This class loader therefore requests its parent class loader “CL2” 120 to load class Bar, and so on until either finding an already-loaded Bar or until no more ancestors remain to be checked.
  • the test in Block 150 has a positive result, and the located class is returned by Block 165 .
  • the test in Block 150 has a negative result and control reaches Block 155 .
  • the class path 120 for class Bar is determined (using the CLASSPATH variable), and a check is made (Block 160 ) to see if Bar can be located using that class path. If so, then the located class is loaded (BLOCK 170 ) and immediately initialized; otherwise, an error is returned (Block 175 ).
  • control returns to Block 165 to return the loaded class to the caller.
  • This dynamic loading technique is well known in the computer programming art, and code to implement the class loader process is commonly provided as part of Java development toolkits.
  • components such as plug-ins are relatively “heavyweight” entities in that they require a considerable amount of resources (i.e. storage) to be allocated, take time to be initialized, and will often trigger the loading of many classes once initialized (which consumes more resources and takes additional time).
  • resources i.e. storage
  • This approach results in an inefficient use of resources in many cases, and increases the start-up time and the memory footprint of the program in which the plug-in is contained. For example, it may happen that some classes are not actually accessed until a relatively long time after activating the plug-in whose initialization triggered loading of the class, and some may never be accessed.
  • OSGi bundles Open Services Gateway Initiative bundles
  • OSGi bundles do not address the limitations of dynamic class loaders which have been discussed.
  • OSGi bundles continue to rely on parent relationships during loading, and initialize upon start-up as well.
  • OSGi bundles refers to components which adhere to the OSGi Service Gateway Specification.
  • OSGi bundles are archive files containing class files and resources.
  • a bundle's manifest file identifies the bundle's contents and also the packages and services which are imported and exported by that bundle. More information on this specification may be found on the Internet at location http://www.osgi.org/about/spec1.html.
  • An object of the present invention is to provide an improved technique for dynamically loading independent code components.
  • Yet another object of the present invention is to provide an improved technique for loading components which are not located within a single functional dependence hierarchy chain.
  • Another object of the present invention is to provide a technique for dynamically loading components which supports complex prerequisites.
  • Still another object of the present invention is to provide a technique for dynamically loading components which allows explicitly specifying one or more prerequisite components.
  • a further object of the present invention is to provide a technique for dynamically loading components which delays initialization and loading of components until the component is needed.
  • this technique comprises: providing a specification of zero or more prerequisite components for components to be loaded; providing distinct class loaders associated with the components to be loaded; and attempting to load a class from a particular component using the provided class loader associated with that particular component, wherein the provided class loader may invoke class loaders associated with one or more of the prerequisite components if necessary.
  • this technique may further comprise: providing multiple versions of a selected component to be loaded; loading one or more classes from two or more of the provided versions, wherein classes having duplicate names may therefore be loaded; and automatically distinguishing the classes having duplicate names by virtue of their distinct class loaders.
  • the specification of zero or more prerequisite components may further specify whether components re-export classes of their prerequisite components, and/or which classes of a particular component are to be exposed to other components for which the particular component is a prerequisite component.
  • the technique may comprise: providing distinct class loaders associated with the components to be loaded; monitoring attempts to use the distinct class loaders; and delaying activation of a particular component until the monitoring detects that the class loader associated with that particular component is loading its first class.
  • this aspect may be combined with the above-described aspect.
  • FIG. 1 (comprising FIGS. 1A-1C) illustrates the technique with which Java classes are dynamically loaded, according to the prior art
  • FIG. 2 illustrates an example of complex prerequisite relationships among components
  • FIG. 3 provides a set of sample component definitions, illustrating information used by preferred embodiments of the present invention
  • FIG. 4 (comprising FIGS. 4A-4C provides a flowchart setting forth logic which may be used to implement improved dynamic class loading, according to preferred embodiments of the present invention
  • FIG. 5 illustrates sample search orders in which component loading may occur when using the example prerequisite relationships in FIG. 2 and the sample component definitions in FIG. 3, according to preferred embodiments of the present invention.
  • FIG. 6 provides a flowchart illustrating logic which may be used to implement delayed component activation, according to preferred embodiments of the present invention.
  • the present invention defines improved techniques for dynamically loading components which have prerequisite relationships more complex than the simple single inheritance chains which are supported with prior art dynamic class loading techniques. Multiple prerequisites are supported in this improved technique, and in preferred embodiments, an arbitrary number of prerequisites may be explicitly specified for a component. Furthermore, techniques are disclosed which enable delaying the loading and initialization of components until such time as the component is actually needed, thereby improving overall efficiency of the system. Preferably, implementations of the present invention provide support for both the multiple prerequisite relationships and the delayed initialization, although implementations providing support for either technique individually provide advantages over the prior art and such implementations are within the scope of the present invention.
  • plug-in describes a self-contained software component that modifies (i.e. adds or changes) the function available in a particular computing environment.
  • APIs application programming interfaces
  • each plug-in must be provided with a dedicated class loader when using the present invention.
  • the immediate class path of this class loader contains only the code (i.e. the jars and the directories) for the related plug-in. Since the code in a plug-in may refer to code provided in other plug-ins, a complex prerequisite system of functional dependencies among the plug-ins may be formed.
  • FIG. 2 A relatively simple example is depicted in FIG. 2 .
  • a plug-in named “Example” 230 contains the class Foo 235 .
  • the Example plug-in is dependent on code provided by plug-in P 225 . (The direction of the arrows in FIG.
  • Plug-in P in this example, is dependent on plug-in R 205 , plug-in T 215 , and plug-in Q 220 .
  • Plug-in Q is dependent on plug-in S 210 , which in turn is dependent on plug-in R 205 .
  • the graph in this prerequisite system 200 does not adhere to the single inheritance model supported by the prior art dynamic class loaders, which has been described with reference to the tree structure 110 in FIG. 1 B. (It should be noted that the terms “plug-in” and “component” are used interchangeably herein to describe the features of the present invention.)
  • a particular plug-in specifies its prerequisites explicitly.
  • plug-in explicitly states that it requires plug-in Q if P needs to refer to classes in Q during execution.
  • FIG. 3 illustrates an example 300 of specifying this information, where the relationships in the prerequisite system depicted in FIG. 2 have been specified for each of the six plug-ins which were illustrated therein (see elements 330 , 340 , 350 , 360 , 370 , and 380 ), as well as forte “Parent” 310 and “Platform” 320 plug-ins. (All plug-ins implicitly have the Platform as a prerequisite and all class loaders have Parent as their parent.) So, for example, the specification 340 for plug-in P indicates that P is dependent upon (i.e. has as prerequisites) code in R, Q, and T. (As will be obvious, the information illustrated in FIG. 3 is merely representative of one manner in which the information used by the present invention may be specified.)
  • the class path for plug-in Q is logically extended to include not only the classes in its jars and directories but also those classes provided by plug-in S. Information used for creating this logical extension is taken from the syntax shown in FIG. 3 .
  • the arrows determine what classes any one component can “see” (i.e, can make direct programmatic reference to, or make load requests for).
  • a component can therefore see classes from components that are one hop away in the graph; classes that are more than one hop away are not directly visible. This is often insufficient.
  • the classes of P are more than one hop away from Foo. Therefore, it becomes necessary to export classes to the downstream (i.e. dependent) components, enabling classes to be visible to components more than one hop away.
  • plug-in P specifies that it exports the classes of plug-in Q but does not export those of plug-in R or T (see element 340 ).
  • the transitive closure which logically extends plug-in P's class path brings in the classes of plug-ins R, Q, and T.
  • P does not re-export T's classes
  • P's dependents are not directly exposed to them via P.
  • the Example plug-in will not see T's classes at all. It will see classes from R because P exports Q, Q exports S, and S exports R.
  • the set of prerequisites for a particular plug-in may therefore form an arbitrarily complex class path for that plug-in.
  • each visible class loader will be searched (if necessary, until the desired class is located). For example, in searching for a class using plug-in P's class loader, the class path of each class loader except that of plug-in Example will be considered.
  • a plug-in's class loader is used to load all of its classes, a system without filtering would expose all of a plug-in's classes for use by dependent plug-ins. While this is desirable in the case of API classes, private implementation details are preferably not exposed by default.
  • a plug-in's specification may include a filtering expression or parameter, referred to herein as the “expose” parameter, to explicitly detail the classes a class loader will load on behalf of class loaders from other plug-ins. Examples are illustrated in FIG. 3 .
  • the value of the expose parameter may be expressed using wildcards, if desired in a particular situation.
  • the expose parameter for plug-in P's jar file is shown as “*.api. *”, indicating that any API classes in this jar file should be exposed while the expose parameter for the jar file named “internal.jar” is shown as “” to indicate that no classes in this jar file should be exposed.
  • the expose parameter for “Q.jar” is shown at 350 as“*”, indicating that all classes in this jar file should be exposed.
  • class loaders implemented according to preferred embodiments of the present invention invoke the logic in FIG. 4 .
  • a Boolean variable referred to herein as “checkParents” is set to TRUE.
  • checkparents flag is an optional optimization used by preferred embodiments, where all plug-in class loaders have the same Java parent class loader.
  • the Java parent chain should be searched for each of the prerequisites, if necessary, until locating the desired class; however, when it is known that all prerequisite class loaders have the same Java parent, as in preferred embodiments, then it is only necessary to follow the Java parent chain once.
  • Block 400 tests to see if this loader has already been visited. If so, then it is net productive to search this chain again, so the searching stops as indicated by Block 405 and the processing for the current invocation (which may be recursive) of FIG. 4 ends. (Note that a side effect of this test of “already visited” is that any loops that may exist in the prerequisite graph, such as A depends on B, B depends on C, C depends on A, will be broken.) Otherwise, Block 410 checks to see if the desired class is in this class loader's cache. When this test has a positive result, Block 415 checks to see if the class is being exposed (when the filtering aspect has been implemented).
  • Block 415 the test in Block 415 has a negative result, however, the class is not to be exposed by this class loader, and control therefore transfers to Block 425 as if the class was not found.
  • Block 425 tests the checkParents flag to see if the parent(s) of this class need to be checked. If so, then a recursive invocation is initiated at Block 430 . When the recursive call completes, processing continues at Black 435 which tests to see if the recursive invocation located the class. If it did, the value is returned (Block 440 ), and the processing of FIG. 4 is complete for the current class loader. If the class was not found in the class loader's parents (i.e. a negative result in Block 435 ), on the other hand, or if the parent parents were not checked (i.e. a negative result in Block 425 ), then the class loader's class path is used to see if the class may be found there (Block 445 ) by searching the jars and file directories associated with that class path.
  • Block 455 a test is made (Block 455 ) to see if the class is being exposed, in a similar manner to that described above with reference to Block 415 . If so, then the class has been found, and the value is returned (Block 460 ). If the class is not exposed (i.e. it is being filtered out), however, control transfers from Block 455 to Block 465 as if the class was not found.
  • the platform's class loader is checked to see if the requested class may be found in that manner by searching the jars and file directories associated with the platform's class path. Note that the platform's parents are not to be checked, however, and thus checkparents is set to FALSE. If the class was found with the platform class loader, the test in Block 470 has a positive result and the located value is returned (Block 475 ). Otherwise, this loader is added to the list of those loaders already visited (Block 480 ), and Block 485 invokes a recursive process of checking the class loaders of all prerequisite classes. When the optional export aspect is implemented, this search is limited to those prerequisite classes which have the export parameter set to TRUE.
  • Block 490 If the class is found in a prerequisite (Block 490 ), then the value is returned (Block 495 ). Otherwise, control reaches Block 499 because after searching all prerequisites, there are no more places to search for the requested class, and an error indicator is preferably returned.
  • a platform class loader is an optimization used by preferred embodiments.
  • This class loader is designed as a prerequisite class loader that is available as an ancestor of all plug-in loaders, without the need to explicitly declare this relationship. By convention, it is the loader that is searched first after a loader fails (at Block 445 ) to find a class in its own jar(s). Because the platform class loader has no other prerequisites itself, it is not necessary to recursively invoke the processing of FIG. 4 at Block 465 .
  • FIG. 5 several example searches are shown which are based on the prerequisite structure in FIG. 2 and the plug-in specifications in FIG. 3 .
  • the class Foo is defined in the plug-in Example, as shown in FIG. 2, and that the syntax “new Bar ( )” is evaluated in a method of class Foo.
  • class Bar is located in the Parent plug-in.
  • the search proceeds by first checking the cache of the class loader for the Example plug-in. Not finding Bar there, the class loader for Parent is checked next; Bar is found there, and the search ends successfully.
  • Example plug-in Bar is actually defined in the Example plug-in. Again, the cache is checked first, and the Bar is not found there so the Parent plug-in is checked next. Not finding Bar there, the Example plug-in is checked, and Bar is successfully located.
  • Example 530 is similar, except that the search fails in the Example plug-in and thus continues on to the Platform plug-in, where Bar is defined.
  • Examples 540 through 570 illustrate scenarios where Bar is found in a plug-in within the prerequisite graph for the Example plug-in.
  • example 540 indicates that plug-in P is searched after failing to find Bar in the Platform plug-in.
  • example 550 indicates that plug-in P is again searched after failing to find Bar in the Platform plug-in; however, not finding Bar in this prerequisite of Example, the search continues.
  • the next available prerequisite in the extended class path is plug-in Q, where Bar is defined, and the search therefore ends successfully in this example.
  • Example 560 illustrates a scenario in which Bar is defined in plug-in R, and is found there (even though R was skipped when traversing from plug-in P).
  • Q's prerequisite S is checked next, also unsuccessfully.
  • the prerequisite R is reached when traversing from plug-in S, because the export setting is true in this case (see element 370 of FIG. 3 ).
  • R exposes class Bar (see element 360 )
  • Example 570 covers the case where Bar is defined in plug-in S, and therefore proceeds as already described for example 560 , up until locating Bar in S.
  • Example 580 covers the case where Bar is not defined and is not available from any of the class loaders in the prerequisite graph.
  • the prerequisite search in preferred embodiments is depth-first. That is, a prerequisite's entire load sequence, including its prerequisites, is completed before moving on to the next prerequisite (see Block 485 of FIG. 4 ).
  • FIG. 6 illustrates logic which may be used to enable delaying the initialization of plug-ins and their classes until such time as a class in that plug-in is needed. Because each plug-in has its own class loader, as stated earlier, class loading can be used as a trigger for plug-in activation. That is, plug-ins need not be activated until they are actually used/needed. According to the present invention, a plug-in is activated by watching activity in its associated class loader. As soon as a class loader for a particular plug-in is preparing to load its first class, the associated plug-in is activated.
  • this aspect of the present invention essentially expresses the reference relationship through indirect means wherein the logical extension concept registers the reference information as a symbolic descriptor, thereby delaying the loading of the components until a class access is detected.
  • Indirect descriptors are used in preferred embodiments for this registration, rather than direct programmatic references.
  • Block 610 performs a “pit-load” check to see if it is likely that the requested class will be found in this class loader. Note that the class is not actually loaded at this point. Instead, in preferred embodiments this pit-load process comprises checking to see if there is a file with the desired name (when the class is being loaded from a file store). If no such file is found (i.e. Block 610 has a negative result), then the loading process must be attempted with another class loader (unless there are no other class loaders available), as indicated by Block 625 . Preferably, the technique which has been described above is used to select the next class loader from the logically extended class path.
  • Block 620 then performs an activation of the plug-in's life cycle code, in order to initialize the plug-in's run-time state.
  • the actual work to be done in Block 620 depends on the plug-in itself For example, some plug-ins do nothing at this point, others might read previously-stored state data from disk and restore this state, others might open database connections, and so forth.
  • the plug-in must be put in a consistent, functional state so that the classes it loads can be assured that everything is up and running.
  • Block 625 After performing the activation in Block 620 , Block 625 loads the class as normal.
  • This technique guarantees that plug-ins are always activated and consistent before their classes are loaded, and that plug-ins are only activated if the function they provide is actually required. This in turn improves scalability (only the function that is needed is loaded, saving resources), ensures consistency (classes can rely on their plug-ins always being initialized), and enhances isolation (classes for a given plug-in are always managed by that plug-in).
  • the logic depicted in FIG. 6 is preferably merged into the logic of FIGS. 4A through 4C when a class has been successfully located (including a successful result to the exposure tests, when implemented).
  • the test in Block 610 and the logic in Block 625 may be omitted.
  • plug-in A may specify as its prerequisites that it needs version 2 of plug-in B (e.g. plug-in “B2.0”)
  • plug-in C may specify that it needs version I of plug-in B (e.g. plug-in “B1.0”).
  • class uniqueness in Java programming is derived from the fully-qualified class name plus the class loader used to load the class, and the different versions (in this example, B2.0 and B1.0) are actually different plug-ins, each version's classes are loaded by a different loader. Therefore, even if the classes in the different versions have identical names (and in fact, identical code), they will automatically be treated as different classes and so can automatically co-exist.
  • embodiments of the present invention may be provided as methods, systems, or computer program products. Accordingly, the present invention may take the form of an entirely hardware embodiment, an entirely software embodiment or an embodiment combining software and hardware aspects. Furthermore, the present invention may take the form of a computer program product which is embodied on one or more computer-usable storage media (including, but not limited to, disk storage, CD-ROM, optical storage, and so forth) having computer-usable program code embodied therein.
  • computer-usable storage media including, but not limited to, disk storage, CD-ROM, optical storage, and so forth
  • These computer program instructions may also be stored in a computer-readable memory that can direct a computer or other programmable data processing apparatus to function in a particular manner, such that the instructions stored in the computer-readable memory produce an article of manufacture including instruction means which implement the function specified in the flow diagram flow or flows and/or block diagram block or blocks.
  • the computer program instructions may also be loaded onto a computer or other programmable data processing apparatus to cause a series of operational steps to be performed on the computer or other programmable apparatus to produce a computer implemented process such that the instructions which execute on the computer or other programmable apparatus provide steps for implementing the functions specified in the flow diagram flow or flows and/or block diagram block or blocks.

Abstract

Improved techniques are defined for dynamically loading components which have prerequisite relationships more complex than the simple single inheritance chains which are supported with prior art dynamic class loading techniques. Multiple prerequisites are supported in this improved technique, and in preferred embodiments, an arbitrary number of prerequisites may be explicitly specified for a component. Furthermore, techniques are disclosed which enable delaying the loading and initialization of components until such time as a class in the component is actually needed, thereby improving overall efficiency of the system. Optional filtering and export aspects may also be supported to selectively expose classes for use by dependent components and to enable a component to opt out of re-exporting the classes of its prerequisites, respectively.

Description

BACKGROUND OF THE INVENTION
1. Field of the Invention
The present invention relates to computer programming, and deals more particularly with methods, systems, and computer program products for improving the manner in which classes are dynamically loaded during program execution.
2. Description of the Related Art
There are a number of approaches to dynamically loading interdependent components of executable code (such as plug-ins, bundles, etc.) in modern programming languages. In the Java™ programming language, classes are dynamically loaded using a class loader as an application program executes. (“Java” is a trademark of Sun Microsystems, Inc.) The class loader is responsible for searching for a particular class, and making that class available to the run-time system if found. Once loaded, each Java class object retains a reference to the class loader with which it was loaded. Java class loading is based on a delegation model, wherein a class loader first delegates the class loading responsibility to its immediate parent class loader. If neither that parent class loader nor any of its ancestors, in turn, are able to locate the class, then the initial class loader is used for the loading operation. Inheritance in the class loader chain is under control of the programmer, who may specify an explicit parent relationship when creating a new class loader. Each time a class loader is created, it is associated with one or more locations (such as file tree structures, archives, etc.) that it will be searching for classes.
FIGS. 1A-1C illustrate this prior art dynamic class loading technique with a simple example. Suppose that the following Java code is encountered while running code in the class named “Foo”:
new Bar( )
That is, a new instance of the class named “Bar” is to be instantiated. Using standard Java class loading, it is first necessary to determine the class loader used to load Foo. The Java code element 100 in FIG. 1A illustrates syntax which may be used for this purpose, wherein a variable “C” is assigned to the result of invoking the “getClassLoader” method on the Foo class. The next step is to use that class loader to load the class Bar. Syntax which may be used for this purpose is shown at 105, wherein the method “loadClass” on class loader C is invoked with “Bar” as a parameter. The flowchart in FIG. 1C illustrates the logic with which this loadClass method operates. First, a check is made to see if Bar is already in this loader's cache (Block 140). If so, then it is riot necessary to reload the class, and the located value (i.e. the class) is returned (Block 165). Otherwise, a recursive process begins (Block 145) where the parent of this class loader is asked to load the requested class.
For a class to be successfully loaded, the class loader used (or one of its ancestors) must be able to load all of the class' superclasses and interfaces. As a result, if a superclass is loaded by a different loader, that loader must be a parent somewhere in the ancestor chain of the loader used to load the class (Bar, in this example). For example, with reference to the class loader hierarchy 110 in FIG. 1B, suppose the class loader responsible for loading class Foo is class loader “CL3” 125. This class loader therefore requests its parent class loader “CL2” 120 to load class Bar, and so on until either finding an already-loaded Bar or until no more ancestors remain to be checked. In the former case, the test in Block 150 has a positive result, and the located class is returned by Block 165. In the latter case, the test in Block 150 has a negative result and control reaches Block 155. At that point, the class path 120 for class Bar is determined (using the CLASSPATH variable), and a check is made (Block 160) to see if Bar can be located using that class path. If so, then the located class is loaded (BLOCK 170) and immediately initialized; otherwise, an error is returned (Block 175). After the class is loaded in Block 170, control returns to Block 165 to return the loaded class to the caller. This dynamic loading technique is well known in the computer programming art, and code to implement the class loader process is commonly provided as part of Java development toolkits.
There are a number of problems with this prior art class loading approach, however. Because the delegation model is linked to Java's single inheritance class structure, a class loader parent chain must be able to load a complete Java type graph. This necessarily limits subsystems to only one prerequisite, and that prerequisite (and its ancestry) must be able to supply all of the subsystem's ancestor classes: a complex composition of prerequisite components cannot be supported under this approach. In other words, the Java programmer needs to make sure that all type relationships implied in the class implementation (including extended classes, implemented interfaces, declared data member types, argument types of methods, return types of methods, etc.) can be loaded by its single loader chain. When dealing with complex functional relationships, the programmer typically addresses this problem by adding all the required archives, or “jar” files, on a single long class path. This is a less-than-optimal solution. Furthermore, components such as plug-ins are relatively “heavyweight” entities in that they require a considerable amount of resources (i.e. storage) to be allocated, take time to be initialized, and will often trigger the loading of many classes once initialized (which consumes more resources and takes additional time). This approach results in an inefficient use of resources in many cases, and increases the start-up time and the memory footprint of the program in which the plug-in is contained. For example, it may happen that some classes are not actually accessed until a relatively long time after activating the plug-in whose initialization triggered loading of the class, and some may never be accessed. These inefficiencies become especially significant in resource-constrained systems.
Other approaches to dynamic class loading, such as OSGi (“Open Services Gateway Initiative”) bundles, use an independent class loader for each component, rather than using the delegation model which has been described with reference to FIGS. 1A-1C. However, OSGi bundles do not address the limitations of dynamic class loaders which have been discussed. OSGi bundles continue to rely on parent relationships during loading, and initialize upon start-up as well. (The term “OSGi bundles” refers to components which adhere to the OSGi Service Gateway Specification. OSGi bundles are archive files containing class files and resources. A bundle's manifest file identifies the bundle's contents and also the packages and services which are imported and exported by that bundle. More information on this specification may be found on the Internet at location http://www.osgi.org/about/spec1.html.)
Accordingly, what is needed is an improved technique for dynamically loading independent components (that is, those components whose classes are not necessarily located within a single functional dependence hierarchy).
SUMMARY OF THE INVENTION
An object of the present invention is to provide an improved technique for dynamically loading independent code components.
Yet another object of the present invention is to provide an improved technique for loading components which are not located within a single functional dependence hierarchy chain.
Another object of the present invention is to provide a technique for dynamically loading components which supports complex prerequisites.
Still another object of the present invention is to provide a technique for dynamically loading components which allows explicitly specifying one or more prerequisite components.
A further object of the present invention is to provide a technique for dynamically loading components which delays initialization and loading of components until the component is needed.
Other objects and advantages of the present invention will be set forth in part in the description and in the drawings which follow and, in part, will be obvious from the description or may be learned by practice of the invention.
To achieve the foregoing objects, and in accordance with the purpose of the invention as broadly described herein, the present invention provides methods, systems, and computer program products for improving dynamic loading of components. In one aspect of preferred embodiments, this technique comprises: providing a specification of zero or more prerequisite components for components to be loaded; providing distinct class loaders associated with the components to be loaded; and attempting to load a class from a particular component using the provided class loader associated with that particular component, wherein the provided class loader may invoke class loaders associated with one or more of the prerequisite components if necessary.
Optionally, this technique may further comprise: providing multiple versions of a selected component to be loaded; loading one or more classes from two or more of the provided versions, wherein classes having duplicate names may therefore be loaded; and automatically distinguishing the classes having duplicate names by virtue of their distinct class loaders.
The specification of zero or more prerequisite components may further specify whether components re-export classes of their prerequisite components, and/or which classes of a particular component are to be exposed to other components for which the particular component is a prerequisite component.
In another aspect of preferred embodiments, the technique may comprise: providing distinct class loaders associated with the components to be loaded; monitoring attempts to use the distinct class loaders; and delaying activation of a particular component until the monitoring detects that the class loader associated with that particular component is loading its first class. Optionally, this aspect may be combined with the above-described aspect.
The present invention will now be described with reference to the following drawings, in which like reference numbers denote the same element throughout.
BRIEF DESCRIPTION OF THE DRAWINGS
FIG. 1 (comprising FIGS. 1A-1C) illustrates the technique with which Java classes are dynamically loaded, according to the prior art;
FIG. 2 illustrates an example of complex prerequisite relationships among components;
FIG. 3 provides a set of sample component definitions, illustrating information used by preferred embodiments of the present invention;
FIG. 4 (comprising FIGS. 4A-4C provides a flowchart setting forth logic which may be used to implement improved dynamic class loading, according to preferred embodiments of the present invention;
FIG. 5 illustrates sample search orders in which component loading may occur when using the example prerequisite relationships in FIG. 2 and the sample component definitions in FIG. 3, according to preferred embodiments of the present invention; and
FIG. 6 provides a flowchart illustrating logic which may be used to implement delayed component activation, according to preferred embodiments of the present invention.
DESCRIPTION OF PREFERRED EMBODIMENTS
The present invention defines improved techniques for dynamically loading components which have prerequisite relationships more complex than the simple single inheritance chains which are supported with prior art dynamic class loading techniques. Multiple prerequisites are supported in this improved technique, and in preferred embodiments, an arbitrary number of prerequisites may be explicitly specified for a component. Furthermore, techniques are disclosed which enable delaying the loading and initialization of components until such time as the component is actually needed, thereby improving overall efficiency of the system. Preferably, implementations of the present invention provide support for both the multiple prerequisite relationships and the delayed initialization, although implementations providing support for either technique individually provide advantages over the prior art and such implementations are within the scope of the present invention.
The techniques disclosed herein are especially beneficial when the component to be loaded is complex, such as a plug-in or bundle which contains a number of classes (although the advantages of the present invention may also be realized in some cases with relatively simple components, such as a single class). Use of plug-ins for providing distributed services is becoming increasingly popular. The term “plug-in” describes a self-contained software component that modifies (i.e. adds or changes) the function available in a particular computing environment. When a user adds a plug-in to a software system, the foundation of the original software system remains intact; the plug-ins communicate with other software through well-defined application programming interfaces (“APIs”). The set of plug-ins in use within a particular computing environment may be supplied by many different vendors, and may enable a wide range of functionality.
To maintain security, configurability, and scalability, each plug-in must be provided with a dedicated class loader when using the present invention. As in the prior art, the immediate class path of this class loader contains only the code (i.e. the jars and the directories) for the related plug-in. Since the code in a plug-in may refer to code provided in other plug-ins, a complex prerequisite system of functional dependencies among the plug-ins may be formed. A relatively simple example is depicted in FIG. 2. In this example prerequisite system 200, a plug-in named “Example” 230 contains the class Foo 235. The Example plug-in is dependent on code provided by plug-in P 225. (The direction of the arrows in FIG. 2 indicates the order of each dependency or prerequisite relationship.) Plug-in P, in this example, is dependent on plug-in R 205, plug-in T 215, and plug-in Q 220. Plug-in Q is dependent on plug-in S 210, which in turn is dependent on plug-in R 205. As will be obvious, the graph in this prerequisite system 200 does not adhere to the single inheritance model supported by the prior art dynamic class loaders, which has been described with reference to the tree structure 110 in FIG. 1B. (It should be noted that the terms “plug-in” and “component” are used interchangeably herein to describe the features of the present invention.)
According to the present invention, a particular plug-in specifies its prerequisites explicitly. For example, plug-in explicitly states that it requires plug-in Q if P needs to refer to classes in Q during execution. FIG. 3 illustrates an example 300 of specifying this information, where the relationships in the prerequisite system depicted in FIG. 2 have been specified for each of the six plug-ins which were illustrated therein (see elements 330, 340, 350, 360, 370, and 380), as well as forte “Parent” 310 and “Platform” 320 plug-ins. (All plug-ins implicitly have the Platform as a prerequisite and all class loaders have Parent as their parent.) So, for example, the specification 340 for plug-in P indicates that P is dependent upon (i.e. has as prerequisites) code in R, Q, and T. (As will be obvious, the information illustrated in FIG. 3 is merely representative of one manner in which the information used by the present invention may be specified.)
By defining a class loader that supports this explicit prerequisite specification, it becomes possible to support components having multiple prerequisites in a complex graph structure such as that shown in FIG. 2. The logical class path to be used for a particular component must account for this complex structure, and in preferred embodiments, uses a transitive closure of the set of class paths of the prerequisite components. Thus, the class path for plug-in Q, for example, is logically extended to include not only the classes in its jars and directories but also those classes provided by plug-in S. Information used for creating this logical extension is taken from the syntax shown in FIG. 3. Note that this technique does not require physically adding jars from one component to its dependent components, nor does it require the class loader for a component to be the parent of the class loader of its dependent components. (While existing Java mechanisms enable adding elements to the class path of an individual class loader, Java programs typically use a fixed class path at program start-up. Class paths are not extended programmatically as in the present invention, nor do they account for complex prerequisite relationships of the type described herein. The present invention allows for a logical, multi-way extension of class path information for an individual class loader; the prior art allows for only one-way extension via the parent relationship. While programmatic extension is supported in the prior art, it does not yield the advantages of the present invention: that is, the extensions available in the prior art typically only comprise adding to the end of a class loader's class path.)
In the dependency graph, the arrows determine what classes any one component can “see” (i.e, can make direct programmatic reference to, or make load requests for). A component can therefore see classes from components that are one hop away in the graph; classes that are more than one hop away are not directly visible. This is often insufficient. For example, the classes of P are more than one hop away from Foo. Therefore, it becomes necessary to export classes to the downstream (i.e. dependent) components, enabling classes to be visible to components more than one hop away. An optional aspect of the present invention enables a component to opt out of re-exporting the classes of its prerequisites. This is shown in FIG. 3 with use of the “export=true|false” parameter of the prerequisite specification clauses. For example, plug-in P specifies that it exports the classes of plug-in Q but does not export those of plug-in R or T (see element 340). Thus, in this case the transitive closure which logically extends plug-in P's class path brings in the classes of plug-ins R, Q, and T. However, since P does not re-export T's classes, P's dependents are not directly exposed to them via P. For example, the Example plug-in will not see T's classes at all. It will see classes from R because P exports Q, Q exports S, and S exports R. The set of prerequisites for a particular plug-in may therefore form an arbitrarily complex class path for that plug-in. Each node in the graph of FIG. 2 has a corresponding dedicated class loader, as stated earlier. When searching for a class of a particular plug-in according to the present invention, the class path of each visible class loader will be searched (if necessary, until the desired class is located). For example, in searching for a class using plug-in P's class loader, the class path of each class loader except that of plug-in Example will be considered.
Another optional aspect of the present invention enables a class loader to provide filtering capabilities as to which classes are exposed. Since a plug-in's class loader is used to load all of its classes, a system without filtering would expose all of a plug-in's classes for use by dependent plug-ins. While this is desirable in the case of API classes, private implementation details are preferably not exposed by default. Thus, a plug-in's specification may include a filtering expression or parameter, referred to herein as the “expose” parameter, to explicitly detail the classes a class loader will load on behalf of class loaders from other plug-ins. Examples are illustrated in FIG. 3. The value of the expose parameter may be expressed using wildcards, if desired in a particular situation. For example, the expose parameter for plug-in P's jar file is shown as “*.api. *”, indicating that any API classes in this jar file should be exposed while the expose parameter for the jar file named “internal.jar” is shown as “” to indicate that no classes in this jar file should be exposed. The expose parameter for “Q.jar” is shown at 350 as“*”, indicating that all classes in this jar file should be exposed.
The manner in which class loading occurs when using the novel techniques of the present invention will now be described with reference to the logic depicted in FIG. 4, with which preferred embodiments may be implemented. Referring again to the example of loading class Bar from class Foo, and assuming that all class loaders in the environment have the same parent (nominally, the system class loader), the search begins with the statements 100 and 105 shown in FIG. 1A, as in the prior art. However, rather than searching for the class Bar using the prior art logic in FIG. 1C, class loaders implemented according to preferred embodiments of the present invention invoke the logic in FIG. 4. When first invoking this logic, a Boolean variable referred to herein as “checkParents” is set to TRUE.
Note that use of the checkparents flag is an optional optimization used by preferred embodiments, where all plug-in class loaders have the same Java parent class loader. In the general case, the Java parent chain should be searched for each of the prerequisites, if necessary, until locating the desired class; however, when it is known that all prerequisite class loaders have the same Java parent, as in preferred embodiments, then it is only necessary to follow the Java parent chain once.
The processing of FIG. 4 begins at Block 400, which tests to see if this loader has already been visited. If so, then it is net productive to search this chain again, so the searching stops as indicated by Block 405 and the processing for the current invocation (which may be recursive) of FIG. 4 ends. (Note that a side effect of this test of “already visited” is that any loops that may exist in the prerequisite graph, such as A depends on B, B depends on C, C depends on A, will be broken.) Otherwise, Block 410 checks to see if the desired class is in this class loader's cache. When this test has a positive result, Block 415 checks to see if the class is being exposed (when the filtering aspect has been implemented). If so, then the class has been found, and the value (i.e. the class) is returned by Block 420. When the test in Block 415 has a negative result, however, the class is not to be exposed by this class loader, and control therefore transfers to Block 425 as if the class was not found.
When the class was not available from this loader's cache, Block 425 tests the checkParents flag to see if the parent(s) of this class need to be checked. If so, then a recursive invocation is initiated at Block 430. When the recursive call completes, processing continues at Black 435 which tests to see if the recursive invocation located the class. If it did, the value is returned (Block 440), and the processing of FIG. 4 is complete for the current class loader. If the class was not found in the class loader's parents (i.e. a negative result in Block 435), on the other hand, or if the parent parents were not checked (i.e. a negative result in Block 425), then the class loader's class path is used to see if the class may be found there (Block 445) by searching the jars and file directories associated with that class path.
If the class was found using the class loader's class path (i.e. a positive result in Block 450), then a test is made (Block 455) to see if the class is being exposed, in a similar manner to that described above with reference to Block 415. If so, then the class has been found, and the value is returned (Block 460). If the class is not exposed (i.e. it is being filtered out), however, control transfers from Block 455 to Block 465 as if the class was not found.
At Block 465, the platform's class loader is checked to see if the requested class may be found in that manner by searching the jars and file directories associated with the platform's class path. Note that the platform's parents are not to be checked, however, and thus checkparents is set to FALSE. If the class was found with the platform class loader, the test in Block 470 has a positive result and the located value is returned (Block 475). Otherwise, this loader is added to the list of those loaders already visited (Block 480), and Block 485 invokes a recursive process of checking the class loaders of all prerequisite classes. When the optional export aspect is implemented, this search is limited to those prerequisite classes which have the export parameter set to TRUE. Note that the checkparents flag remains set to FALSE at this point, and therefore the parents of the prerequisite classes will not be checked. If the class is found in a prerequisite (Block 490), then the value is returned (Block 495). Otherwise, control reaches Block 499 because after searching all prerequisites, there are no more places to search for the requested class, and an error indicator is preferably returned.
Note that the notion of a platform class loader is an optimization used by preferred embodiments. This class loader is designed as a prerequisite class loader that is available as an ancestor of all plug-in loaders, without the need to explicitly declare this relationship. By convention, it is the loader that is searched first after a loader fails (at Block 445) to find a class in its own jar(s). Because the platform class loader has no other prerequisites itself, it is not necessary to recursively invoke the processing of FIG. 4 at Block 465.
Referring now to FIG. 5, several example searches are shown which are based on the prerequisite structure in FIG. 2 and the plug-in specifications in FIG. 3. Assume that the class Foo is defined in the plug-in Example, as shown in FIG. 2, and that the syntax “new Bar ( )” is evaluated in a method of class Foo. The leftmost plug-in name in each example of FIG. 5, which is shown enclosed in parentheses, indicates where the class Bar is actually defined for each example search. In example 510, class Bar is located in the Parent plug-in. Thus, the search proceeds by first checking the cache of the class loader for the Example plug-in. Not finding Bar there, the class loader for Parent is checked next; Bar is found there, and the search ends successfully.
Continuing on to the next example search order 520, Bar is actually defined in the Example plug-in. Again, the cache is checked first, and the Bar is not found there so the Parent plug-in is checked next. Not finding Bar there, the Example plug-in is checked, and Bar is successfully located. Example 530 is similar, except that the search fails in the Example plug-in and thus continues on to the Platform plug-in, where Bar is defined.
Examples 540 through 570 illustrate scenarios where Bar is found in a plug-in within the prerequisite graph for the Example plug-in. When Bar is defined in plug-in P, example 540 indicates that plug-in P is searched after failing to find Bar in the Platform plug-in. When Bar is defined in plug-in Q, example 550 indicates that plug-in P is again searched after failing to find Bar in the Platform plug-in; however, not finding Bar in this prerequisite of Example, the search continues. Plug-in R, which is the first-specified prerequisite of plug-in P, is skipped (see Block 485 of FIG. 4) because R is specified with export=“false” (see element 340 of FIG. 3), indicating that R's classes will not be exported through P. Thus, the next available prerequisite in the extended class path is plug-in Q, where Bar is defined, and the search therefore ends successfully in this example.
Example 560 illustrates a scenario in which Bar is defined in plug-in R, and is found there (even though R was skipped when traversing from plug-in P). In this case, after checking plug-in Q and failing to find Bar, Q's prerequisite S is checked next, also unsuccessfully. Next, the prerequisite R is reached when traversing from plug-in S, because the export setting is true in this case (see element 370 of FIG. 3). Because R exposes class Bar (see element 360), the search ends successfully. Example 570 covers the case where Bar is defined in plug-in S, and therefore proceeds as already described for example 560, up until locating Bar in S. Example 580 covers the case where Bar is not defined and is not available from any of the class loaders in the prerequisite graph. After searching using each class loader of the extended class path, Bar has still not been located, and the search fails. In example 590, the class Bar is actually located in plug-in T, which is not re-exported by P. As such, even though the class is found, it cannot be supplied to the Example plug-in. Note that the prerequisite search in preferred embodiments is depth-first. That is, a prerequisite's entire load sequence, including its prerequisites, is completed before moving on to the next prerequisite (see Block 485 of FIG. 4).
FIG. 6 illustrates logic which may be used to enable delaying the initialization of plug-ins and their classes until such time as a class in that plug-in is needed. Because each plug-in has its own class loader, as stated earlier, class loading can be used as a trigger for plug-in activation. That is, plug-ins need not be activated until they are actually used/needed. According to the present invention, a plug-in is activated by watching activity in its associated class loader. As soon as a class loader for a particular plug-in is preparing to load its first class, the associated plug-in is activated. Instead of directly referencing function of the components that are available for loading, which would cause those components to be loaded as system start-up, this aspect of the present invention essentially expresses the reference relationship through indirect means wherein the logical extension concept registers the reference information as a symbolic descriptor, thereby delaying the loading of the components until a class access is detected. (Indirect descriptors are used in preferred embodiments for this registration, rather than direct programmatic references. Upon detecting a class access, an actual class load request occurs, as will now be described.)
If attempting to load a class with a class loader whose plug-in is already activated (a positive result in Block 600), then processing proceeds as in the prior art (Block 605). Otherwise, Block 610 performs a “pit-load” check to see if it is likely that the requested class will be found in this class loader. Note that the class is not actually loaded at this point. Instead, in preferred embodiments this pit-load process comprises checking to see if there is a file with the desired name (when the class is being loaded from a file store). If no such file is found (i.e. Block 610 has a negative result), then the loading process must be attempted with another class loader (unless there are no other class loaders available), as indicated by Block 625. Preferably, the technique which has been described above is used to select the next class loader from the logically extended class path.
If the pre-load check of Block 610 succeeds, then it is assumed that the file will contain a valid, loadable class; therefore, the plug-in is marked as “being activated” in Block 615. Block 620 then performs an activation of the plug-in's life cycle code, in order to initialize the plug-in's run-time state. The actual work to be done in Block 620 depends on the plug-in itself For example, some plug-ins do nothing at this point, others might read previously-stored state data from disk and restore this state, others might open database connections, and so forth. The plug-in must be put in a consistent, functional state so that the classes it loads can be assured that everything is up and running. This technique allows the loading of any exported class to be the trigger for activation of the plug-in. (Otherwise, an alternative technique would be needed, such as requiring all classes to implement an activation check or allowing some limited number of classes to function as plug-in activation points. The technique of the preferred embodiments does not require this type of class-specific approach.) After performing the activation in Block 620, Block 625 loads the class as normal.
This technique guarantees that plug-ins are always activated and consistent before their classes are loaded, and that plug-ins are only activated if the function they provide is actually required. This in turn improves scalability (only the function that is needed is loaded, saving resources), ensures consistency (classes can rely on their plug-ins always being initialized), and enhances isolation (classes for a given plug-in are always managed by that plug-in).
When this delayed activation technique is implemented in addition to the multiple prerequisite relationships technique, the logic depicted in FIG. 6 is preferably merged into the logic of FIGS. 4A through 4C when a class has been successfully located (including a successful result to the exposure tests, when implemented). When this merge is performed, the test in Block 610 and the logic in Block 625 may be omitted.
An added benefit of using the techniques disclosed herein is that multiple versions of the same plug-in (and thus its code) may now be loaded and running simultaneously. For example, plug-in A may specify as its prerequisites that it needs version 2 of plug-in B (e.g. plug-in “B2.0”), whereas plug-in C may specify that it needs version I of plug-in B (e.g. plug-in “B1.0”). Since class uniqueness in Java programming is derived from the fully-qualified class name plus the class loader used to load the class, and the different versions (in this example, B2.0 and B1.0) are actually different plug-ins, each version's classes are loaded by a different loader. Therefore, even if the classes in the different versions have identical names (and in fact, identical code), they will automatically be treated as different classes and so can automatically co-exist.
Thus, it can be seen that use of the multiple prerequisite relationships technique and/or the delayed initialization technique herein provide improvements over the dynamic class loading techniques of the prior art. Either or both the optional filtering and export aspects may be implemented in addition, in order to provide further advantages, as have been described.
As will be appreciated by one of skill in the art, embodiments of the present invention may be provided as methods, systems, or computer program products. Accordingly, the present invention may take the form of an entirely hardware embodiment, an entirely software embodiment or an embodiment combining software and hardware aspects. Furthermore, the present invention may take the form of a computer program product which is embodied on one or more computer-usable storage media (including, but not limited to, disk storage, CD-ROM, optical storage, and so forth) having computer-usable program code embodied therein.
The present invention has been described with reference to flow diagrams and/or block diagrams of methods, apparatus (systems) and computer program products according to embodiments of the invention. It will be understood that each flow and/or block of the flow diagrams and/or block diagrams, and combinations of flows and/or blocks in the flow diagrams and/or block diagrams, can be implemented by computer program instructions. These computer program instructions may be provided to a processor of a general purpose computer, special purpose computer, embedded processor or other programmable data processing apparatus to produce a machine, such that the instructions, which execute via the processor of the computer or other programmable data processing apparatus, create means for implementing the functions specified in the flow diagram flow or flows and/or block diagram block or blocks.
These computer program instructions may also be stored in a computer-readable memory that can direct a computer or other programmable data processing apparatus to function in a particular manner, such that the instructions stored in the computer-readable memory produce an article of manufacture including instruction means which implement the function specified in the flow diagram flow or flows and/or block diagram block or blocks.
The computer program instructions may also be loaded onto a computer or other programmable data processing apparatus to cause a series of operational steps to be performed on the computer or other programmable apparatus to produce a computer implemented process such that the instructions which execute on the computer or other programmable apparatus provide steps for implementing the functions specified in the flow diagram flow or flows and/or block diagram block or blocks.
While the preferred embodiments of the present invention have been described, additional variations and modifications in those embodiments may occur to those skilled in the art once they learn of the basic inventive concepts. Therefore, it is intended that the appended claims shall be construed to include the preferred embodiments and all such variations and modifications as fall within the spirit and scope of the invention.

Claims (10)

What is claimed is:
1. A method of improving dynamic loading of components in a computing network, comprising steps of:
specifying, for one or more components to be loaded, each prerequisite component thereof, wherein each of the components has at least one other ones of the components specified as a prerequisite thereof;
providing distinct class loaders associated with each of the one or more components to be loaded;
attempting to load a class referenced from a particular one of the components using the provided class loader associated with that particular component; and
searching through the specified prerequisite components for the particular component and their prerequisite components to attempt to locate the class for loading if the class cannot be located for loading in the particular component, until either (1) successfully locating the class for loading with the provided class loader associated with one of the searched components or (2) concluding that the class cannot be located for loading.
2. The method according to claim 1, further comprising the steps of:
providing multiple versions of a selected component to be loaded;
loading one or more classes from two or more of the provided versions, wherein classes having identical names may therefore be loaded as distinct classes; and
automatically distinguishing the classes having identical names by virtue of their distinct class loaders.
3. The method according to claim 1, wherein:
the specifying step comprises specifying, for each component having prerequisite components, whether that component will re-export classes of each of its prerequisite components during the searching step; and
when searching a particular component, the searching step does not include any prerequisite components thereof that are specified as not re-exporting classes through the particular component.
4. The method according to claim 1, wherein:
the specifying step further comprises specifying, for each component, which classes of that component are to be exposed, during the searching step, to other components for which the selected component is a prerequisite component; and
if the searching step locates the class within a particular component for which the specification indicates that the class is not to be exposed, treating the class as not having been found within the particular component.
5. The method according to claim 1, further comprising the steps of:
monitoring, at run time, attempts to use the distinct class loaders; and
delaying activation of a selected one of the components until the monitoring step detects that the class loader associated with that selected component is preparing to load its first class.
6. A method of improving dynamic loading of components in a computing network, comprising steps of:
providing distinct class loaders associated with each of a plurality of components to be loaded;
specifying, for each of the components, each prerequisite component thereof, wherein each of the component has at least one other ones components specified as a prerequisite thereof:
monitoring, at run time, attempts to use the distinct class loaders;
delaying activation of a particular one of the components until the monitoring step detects that the class loader associated with that particular component is preparing to load its first class; and
searching through the specified prerequisite components for the particular component and their prerequisite components to attempt to locate the class for loading if the class cannot be located for loading in the particular component, until either (1) successfully locating the class for loading with the provided class loader associated with one of the searched components or (2) concluding that the class cannot be located for loading.
7. A system for improving dynamic loading of components in a computing networks, comprising:
means for specifying, for one or more components to be loaded, each prerequisite component thereof, wherein each of the components has at least one other ones of the components specified as a prerequisite thereof;
means for providing distinct class loaders associated with each of the one or more components to be loaded;
means for attempting to load a class referenced from a particular one of the components using the provided class loader associated with that particular component; and
means for searching through the specified prerequisite components for the particular component and their prerequisite components to attempt to locate the class for loading if the class cannot be located for loading in the particular component, until either (1) successfully locating the class for loading with the provided class loader associated with one of the searched components or (2) concluding that the class cannot be located for loading.
8. A computer program product for improving dynamic loading of components in a computing network, the computer program product embodied on one oar more computer-readable media and comprising:
computer-readable program code means for specifying, for one or more components to be loaded, each prerequisite component thereof, wherein each of the components has at least one other ones of the components specified as a prerequisite thereof;
computer-readable program code means for providing distinct class loaders associated with each of the one or more components to be loaded;
computer-readable program code means for attempting to load a class referenced from a particular one of the components using the provided class loader associated with that particular component; and
computer-readable program code meats for searching through the specified prerequisite components for the particular component and their prerequisite components to attempt to locate the class for loading if the class cannot be located for loading in the particular component, until either (1) successfully locating the class for loading with the provided class loader associated with one of the searched components or (2) concluding that the class cannot be located for loading.
9. The system according to claim 7, further comprising:
means for monitoring, at run time, attempts to use the distinct class loaders; and
means for delaying activation of a selected one of the components until the means tin monitoring detects that the class loader associated with that selected component is preparing to load its first class.
10. The computer program product according to claim 8, further comprising:
computer-readable program code means for monitoring, at run time, attempts to use the distinct class loaders; and
computer-readable program code means for delaying activation of a selected one of the components until the computer-readable program code means for monitoring detects that the class loader associated with that selected component is preparing to load its first class.
US09/872,963 2001-06-01 2001-06-01 Independent class loader for dynamic class loading Expired - Lifetime US6748396B2 (en)

Priority Applications (1)

Application Number Priority Date Filing Date Title
US09/872,963 US6748396B2 (en) 2001-06-01 2001-06-01 Independent class loader for dynamic class loading

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
US09/872,963 US6748396B2 (en) 2001-06-01 2001-06-01 Independent class loader for dynamic class loading

Publications (2)

Publication Number Publication Date
US20020184226A1 US20020184226A1 (en) 2002-12-05
US6748396B2 true US6748396B2 (en) 2004-06-08

Family

ID=25360699

Family Applications (1)

Application Number Title Priority Date Filing Date
US09/872,963 Expired - Lifetime US6748396B2 (en) 2001-06-01 2001-06-01 Independent class loader for dynamic class loading

Country Status (1)

Country Link
US (1) US6748396B2 (en)

Cited By (29)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20020087734A1 (en) * 2000-12-29 2002-07-04 Marshall Donald Brent System and method for managing dependencies in a component-based system
US20030014478A1 (en) * 2001-06-29 2003-01-16 Noble Alan C. Dynamically distributed client-server web browser
US20030018909A1 (en) * 2001-07-17 2003-01-23 International Business Machines Corporation Method and apparatus for enforcing security policies in Java applications
US20030041071A1 (en) * 2001-08-22 2003-02-27 Komatsu Ltd. Database Management system and database
US20030131320A1 (en) * 2002-01-08 2003-07-10 International Business Machines Corporation Method and system for localizing java jar files
US20030177484A1 (en) * 2002-03-15 2003-09-18 Bosschaert Allaert J. D. Firewall class loader
US20030200350A1 (en) * 2002-04-19 2003-10-23 Ajay Kumar Class dependency graph-based class loading and reloading
US20040019596A1 (en) * 2002-07-25 2004-01-29 Sun Microsystems, Inc. Method, system, and program for making objects available for access to a client over a network
US20040019897A1 (en) * 2002-07-25 2004-01-29 Sun Microsystems, Inc. Method, system, and program for processing objects in a distributed computing environment
US20050223101A1 (en) * 2004-03-22 2005-10-06 International Business Machines Corporation Computer-implemented method, system and program product for resolving prerequisites for native applications utilizing an open service gateway initiative ( OSGi) framework
US20050267962A1 (en) * 2004-05-28 2005-12-01 Grigor Svetoslavov Graphical user interface for monitoring classloading references
US20060248140A1 (en) * 2005-04-29 2006-11-02 Sap Aktiengesellschaft Compatibility framework using versioning class loaders
US20070006203A1 (en) * 2005-04-29 2007-01-04 Dirk Marwinski Efficient algorithm for performing multi-parent class loading
US20070061792A1 (en) * 2005-09-12 2007-03-15 Oracle International Corporation Method and system for automated root-cause analysis for class loading failures in Java
US20070061797A1 (en) * 2005-09-12 2007-03-15 Oracle International Corporation Bulk loading system and method
US20070061795A1 (en) * 2005-09-12 2007-03-15 Oracle International Corporation Method and system for automated code-source indexing in java virtual machine environment
US20070061796A1 (en) * 2005-09-12 2007-03-15 Oracle International Corporation Shared loader system and method
US20070061798A1 (en) * 2005-09-12 2007-03-15 Oracle International Corporation System and method for shared code-sourcing in a Java Virtual Machine environment
US7283991B1 (en) * 1999-03-11 2007-10-16 Microsoft Corporation Caching system for path search optimization
US20070260633A1 (en) * 2006-05-05 2007-11-08 Pascal Rapicault Integration of non-componentized libraries in component-based systems
US20080005160A1 (en) * 2006-06-30 2008-01-03 Microsoft Corporation Assembly Sensitive Dynamic Classloading Of .Net Types in J#
US20080127157A1 (en) * 2006-11-24 2008-05-29 International Business Machines Corporation Class loading delegation network
US20080209319A1 (en) * 2004-04-29 2008-08-28 Giormov Dimitar T Graphical user interface with a background class loading event system
US20080301662A1 (en) * 2007-05-31 2008-12-04 International Business Machines Corporation Method for versioning classes loaded in an osgi-enabled j2ee environment
US20090030979A1 (en) * 2004-03-22 2009-01-29 Hayes Jr Kent F TUNABLE ENGINE AND PROGRAM PRODUCT FOR RESOLVING PREREQUISITES FOR CLIENT DEVICES IN AN OPEN SERVICE GATEWAY INITIATIVE (OSGi) FRAMEWORK
US7721277B1 (en) 2004-06-08 2010-05-18 Oracle America, Inc. Hot deployment of shared modules in an application server
US20110271251A1 (en) * 2010-04-30 2011-11-03 Oracle International Corporation Access control in modules for software development
US8370824B2 (en) 2007-10-23 2013-02-05 International Business Machines Corporation Dynamic class loading
US8612960B2 (en) 2004-05-28 2013-12-17 Sap Ag Common class loaders

Families Citing this family (19)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
GB0213218D0 (en) * 2002-06-08 2002-07-17 Koninkl Philips Electronics Nv Operation of java virtual machine
US7263697B2 (en) * 2003-01-17 2007-08-28 Sap Aktiengesellschaft Composite computer program extensions
WO2005008440A2 (en) * 2003-07-11 2005-01-27 Computer Associates Think, Inc. System and method for common storage object model
US7434215B2 (en) * 2003-09-11 2008-10-07 International Business Machines Corporation Mechanism for loading plugin classes at an appropriate location in the class loader hierarchy
US9176719B2 (en) * 2004-02-26 2015-11-03 International Business Machines Corporation Resolving prerequisites for a client device in an open service gateway initiative (OSGI) framework
US7603666B2 (en) * 2004-06-16 2009-10-13 International Business Machines Corporation Class loader
US20060161898A1 (en) * 2005-01-18 2006-07-20 Brian Bauman Method and system for project library dependency management
FR2888351A1 (en) * 2005-07-08 2007-01-12 Gemplus Sa ARBORESCENCE OF CLASS CHARGERS MAPPED ON THE TREE OF DIRECTORIES
US9606846B2 (en) * 2005-07-29 2017-03-28 Sap Se System and method for dynamic proxy generation
US20070027877A1 (en) * 2005-07-29 2007-02-01 Droshev Mladen I System and method for improving the efficiency of remote method invocations within a multi-tiered enterprise network
US20070168509A1 (en) * 2005-12-30 2007-07-19 Droshev Mladen I System and method for remote loading of classes
US8225310B1 (en) 2006-03-30 2012-07-17 Emc Corporation Automatic detection and redistribution of content management code
EP2002334A1 (en) * 2006-03-31 2008-12-17 British Telecommunications Public Limited Company Xml-based transfer and a local storage of java objects
EP2002336A1 (en) 2006-03-31 2008-12-17 British Telecommunications Public Limited Company Server computer component
EP2002337A1 (en) 2006-03-31 2008-12-17 British Telecommunications Public Limited Company Exception handler for the upgrade of java objects in a distributed system
TWI328747B (en) * 2007-03-16 2010-08-11 Ind Tech Res Inst System and method for sharing e-service resource of digital home
US9411616B2 (en) * 2011-12-09 2016-08-09 Ca, Inc. Classloader/instrumentation approach for invoking non-bound libraries
US8910138B2 (en) * 2012-05-23 2014-12-09 Oracle International Corporation Hot pluggable extensions for access management system
CN110308945B (en) * 2019-05-22 2022-07-05 百度在线网络技术(北京)有限公司 Dynamic loading method and device of plug-in

Citations (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5815661A (en) 1994-12-20 1998-09-29 Sun Microsystems, Inc. Platform independent object and object application loader and method
US5893118A (en) 1995-12-21 1999-04-06 Novell, Inc. Method for managing globally distributed software components
US5966542A (en) 1996-05-30 1999-10-12 Sun Microsystems, Inc. Method and system for loading classes in read-only memory
US6112025A (en) * 1996-03-25 2000-08-29 Sun Microsystems, Inc. System and method for dynamic program linking
US6154742A (en) * 1996-07-02 2000-11-28 Sun Microsystems, Inc. System, method, apparatus and article of manufacture for identity-based caching (#15)
US6292827B1 (en) * 1997-06-20 2001-09-18 Shore Technologies (1999) Inc. Information transfer systems and method with dynamic distribution of data, control and management of information
US6330006B1 (en) * 1998-05-12 2001-12-11 Silverstream Software, Inc. Method and apparatus for synchronizing an application's interface and data
US6381737B1 (en) * 1999-04-23 2002-04-30 Sun Microsystems, Inc. Automatic adapter/stub generator
US6493870B1 (en) * 1998-03-20 2002-12-10 Sun Microsystems, Inc. Methods and apparatus for packaging a program for remote execution

Patent Citations (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5815661A (en) 1994-12-20 1998-09-29 Sun Microsystems, Inc. Platform independent object and object application loader and method
US5893118A (en) 1995-12-21 1999-04-06 Novell, Inc. Method for managing globally distributed software components
US6112025A (en) * 1996-03-25 2000-08-29 Sun Microsystems, Inc. System and method for dynamic program linking
US5966542A (en) 1996-05-30 1999-10-12 Sun Microsystems, Inc. Method and system for loading classes in read-only memory
US6154742A (en) * 1996-07-02 2000-11-28 Sun Microsystems, Inc. System, method, apparatus and article of manufacture for identity-based caching (#15)
US6292827B1 (en) * 1997-06-20 2001-09-18 Shore Technologies (1999) Inc. Information transfer systems and method with dynamic distribution of data, control and management of information
US6493870B1 (en) * 1998-03-20 2002-12-10 Sun Microsystems, Inc. Methods and apparatus for packaging a program for remote execution
US6330006B1 (en) * 1998-05-12 2001-12-11 Silverstream Software, Inc. Method and apparatus for synchronizing an application's interface and data
US6381737B1 (en) * 1999-04-23 2002-04-30 Sun Microsystems, Inc. Automatic adapter/stub generator

Cited By (51)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7283991B1 (en) * 1999-03-11 2007-10-16 Microsoft Corporation Caching system for path search optimization
US20020087734A1 (en) * 2000-12-29 2002-07-04 Marshall Donald Brent System and method for managing dependencies in a component-based system
US20030014478A1 (en) * 2001-06-29 2003-01-16 Noble Alan C. Dynamically distributed client-server web browser
US20030018909A1 (en) * 2001-07-17 2003-01-23 International Business Machines Corporation Method and apparatus for enforcing security policies in Java applications
US20030041071A1 (en) * 2001-08-22 2003-02-27 Komatsu Ltd. Database Management system and database
US20030131320A1 (en) * 2002-01-08 2003-07-10 International Business Machines Corporation Method and system for localizing java jar files
US7152222B2 (en) * 2002-01-08 2006-12-19 International Business Machines Corporation Method and system for localizing Java™ JAR files
US20030177484A1 (en) * 2002-03-15 2003-09-18 Bosschaert Allaert J. D. Firewall class loader
US7039923B2 (en) * 2002-04-19 2006-05-02 Sun Microsystems, Inc. Class dependency graph-based class loading and reloading
US20030200350A1 (en) * 2002-04-19 2003-10-23 Ajay Kumar Class dependency graph-based class loading and reloading
US20040019897A1 (en) * 2002-07-25 2004-01-29 Sun Microsystems, Inc. Method, system, and program for processing objects in a distributed computing environment
US7107592B2 (en) * 2002-07-25 2006-09-12 Sun Microsystems, Inc. Method, system, and program for making objects available for access to a client over a network
US7234137B2 (en) * 2002-07-25 2007-06-19 Sun Microsystems, Inc. Method, system, and program for processing objects in a distributed computing environment
US20040019596A1 (en) * 2002-07-25 2004-01-29 Sun Microsystems, Inc. Method, system, and program for making objects available for access to a client over a network
US20050223101A1 (en) * 2004-03-22 2005-10-06 International Business Machines Corporation Computer-implemented method, system and program product for resolving prerequisites for native applications utilizing an open service gateway initiative ( OSGi) framework
US20090030979A1 (en) * 2004-03-22 2009-01-29 Hayes Jr Kent F TUNABLE ENGINE AND PROGRAM PRODUCT FOR RESOLVING PREREQUISITES FOR CLIENT DEVICES IN AN OPEN SERVICE GATEWAY INITIATIVE (OSGi) FRAMEWORK
US7966617B2 (en) * 2004-03-22 2011-06-21 International Business Machines Corporation Tunable engine and program product for resolving prerequisites for client devices in an open service gateway initiative (OSGi) framework
US20080209319A1 (en) * 2004-04-29 2008-08-28 Giormov Dimitar T Graphical user interface with a background class loading event system
US8627283B2 (en) 2004-04-29 2014-01-07 Sap Ag Graphical user interface with a background class loading event system
US20050267962A1 (en) * 2004-05-28 2005-12-01 Grigor Svetoslavov Graphical user interface for monitoring classloading references
US7827566B2 (en) * 2004-05-28 2010-11-02 Sap Ag Graphical user interface for monitoring classloading references
US8612960B2 (en) 2004-05-28 2013-12-17 Sap Ag Common class loaders
US7721277B1 (en) 2004-06-08 2010-05-18 Oracle America, Inc. Hot deployment of shared modules in an application server
US7823143B2 (en) * 2005-04-29 2010-10-26 Sap Ag Efficient algorithm for performing multi-parent class loading
US7703089B2 (en) 2005-04-29 2010-04-20 Sap Ag Compatibility framework using versioning class loaders
US20060248140A1 (en) * 2005-04-29 2006-11-02 Sap Aktiengesellschaft Compatibility framework using versioning class loaders
US20070006203A1 (en) * 2005-04-29 2007-01-04 Dirk Marwinski Efficient algorithm for performing multi-parent class loading
US20070061797A1 (en) * 2005-09-12 2007-03-15 Oracle International Corporation Bulk loading system and method
US7814472B2 (en) 2005-09-12 2010-10-12 Oracle International Corporation System and method for shared code-sourcing in a Java Virtual Machine environment
US7644403B2 (en) 2005-09-12 2010-01-05 Oracle International Corporation Method and system for automated root-cause analysis for class loading failures in java
US20100070960A1 (en) * 2005-09-12 2010-03-18 Oracle International Corporation Method and system for automated root-cause analysis for class loading failures in java
US8799885B2 (en) 2005-09-12 2014-08-05 Oracle International Corporation Method and system for automated root-cause analysis for class loading failures in java
US20070061796A1 (en) * 2005-09-12 2007-03-15 Oracle International Corporation Shared loader system and method
US7784043B2 (en) 2005-09-12 2010-08-24 Oracle International Corporation Method and system for automated code-source indexing in Java Virtual Machine environment
US20070061792A1 (en) * 2005-09-12 2007-03-15 Oracle International Corporation Method and system for automated root-cause analysis for class loading failures in Java
US20070061795A1 (en) * 2005-09-12 2007-03-15 Oracle International Corporation Method and system for automated code-source indexing in java virtual machine environment
US8332835B2 (en) 2005-09-12 2012-12-11 Oracle International Corporation Method and system for automated code-source indexing in java virtual machine environment
US20110023020A1 (en) * 2005-09-12 2011-01-27 Oracle International Corporation Method and system for automated code-source indexing in java virtual machine environment
US20070061798A1 (en) * 2005-09-12 2007-03-15 Oracle International Corporation System and method for shared code-sourcing in a Java Virtual Machine environment
US8020156B2 (en) * 2005-09-12 2011-09-13 Oracle International Corporation Bulk loading system and method
US7954096B2 (en) 2005-09-12 2011-05-31 Oracle International Corporation Shared loader system and method
US7886286B2 (en) * 2006-05-05 2011-02-08 International Business Machines Corporation Integration of non-componentized libraries in component-based systems
US20070260633A1 (en) * 2006-05-05 2007-11-08 Pascal Rapicault Integration of non-componentized libraries in component-based systems
US20080005160A1 (en) * 2006-06-30 2008-01-03 Microsoft Corporation Assembly Sensitive Dynamic Classloading Of .Net Types in J#
US8239849B2 (en) * 2006-11-24 2012-08-07 International Business Machines Corporation Class loading delegation network
US20080127157A1 (en) * 2006-11-24 2008-05-29 International Business Machines Corporation Class loading delegation network
US7890945B2 (en) * 2007-05-31 2011-02-15 International Business Machines Corporation Method for versioning classes loaded in an OSGi-enabled J2EE environment
US20080301662A1 (en) * 2007-05-31 2008-12-04 International Business Machines Corporation Method for versioning classes loaded in an osgi-enabled j2ee environment
US8370824B2 (en) 2007-10-23 2013-02-05 International Business Machines Corporation Dynamic class loading
US20110271251A1 (en) * 2010-04-30 2011-11-03 Oracle International Corporation Access control in modules for software development
US8640115B2 (en) * 2010-04-30 2014-01-28 Oracle International Corporation Access control in modules for software development

Also Published As

Publication number Publication date
US20020184226A1 (en) 2002-12-05

Similar Documents

Publication Publication Date Title
US6748396B2 (en) Independent class loader for dynamic class loading
US11853774B2 (en) Dynamically loaded plugin architecture
US6112025A (en) System and method for dynamic program linking
US7784044B2 (en) Patching of in-use functions on a running computer system
US7784043B2 (en) Method and system for automated code-source indexing in Java Virtual Machine environment
US7954096B2 (en) Shared loader system and method
US20070168949A1 (en) System supporting object-oriented constructs in ECMAScript
US6996707B2 (en) Method, system, and article of manufacture for limiting access to program files in a shared library file
US20090055603A1 (en) Modified computer architecture for a computer to operate in a multiple computer system
JP2013514569A (en) Method, computer program product, and system for non-blocking dynamic update of statically typed class-based object-oriented software
US6834391B2 (en) Method and apparatus for automated native code isolation
US11726810B2 (en) Systemic extensible blockchain object model comprising a first-class object model and a distributed ledger technology
US7219341B2 (en) Code analysis for selective runtime data processing
US7603666B2 (en) Class loader
Turner et al. Creating XPCOM Components
Tanter et al. Scoping strategies for distributed aspects
Pautet et al. GLADE users guide
US20030018962A1 (en) System and method for accessing streaming data
Shafiei et al. Modeling class loaders in java pathfinder version 7
Arulkumaran et al. Java/J2EE Job Interview Companion
Walsh et al. The Commandos Supported Programming Languages
Clegg Evolution in extensible component-based systems
Schmidt Strategized locking, thread-safe interface, and scoped locking
Evenson et al. Armed Bear Common Lisp User Manual
Memory Improving Performance with Shared Memory and Proper Forking

Legal Events

Date Code Title Description
AS Assignment

Owner name: INTERNATIONAL BUSINESS MACHINES CORPORATION, NEW Y

Free format text: ASSIGNMENT OF ASSIGNORS INTEREST;ASSIGNORS:KLICNIK, VLADIMIR;MCAFFER, JEFFREY A.;WIEGAND, JOHN D.;REEL/FRAME:012109/0848;SIGNING DATES FROM 20010605 TO 20010711

FEPP Fee payment procedure

Free format text: PAYOR NUMBER ASSIGNED (ORIGINAL EVENT CODE: ASPN); ENTITY STATUS OF PATENT OWNER: LARGE ENTITY

STCF Information on status: patent grant

Free format text: PATENTED CASE

CC Certificate of correction
FPAY Fee payment

Year of fee payment: 4

FPAY Fee payment

Year of fee payment: 8

FPAY Fee payment

Year of fee payment: 12