Build a custom GUI runner

Since version 0.8.0, MATSim comes with a simple GUI that starts upon double-clicking the matsim.jar file. The GUI requests a config file, and then lets users run a simulation by starting org.matsim.run.Controler with the specified config file as argument. Contribs are able to re-use the GUI infrastructure to provide a version of the GUI that starts their own, specialized Controler.

How to create a GUI that runs a special class

Prepare your main class that should be started to run your simulation:

public class MySuperSimulation {
  public static void main(String[] args) {
    String configFilename = args[0];
    Controler controler = new Controler();
    // setup controler or do other custom stuff
    controler.run(configFilename);
  }
}

Create a new class, acting as the main class when double-clicking the jar-file. This class essentially only runs one command to start the GUI and specifies which main class should be started by the GUI:

import org.matsim.run.gui.Gui;
public class MySuperSimulationGUI {
  public static void main(String[] args) {
    Gui.show("MATSim: My Super Simulation", MySuperSimulation.class);
  }
}

Modify the pom.xml in your contrib to include the following settings. Make sure to specify the correct class name for your GUI class.

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <configuration>
        <archive>
          <manifest>
            <mainClass>org.matsim.contribs.mySuperContrib.MySuperSimulationGUI</mainClass>
          </manifest>
        </archive>
      </configuration>
    </plugin>
  </plugins>
</build>

And then, build a release. First, make sure that all required dependencies (including MATSim-core) are maven-installed, e.g. do mvn install -DskipTests=true for all required dependencies. Then change to the directory of your project, e.g. cd /path/to/matsim/contribs/mySuperContrib/. Perform a Maven clean (mvn clean) first, followed by mvn -Prelease -DskipTests=true. This will result in a zip file in the target-directory which includes the clickable jar-file.