Compiling Python Source to Real Java Classes - jpythonc

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 jpythonc tool.  A script to access jpythonc should have been installed in the JPython installation directory when you installed the package.  If it was not, it can be invoked as follows: "jpython Tools\jpythonc\jpythonc.py".

This script accepts the following arguments:

jpythonc [-jar jarfile] [-cab cabfile] [-dir directory] [-main] [-core | -all] [-deep] [-lib libraries] [-skip modules] [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 Might be added to create a main method in generated class 
Will only be added if someone convinces me it's necessary
-core Include the core JPython libraries (about 130K) 
Needed for applets since Netscape doesn't yet support multiple archives
-all Include all of the JPython libraries (everything in core + compiler and parser)
-deep Compile both this one class and all dependencies. 
This is used for creating applets
-bean jarfile Creates a .jar file containing a bean 
The correct manifest file will be generated and included
-lib libraries Specifies a set of libraries (delimited by the platform's path separator character) 
Dependencies in these libraries will not be included in the result of the freeze 
This option only makes sense when combined with -deep
-skip modules Specifies a comma-separated list of modules not to freeze, or include in archive
-useproxy For Expert Users Only! 
The generated proxy class will be a shell around the standard JPython proxy class 
You must have a cached copy of the appropriate proxy class to use this flag
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\Demo\applet> jpythonc -core -deep -jar appletdemo.jar *.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\Demo\javaclasses> jpythonc Graph.py

To generate a JPython-based bean I do the following:

c:\jpython\Demo\bean> jpythonc -deep -bean f2c.jar conversion.FahrenheitToCelsius

To use this with SUN's BDK, I do the following (the important steps are to make the bean and the JPython libraries known to the tool).

1) modify BDK\beanbox\run.bat (or run.sh) to include the jpython\JavaCode in the CLASSPATH
2) copy f2c.jar to BDK\jars

You should now be able to access the FahrenheitToCelsius bean from SUN's BeanBox (or other Bean-aware tool).