Running JPF

Executing JPF from the command line is easy - the jpf script (residing in the jpf/bin directory) acts as a drop in replacement for the normal 'java' executable. In case you don't have specific initialization needs (see [sec:Lots-of-Options]), all you need to do is to call the bin/jpf script with the class name of the main application class to check, and append any arguments the application is expecting. The formal syntax is:

> bin/jpf [-c config-file] {+key=value ..} app-class {app-args ..}

  -c config-file     optionally specifies the java.util.Properties file
                     that should be used for JPF configuration
                     (default is 'jpf.properties')
  +key=value         is a convenient way to override configuration properties
                     via the commandline

Please note that the old -show option has been superceeded by the new reporting subsystem (e.g. the +jpf.report.console.start=...:config property) and is not supported anymore

A pure Java replacement for that shell script is available as the class RunJPF in the Java PathFinder install root. Simply replace "bin/jpf" above with "java RunJPF" to use this alternative. More information is available by running "java RunJPF" with no arguments.

RunJPF does not, however, tweak the host VM settings, as VM_ARGS does in the bin/jpf script. Thus, when directly starting your host VM (the "java" command) from the command line, it is wise to increase the maximum heap size with the -Xmx VM argument (e.g. -Xmx1024m).

One can also set up the required classpaths oneself and directly invoke gov.nasa.jpf.JPF as the Java main:

> java {vm-args..} gov.nasa.jpf.JPF jpf-args

To setup the classpath, make sure the following code is reachable, either by setting the CLASSPATH environment variable, or by using the -classpath VM command line argument

JPF can also be used embedded (e.g. an IDE), i.e. called from another Java application. The jpf/src/gov/nasa/jpf/tools/ directory contains various examples, e.g. the ExecTracker application that logs various aspects of JPF execution. A basic code sequence to start JPF looks like this:

import gov.nasa.jpf.JPF;
import gov.nasa.jpf.Config;
import gov.nasa.jpf.SearchListener;
import gov.nasa.jpf.VMListener;

void runJPF (String[] args) {
   ..
   MyListener listener = new MyListener(..);
   listener.filterArgs( args);  // 'null' any consumed args not to be JPF-processed
   ..
   Config config = JPF.createConfig( args);
   // set special config key/value pairs here..

   JPF jpf = new JPF( config);
   jpf.addVMListener( listener); // or addSearchListener
   jpf.run();
   ..
}

If you run JPF from outside it's directory structure, e.g. from within a different project, there is one preferred way to tell it where to look for its default configuration file(s) - the jpf.basedir property. Assume you run JPF from within project MyProject, which happens to be a sibling directory of where JPF is located:

  ..
  <your-jpf-dir>/
    bin/
      jpf               --- shell script to run JPF
    build/
      jpf/              --- where the JPF core classfiles are 
      env/jvm/          --- where the MJI models are
      ..
    default.properties  --- the default configuration file
  ..
  MyProject/
    my-jpf.properties   --- the mode/application property file(s)
    ..

Then you want to run JPF by either giving it the jpf.basedir setting from the commandline:

> export CLASSPATH=<your-jpf-dir>/build/jpf:\
                   <your-jpf-dir>/build/env/jvm:\
                   <your-jpf-dir>/lib/bcel.jar
                 ...
> cd MyProject
> java gov.nasa.jpf.JPF +jpf.basedir=../<your-jpf-dir> ...

or specify it in a mode/application property file (e.g. my-jpf.properties). If you use the provided <your-jpf-dir>/bin/jpf script to start JPF, you don't have to set the CLASSPATH explicitly.

The same applies to Eclipse launch configurations: