[kepler-dev] Adding jar files (and java classes) to kar files

Dan Higgins higgins at nceas.ucsb.edu
Thu Sep 20 09:44:15 PDT 2007

    Your assumption is correct. There is nothing in my implementation 
that handles versioning. Older jars with the same name are not 
overwritten and there is no checking within a jar to see if a class is 
duplicated or updated. So it does not do all that we would like, but it 
takes us at least part of the way to a workable solution.


Matthew Jones wrote:
> Yes, nice work Dan.  Very exciting.  This has been a long time coming, 
> and I am excited about the possibilities that this opens up.  It 
> should be now far easier for us to split the repository into a 
> kepler-core component and an actors component.
> I assume that, if an actor kar file includes a jar for which another 
> actor already has loaded an earlier version of a jar, then the 
> original will be used and the actor that depends on the later version 
> may not work.  So it is incumbent upon an actor developer to be sure 
> that their kar file does not conflict with an earlier version, 
> although this may be essentially impossible given that users will have 
> the ability to import arbitrary kar files that may be incompatible.
> Thanks Dan.  Nice move forward.
> Matt
> Chad Berkley wrote:
>> Nice job, Dan!  This sounds great.  I'll give it a try here shortly. 
>> Have you seen any changes in performance while using this?  Have you 
>> changed any other actors besides ImageJ?
>> chad
>> Dan Higgins wrote:
>>> Hi All,
>>>    Currently, Kepler uses a concept called a 'kar' file for 
>>> encapsulating actor information. In the $KEPLER/src/actors/ 
>>> directory there are subdirectories for each actor. These 
>>> subdirectories contain a MANIFEST file and a MoML (XML) file. This 
>>> MoML file contains standard Ptolemy information (such as the java 
>>> class names) plus some additional info about semantic types for 
>>> characterizing the actor and actor ports (and Kepler actor help info 
>>> is also stored in this MoML file). The ant task 'ant buildkarlib' 
>>> zips the information in these directories into 'kar' files, one for 
>>> each actor.
>>>    Now, the kar files are examined at Kepler startup and information 
>>> from the kar file is saved in the Kepler cache and also used build 
>>> the Kepler actor tree on the left of the main window. Up to now only 
>>> the information in the contained MoML file was cached. [Recently the 
>>> startup code was changed to NOT pass the MoML file to the MomlParser 
>>> until the actor is dragged to the work area and dropped, thus 
>>> deferring the loading of java actor classes.]
>>>    The information in the MoML file is all that is needed for 
>>> composites, pure MoML actors, and extension actors like those built 
>>> by customizing the RExpression actor. Importing a kar file for these 
>>> types of actors works fine because the underlying Java classes are 
>>> already in the Kepler classpath. For new Java based actors, however, 
>>> there is a big problem - the java classes are not known to Kepler!
>>>    Well, the original idea for the kar file was to include other 
>>> information. Stubs for a number of types of information was included 
>>> in the KARCacheObject class when it was originally written. We 
>>> originally discussed a custom ClassLoader that would allow classes 
>>> to be loaded, unloaded, and versioned. Implementing this turned out 
>>> to a major task and was postponed. But recently a means for 
>>> dynamically adding a class to the standard classpath was discovered 
>>> and this allows one to at least add new classes by including the 
>>> compiled java classes in the kar file!
>>>    Take a look at the $KEPLER/src/actors/ImageJ/ directory for an 
>>> example. Two jar files are included in addition to the usual 
>>> MANIFEST and MoML xml file. ImageJ.jar contains the Kepler actor 
>>> java classes. ij.jar is a library used by the actor. The MANIFEST 
>>> has been modified to list these two jars; i.e.
>>> Manifest-Version: 1.4.2
>>> KAR-Version: 1.0
>>> lsid: urn:lsid:kepler-project.org:kar:154:1
>>> Name: ImageJ.xml
>>> lsid: urn:lsid:kepler-project.org:actor:251:1
>>> type: actorMetadata
>>> Name: ImageJ.jar
>>> lsid: urn:lsid:kepler-project.org:jar:251:1
>>> type: jar
>>> Name: ij.jar
>>> lsid: urn:lsid:kepler-project.org:jar:252:1
>>> type: jar
>>>    At startup, when the KAR files are scanned (in the KARCacheObject 
>>> class), the entries of type 'jar' will be pulled out of the kar and 
>>> copied to the $KEPLER/lib/jar/ directory. [Any jars in this 
>>> directory are automatically added the classpath the next time Kepler 
>>> is started.] The jars will also be dynamically added to the 
>>> classpath when thay are copied. This means that IF ALL THE JAVA 
>>> THEN THE KAR FILE IS SELF-CONTAINED! One simply needs to import a 
>>> KAR file to add a new java-based actor to Kepler!
>>> NOTE: Currently, the ij.jar and ImageJ.jar classes are already in 
>>> CVS. If you are using ant, remove 
>>> build/classes/util/ImageJActor.class and  lib/jar/ij.jar to test 
>>> this dynamic loading. (You will also need to delete the .kepler 
>>> directory to force rebuilding the cache.
>>> As always, comments are appreciated.
>>> Dan

Dan Higgins                                  higgins at nceas.ucsb.edu
http://www.nceas.ucsb.edu/    Ph: 805-893-5127
National Center for Ecological Analysis and Synthesis (NCEAS) Marine Science Building - Room 3405
Santa Barbara, CA 93195

More information about the Kepler-dev mailing list