The GNU Classpath tools are stored in the tools.zip. They can be invoked by
putting this archive into classpath and specifying the tool main class as the
class to run (parameters usually follow). The current release contains the
following tools:

== GIOP tools ==

GIOP tools are used for creating the applications that use GIOP communication
protocol. It provides necessary support for org.omg.* and javax.rmi.* 
packages.

All GIOP tools support the --help option, for instance:
  java -cp tools.zip gnu.classpath.tools.giop.IorParser --help

The list of the currently available GIOP tools (name matches the main
class in gnu.classpath.tools.giop package):

* GRMIC -                RMI-IIOP stub and tie generator.
* NameService  -         GIOP transient naming service (this tool is called 
                         tnameserv in Sun's package).
* NameServicePersistent
               -         GIOP persistent naming service (this tool is called 
                         orbd in Sun's package).
* IorParser -            Parses the stringified form of the interoperable 
                         object references (IOR's).
                         
== RMI tools ==

RMI tools provide support for java.rmi package. All tools support 
the --help key by printing more information, for instance:
  java -cp tools.zip gnu.classpath.tools.rmi.RMIC --help

The list of the currently available RMI tools (name matches the main tool class
in gnu.classpath.tools.rmi package):
  
* RMIC -                 RMI stub and tie source code generator (complements
                         the ASM based bytecode generator in the separate
                         cp-tools project). This tool is only needed for 
                         research and backward-compatibile applications, as
                         Classpath supports the 1.5 feature to replace such 
                         stubs by proxy classes.
* REGISTRY -             The persistent RMI naming service.                                                   
* RMID -                 The persistent RMI activation daemon, supports the
                         java.rmi.activation package.
  
== Security tools ==

Security tools (currently) are used for signing and verifying JAR files
as well as (planned) generating and managing cryptographic tokens and
credentials.

The list of individual tools, the name of their main class that should be
invoked by the Java launcher, and a summary of what they provide follows:

* jarsigner              gnu.classpath.tools.jarsigner.Main
                         A drop-in replacement for the "jarsigner" tool.


