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 |
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).