Building Real Java Classes from Python Classes

The previous section describes how Python classes can be created that subclass from Java classes.  This works very well when you want to pass a Python class into Java from JPython.  This is not adequate for building real Java ".class" files that implement a Java class and can be passed directly to Java programs.  This sort of functionality is required to build applets, servlets, or JavaBeans in JPython that can be used exactly like their Java equivalents.  It is also very valuable for users who wish to subclass Python classes in Java.

In order to build a real java class from a Python class, you will use the freeze tool.  This can be found in Tools/freeze/freeze.py.  You can invoke this tool on a Python file using the following:

jpython freeze.py [-jar jarfile] [-cab cabfile] [-dir directory] [-main] [-core] [-shallow] [module]*
 
-jar jarfile Specifies a .jar file to create and put the results of the freeze into.
Not really useful for "shallow" freezes
-cab cabfile Specifies a .cab file to create and put the files into.
This only works with Microsoft's JVM (.cab is a MS format)
-dir directory Specifies that the files should be put into the given directory.
If none of the first three options are specified, -dir '.' is assumed
-main Will be used to specify that a Java main method should be created.
This is not yet implemented.
-core Include the core JPython libraries (about 130K)
Needed for applets since Netscape doesn't yet support multiple archives
-shallow Only create a proxy wrapper for this class
This is probably your best bet for everything except creating applets
module* A list of Python modules to freeze
Can be either modules names that are on the python.path or .py files

The Python module must contain a Python class with the same name as the module, and that Python class must subclass exactly one Java class or interface.  The real Java class created will be a subclass of whatever Java class is subclassed.

Examples

On my Windows NT machine, I used the following command to create the file appletdemo.jar (containing all of the applet demos on the web site, as well as the core JPython libraries):
c:\jpython> jpython Tools\freeze\freeze.py -core -jar appletdemo.jar Demo\applet\*.py
To generate a skeleton class to allow a Python class to be used as java.awt.Component in a Java gui program, I used the following command:
c:\jpython> jpython Tools\freeze\freeze.py -shallow Demo\javaclasses\Graph.py