Fiji is a community effort. So we are happy whenever we see new people developing Fiji!
The purpose of this tutorial is to get you started hacking on Fiji's source code (i.e., the core Fiji plugins). If you need to develop a new plugin for ImageJ, you do not actually need Fiji's source. Rather, see these resources:
- minimal-ij1-plugin project template
- Introduction into Developing Plugins tutorial
- Developing ImageJ 1.x plugins with NetBeans screencast
See also Developing Fiji in Eclipse for a tutorial specific to the Eclipse IDE.
The ImageJ launcher
There is a program called "ImageJ-win32.exe", "ImageJ-linux64" or similar in Fiji's root directory. Its main purpose is to load a Java virtual machine with known-good options, and then launch ImageJ.
However, it is much more powerful than that. Amongst other things, you can
- Open images: ./ImageJ-<platform> example.jpg
- Call the Jython interpreter: ./ImageJ-<platform> --jython (the classpath will be the same as when calling ImageJA), and likewise --jruby, --bsh and --js for the respective language's command-line interpreters
- Run Fiji with the system Java instead of its own one: ./ImageJ-<platform> --system. But beware: this might fail since some plugins need at least Java 1.5, and the 3D viewer needs Java3D.
- Show the java command line instead of running Fiji: ./ImageJ-<platform> --dry-run
- Compile a Java class: ./ImageJ-<platform> --javac example.java
- Run a Java class' main() method: ./ImageJ-<platform> --main-class=example
- Pass some Java options: ./ImageJ-<platform> -server -- (everything that comes before a -- is interpreted as Java option)
- Add . to the classpath and execute the given class' main() method: ./ImageJ-<platform> Example.class
- Link Fiji into the PATH: ln -s $(pwd)/ImageJ-<platform> $HOME/bin/fiji && fiji
- Start Fiji and run a menu entry directly: ./ImageJ-<platform> --run System_Clipboard (the underscore was used in place of a space to avoid having to quote the argument)
The ImageJ launcher can do more, just call ./ImageJ-<platform> --help for a short description.
Fiji is organized into a set of Maven projects. For convenience and speed, there is SciJava's minimal Maven-lookalike MiniMaven to build Fiji, but it is recommended to use an Integrated Development Environment, or at least real Maven.
It is strongly recommended to write regression tests (also known as unit tests). It is easy.
Furthermore, it is highly recommended to write and run unit tests in an Integrated Development Environment for efficient debugging.
You may also want to measure the code coverage of your tests - one way is described in the page Code Coverage in Fiji.
At some point, you might want to debug whatever you wrote. There's a small Debugging intro page.
When you want to discuss your changes to some Fiji component, the preferred way is to inline a patch and send it to the fiji-devel mailing list. You can also send a link to your repository, e.g. a fork of the Fiji repository on github.com, but then commenting is not as easy (and the discussion will involve fewer developers).
Please have a look at the excellent How to contribute to an existing plugin or library tutorial.
A plugin wants to be used. Therefore you want to give users some information about it, and most likely also a tutorial how to use it.
If you have an account on this Wiki, you can easily create new tutorials with the Tutorial Maker.
Further reading for developers
- Overview of Fiji's source code
- Description of ImageJ's plugin architecture
- Tips for developers
- ImageJ1 Javadoc ZIP (for offline usage)
- ImageJ2 Javadoc ZIP (for offline usage)
- Developers HowTo
- ImageJ plugin writing tutorial
- ImageJ programming tutorials
- Uploading plugins
- Developing Fiji in Eclipse
- Project ideas
- Code Coverage in Fiji
- Introduction to debugging
- Profiling Java Code
- Tips for C++ developers