Difference between revisions of "Frequently Asked Questions"

(Development: new question: how to investigate NoSuchMethodErrors?)
Line 321: Line 321:
= Development =
= Development =
== Why do I get a NoSuchMethodError/NoSuchClassDefFoundError when running a rebuilt plugin? ==
This is most likely caused by version skew, i.e. when an incompatible version of a build dependency is installed. Example: if you build against ''mpicbg-1.0.0.jar'' and run that plugin in a Fiji which has only installed ''mpicbg-0.6.1.jar'', the latter might miss some methods or classes, or even contain incompatible class definitions.
To investigate, you can use <code>mvn dependency:copy-dependencies</code> on the command-line (to copy all build dependencies into ''target/dependency/'') and then use your favorite Zip tool to look for the class name mentioned in the exception. In Eclipse, you can simply use Ctrl+Shift+T (or Command+Shift+T on MacOSX) to look open the respective class; If a recent enough Eclipse is used, and the default settings have not been tampered with, this will start downloading and show the source attached to the dependency.
Once you know which dependency is supposed to contain the class/method, compare the version number of the file(s) in ''ImageJ.app/plugins/'' and ''ImageJ.app/jars/''.
Sometimes, classes are contained in multiple ''.jar'' files. This is a frequent source of problems e.g. when some developers try to be helpful and include dependencies' classes into their plugin ''.jar'' files. This is a problem because those class files are naturally not updated when the dependency is installed as a proper, separate ''.jar'' file and updated. To investigate such issues, use the ''Find Jar For Class'' command in Fiji, to determine which ''.jar'' file serves the class you are looking for.
== What is Maven, and why did you pick it? ==
== What is Maven, and why did you pick it? ==

Revision as of 04:01, 13 March 2015



The image I loaded is displayed all black! But it is not black!

This problem usually arises when 12-bit or 14-bit images are loaded into ImageJ without autoscaling. In that case, they are treated as if they were 16-bit images, and therefore the dynamic range is all wrong. You can fix this by clicking on Image>Adjust>Brightness/Contrast... and hitting the Auto button.

The image colors do not match what I see in other programs! ImageJ is wrong!

In many cases, ImageJ performs autoscaling by default, to improve the contrast of your image. Otherwise, in many cases with scientific images you might see only a black square (see previous question).

You can override the autoscaling using the Brightness/Contrast dialog.

It is important to understand that your image is a collection of samples, each of which has a numerical intensity value. The unit of these values is rather arbitrary and unspecified, depending on the type and calibration of your detector. Your file is stored with a certain bit depth, meaning these intensities can range from 0 (no light detected) to a particular maximum value (the most light the detector is capable of detecting). For example, 8-bit images have a maximum value of 255, whereas 16-bit images have a maximum of 65535. In practice though, especially with higher bit depths, your detector will not typically record sample intensities across that entire range of values (and if it does record a significant number of values at the maximum, you probably oversaturated your detector, which will skew your analysis!).

Because the full range of values is typically much less than the maximum—e.g., in the case of a 12-bit detector the actual maximum range is 0-4095, and often even smaller in practice—ImageJ performs autoscaling to show you a meaningful or "pretty good" image by default, which is not just a black square (see previous question). That is: it maps the darkest actual intensity in your data to black, and the brightest actual intensity in your data to white. You can override this mapping using the Brightness/Contrast dialog under the Image>Adjust menu (shortcut: Shift+C).

Alternately, to disable autoscaling during initial import, you can use the Bio-Formats plugin to import your data with the "Autoscale" option turned off:

  • File > Import > Bio-Formats
  • Choose your file
  • Uncheck the "Autoscale" box
  • Click OK
  • The data will be scaled to match the maximum of the bit depth, rather than autoscaled.

Further reading:

How do I apply an operation or macro to multiple images?

See the Batch Processing page.

Mac OS X

Why does ImageJ crash frequently?

This is most likely an AWT issue with Apple's version of Java 6. There is even a bug in our bug tracker about it. The problem is that we did not manage to find a work-around because the bug appears to be in the MacOSX-specific part of the Java Virtual Machine that was provided by Apple. It seems to be related to opening new windows while mouse updates are processed, though. If you have this issue, or find out what causes it, please comment on this bug report.

How do I set up Java 6 on OS X?

Newer versions of OS X come without Java installed, and only Java 8 is available from java.com.

However, users can reinstall Java 6 on OS X by following these instructions.

Alternately, if you are a developer looking to install the Java 6 Development Kit, you must log in to Apple Developer downloads with your Apple ID, search for "java for os x" and download the latest package ("Java for OS X 2013-005 Developer Package" at the time of this writing).

At any time, you can verify which Javas are installed on your system using this script.

How do I run ImageJ on Yosemite?

There is a known issue where Java 6 is required on OSX. As Java 6 is no longer shipped with Yosemite this creates problems.

There is a fix currently in testing. You can replace the Fiji.app/Contents/MacOS/ImageJ-tiger file with an updated version. Please make sure the updated version is still marked as executable. If this fixes the problem for you, please comment on GitHub or send us a mail to let us know that it worked.

If the updated launcher does not work for you, as a temporary workaround you can install Java 6.


How do I launch ImageJ with a different version of Java?

On Windows

Install Java 7, and delete or rename the ImageJ.app\java and/or ImageJ.app\jre folders, if they exist.


Use the --java-home command line option:

/Applications/ImageJ.app/Contents/MacOS/ImageJ-macosx --java-home \

On Linux

Use the --java-home command line option:

$HOME/ImageJ.app/ImageJ-linux64 --java-home \

One downside of doing this is that ImageJ will launch in a separate process, which has some unintuitive side effects. For example, Ubuntu's Unity user interface will not allow you to "Pin to Launcher" in this case...

How do I setup a launcher app for OS X for running with a different JVM version?

Start Automator and select to create an Application. Double-click Run Shell Script in the Library/Utilities folder and replace the text content — cat — with the following:

open -a "Fiji.app" --args --java-home \

Save anywhere you like.

To replace this application's icon, Get Info on your real Fiji, click on the icon on the top left, press Cmd-C, Get Info on your Fiji Automator app, click the icon, and press Cmd-V.

You will then see two icons in the dock, the one of the launcher app and the one of Fiji when it's running.

(based on this guide)

What is this headless mode and what do I need it for?

The term headless refers to running ImageJ without a graphical desktop, e.g. on a cluster. See the Headless page for more information.

How do I avoid running out of memory (OutOfMemoryError)?

The first thing to do is make sure that ImageJ has a large enough "maximum heap" size:

  • Edit > Options > Memory & Threads
  • Change "Maximum Memory" to something larger (at most, 1000 MB less than your computer's total RAM).

Note that in most cases, the ImageJ launcher will make an initial guess at a reasonable value: ~75% of physical RAM.

If you are already at the limits of your computer's physical memory, the next step would be to add more.

About Java garbage collection: Java always automatically calls the garbage collector when the heap is getting full [1]. While it is possible to manually invoke the garbage collector by clicking ImageJ's status bar—or programmatically by calling run("Collect Garbage") in a macro or System.gc() in a plugin—it will not solve the fundamental problem of Java actually not having a sufficient amount of memory. (The only exception to this is a rare case where Java decides that garbage collection is happening too slowly, in which case you should see the message "GC overhead limit exceeded" [2]).

Why does ImageJ not release any memory back to the system?

This is a characteristic of the Java runtime. In many cases, Java never releases memory back to the system, so memory monitors such as Windows Task Manager will always report an ever-growing amount of RAM used by the Java process, until the JVM shuts down.

The best way to monitor ImageJ's actual memory usage is to run the Monitor Memory... command. You can also click on the ImageJ status bar to trigger a garbage collection operation, which will typically decrease the memory use.

That said, some articles suggest that you can cause Java to give back free memory to the OS under certain conditions; see:

To be clear, Java does reuse memory when you close and reopen images. The behavior described above is not a memory leak per se. In my lab we leave ImageJ running for days or weeks at a time doing batch processing and it works just fine.

See also:

How do I run ImageJ in debug mode?

See Debugging intro#Launching ImageJ in debug mode.


How can I verify that my ImageJ is really 100% up to date?

ImageJ will report itself as "up to date" as long as all files installed in your ImageJ match the latest versions from the remote update sites. However, there are cases where your ImageJ may report itself as "up to date" but still be missing critical files, or have mismatching versions (e.g., the dreaded "NoSuchMethodError").

To be certain, run Help > Update, and click the "Advanced mode" button. Then verify the following View Options:

  • View uninstalled files only: Shows files that are available from remote ImageJ update sites, but not installed in your ImageJ. Consider changing the "Status/Action" to "Install" for these items, especially any .jar files that are flagged with "Not installed" status.
  • View locally modified files only: Shows files that have been edited locally (i.e., do not match any version from the remote update sites). Consider changing the "Status/Action" to "Update" for these items, especially any .jar files that you did not intentionally modify.
  • View local-only files: Shows files that are not known at all to the remote update sites. These files were likely added manually (e.g., if you installed additional plugins manually; see "How do I install additional plugins" below). Consider deleting these files if you do not need them, especially any .jar files of unknown origin or conflicting file names.

If you flag any changes to be made, press the "Apply changes" to update your ImageJ. And after restarting ImageJ, you might want to run Help > Update again to make sure everything looks the way you expect!

How do I install additional plugins?

If the plugin is published on an ImageJ update site, you can run Help > Update then click the Manage update sites button to enable it. Not only does this install the plugins for you automatically, but you will also be notified of any updates whenever they are released.

Otherwise, you can drag 'n drop the .jar files onto the ImageJ window, or use Plugins>Install Plugin... with .jar, .class and .java files, or copy the plugins to ImageJ.app/plugins/ and restart ImageJ. See the walk-through with screenshots.

My plugin runs fine in the Script Editor, but it does not show up in the menus when I install it. What's wrong?

To be picked up as a plugin, the .jar's file name must contain an underscore, and it either needs to contain an appropriate plugins.config file or the class name needs to contain an underscore, too.

The safest way to ensure these conventions is to use the File>Export as .jar file menu item.

I tried to update ImageJ via Help>Update, but it throws an exception instead?

The easiest way to get back a functional updater is to import this URL via File>Import>URL....

If that does not work, please delete the files ij-ui-swing-updater-2.0.0-SNAPSHOT.jar, ij-updater-core-2.0.0-SNAPSHOT.jar and ij-core-2.0.0-SNAPSHOT.jar from the ImageJ.app/jars/ directory (MacOSX users, ^ Ctrl+click on the ImageJ icon and select Open Package Contents and open the jars/ directory you see there). After that, the Updater should magically repair itself.

If that still fails, please download a fresh copy from here.

I updated ImageJ via Help>Update, and now it does not start anymore!

You may have been bitten by a bug in the updater that is already fixed (but you did not get the fix in time). Please follow these instructions.

The Updater always says Connection refused. Maybe it does not use the proxy?

Indeed, an earlier version of the Updater does not use your system-wide network proxy settings. This is fixed in the meantime, but you need to update the updater using this script (just download it and open it in ImageJ).

Alternatively, you can update the updater manually like this:

  • open the Script Editor with File>New>Script
  • set the language to Beanshell in the Language menu of the editor
  • paste the following code (and adjust it to match your settings):
import ij.IJ;

System.setProperty("java.net.useSystemProxies", "true");
IJ.run("Update Fiji");
  • run the script via the Run menu

I updated to Ubuntu 11.04 and now I no longer see the Title bar when I close ImageJ

I can no longer move any windows or use the X button on the title bar to close them (the window decorations all disappear).

If you are really on Ubuntu 11.04, an update should fix the problem. If you are not on Ubuntu 11.04, or if the update does not fix the problem, please read on for possible workarounds.

This is not a ImageJ problem but a bug in the NVIDIA driver. One solution is described in: http://www.pendrivelinux.com/ubuntu-desktop-effects-fixing-the-missing-titlebar/

Edit (as root) the file /etc/X11/xorg.conf and add the following 2 options in Section "Device" before the EndSection line:

  Option "AddARGBVisuals" "True"
  Option "AddARGBGLXVisuals" "True"

The above eases the problem but does not completely solve it. The solution will be an updated driver from NVIDIA when it is available. If you choose to remain with Unity or Ubuntu Classic, you may log out and then log in again when the problem appears. You can also restart the window manager without logging out by running

  compiz --replace &

in a terminal. This restores the window decorations but all windows from all virtual desktops end in the first one.

Another solution is to install Unity-2D and choose it when you log in. This seems to work well. It also solves a number of general display problems.


Will ImageJ1 macros, plugins and scripts still work in ImageJ2?

Yes. We are completely committed to 100% backwards compatibility with ImageJ1. ImageJ2 includes the latest version of ImageJ1 "under the hood" so that existing macros, plugins and scripts will still run the same as before.

ImageJ2 user interfaces are just plugins; ImageJ2 runs with the "ImageJ1 legacy UI" by default. But we have also created a new ImageJ2 user interface modeled after ImageJ1 to a very large extent, with all the same shortcut keys and behaviors whenever possible. Either way, ImageJ2 looks and feels like ImageJ1, but with a powerful new infrastructure allowing it to process a wider variety of image data more quickly and easily.

Does ImageJ2 support the ImageJ macro language? Is it deprecated?

Thanks to the ImageJ legacy layer, ImageJ1 macros will run unchanged in ImageJ2, while also allowing to harness ImageJ2's new parameterized scripting paradigm—something that was previously not possible with the macro language.

The ImageJ1 macro language has been extremely useful to many users. However, it has a substantial limitation: its functions are separate from those available from Java and the other scripting languages.

In ImageJ2, the goal is to provide one unified set of functions, which is fully accessible from Java and all scripting languages. Hence, ImageJ2 plugins and scripts are more flexible than ImageJ1 plugins and macros. They can run headless on a server, and are accessible from various applications such as CellProfiler, KNIME, OMERO, and headless from the command line. We would encourage newly developed scripts and plugins to use the ImageJ2 API since it offers these advantages, but the ImageJ1 API will remain accessible, too.

Can I call ImageJ1 API from an ImageJ2 command?

Yes, although it is not recommended. You will lose most of the advantages of ImageJ2 if you embed calls to ImageJ1 within your command. ImageJ1 is rather tightly coupled to AWT and hence does not work well headless. For details, see the Headless page.

Can I call ImageJ2 API from an ImageJ1 plugin?

Yes, see the call-modern-from-legacy tutorial example.


How do I install Fiji?

The installation of Fiji is described on specific pages for MacOSX, Windows and Linux.

How do I turn my ImageJ installation into a Fiji one?

Fiji is just ImageJ. If you are running ImageJ2, simply run Help > Update, click Manage update sites, and enable the Fiji update site.

Or if you are running ImageJ1, you can bootstrap the updater by drag 'n dropping this link onto your running ImageJ and run the Javascript that was opened in a text window. After that, you can run Fiji/ImageJ using the ImageJ launcher that was installed into the ImageJ directory.

How do I develop Fiji in Eclipse?

Please refer to the page Developing Fiji in Eclipse.

How can I build Fiji from the command-line?

Download and build it. You need Git for that (if you are on Windows, please use Git for Windows).

How do I install a Fiji plugin into vanilla ImageJ 1.x?

Doing this is not recommended:

  • Fiji plugin authors test their plugins in Fiji, not vanilla ImageJ 1.x.
  • An increasing number of plugins use features of ImageJ2, which are not available in ImageJ 1.x.
  • If you install multiple plugins with complex dependency chains in this manner, you may have dependency version conflicts. For things to work, you will need to ensure that all the library versions are compatible. The Fiji maintainers have already solved this problem for the Fiji distribution.

So you could save yourself a lot of pain by using Fiji instead.

That said, you can install a Fiji plugin in a vanilla ImageJ 1.x installation, as long as you copy all its dependencies with it. You can do this as follows:

git clone git://github.com/fiji/Stitching
cd Stitching
mvn dependency:copy-dependencies

Then copy target/dependency/*.jar into your ImageJ installation.

You will need Git and Maven installed for this to work.

3D Viewer

The 3D Viewer opens a window saying An unexpected exception occurred.

If in the same window, it also says:

java.lang.NullPointerException:Canvas3D: null GraphicsConfiguration

the reason is most likely that your graphics setup does not have any hardware 3D acceleration. This can happen e.g. when you run ImageJ via a remote X11 connection (3D acceleration works only when the graphics are displayed on the same machine as the program runs).

Unfortunately, there is not workaround/fix for this situation yet, except to use ImageJ locally when you want to use the 3D Viewer.

Problem with Intel graphics cards

There is a known problem with older Windows drivers for some Intel graphics cards. Usually, this is fixed by installing new drivers. If you would like to help make ImageJ nicer by detecting faulty driver versions, please contact us.

The 3D Viewer simply crashes

Unfortunately, there are quite a large number of possible reasons. Please help us by debugging the issues and contacting us (mailing list or IRC) with the information. You can also report a bug, which will provide a lot of additional, potentially useful information.

Only a gray rectangle is shown by the 3D Viewer

As with 3D Viewer crashes, there are quite a large number of possible reasons. Please help us by debugging the issues and contacting us (preferably via mailing list) with the information. You can also report a bug, which will provide a lot of addidtional, potentially useful information.

I have a compile error building the 3D Viewer regarding a class Appearance

If you get an error similar to this:

Building plugins/3D_Viewer.jar <- src-plugins/3D_Viewer/ImageJ_3D_...
src-plugins/3D_Viewer/customnode/CustomLineMesh.java:6: cannot find symbol
symbol  : class Appearance
location: package javax.media.j3d
import javax.media.j3d.Appearance;

it means that you do not have Java3D installed. This happens typically when you have an environment variable JAVA_HOME set to an existing JDK without Java3D. Try setting JAVA_HOME to a JDK with Java3D available. If you have write permissions to the path JAVA_HOME points to, you could install Java3D manually.


How can I call ImageJ from MATLAB, or vice versa?

If you are looking to call ImageJ code from your MATLAB script, it is actually quite simple. Just embed the calls to fully qualified Java class methods directly in your scripts. MATLAB takes care of transparently converting between Java primitive types and arrays and its own matrices and cell structures. The Fiji distribution of ImageJ provides a helper program called Miji to simplify this approach even further. See the Miji page for further details.

Conversely, if you are looking to evaluate MATLAB code from within an ImageJ plugin or other Java code, MATLAB provides an interface called JMI for doing it. However, for it to work, you must launch your program from inside the MATLAB environment, so that it runs with MATLAB's JVM.


Why do I get a NoSuchMethodError/NoSuchClassDefFoundError when running a rebuilt plugin?

This is most likely caused by version skew, i.e. when an incompatible version of a build dependency is installed. Example: if you build against mpicbg-1.0.0.jar and run that plugin in a Fiji which has only installed mpicbg-0.6.1.jar, the latter might miss some methods or classes, or even contain incompatible class definitions.

To investigate, you can use mvn dependency:copy-dependencies on the command-line (to copy all build dependencies into target/dependency/) and then use your favorite Zip tool to look for the class name mentioned in the exception. In Eclipse, you can simply use Ctrl+Shift+T (or Command+Shift+T on MacOSX) to look open the respective class; If a recent enough Eclipse is used, and the default settings have not been tampered with, this will start downloading and show the source attached to the dependency.

Once you know which dependency is supposed to contain the class/method, compare the version number of the file(s) in ImageJ.app/plugins/ and ImageJ.app/jars/.

Sometimes, classes are contained in multiple .jar files. This is a frequent source of problems e.g. when some developers try to be helpful and include dependencies' classes into their plugin .jar files. This is a problem because those class files are naturally not updated when the dependency is installed as a proper, separate .jar file and updated. To investigate such issues, use the Find Jar For Class command in Fiji, to determine which .jar file serves the class you are looking for.

What is Maven, and why did you pick it?

Maven is a system to build .jar files from source code, and to manage dependencies (i.e. it is easy to specify which minimal version of, say, ImageJ is required by the source code).

We picked it because we need a standard way to interact and collaborate with other projects and with each other. For starters, it allows developers to stay with their favorite development environment (Eclipse, Netbeans, IntelliJ, etc).

For details, please refer to our page on Maven.

What is MiniMaven and why did you create it?

Please refer to the MiniMaven and Supported Compilers pages for an explanation.

How do I create a new ImageJ plugin using Maven?

Please refer to our page on Maven.

How do I upload a new release of an ImageJ plugin?

Please refer to our tutorial how to upload files.

How do I upload a new release of a core ImageJ library such as ImgLib?

The same way you do a plugin. But it will upload to the ImageJ update site (you can only upload to one update site at a time, though, see also this ticket).

What is the recommended way to develop in ImageJ?

Over the years we evolved a development style as follows:

  • create a topic branch
  • test as much as you need to be comfortable to merge
  • merge
  • deal with any fall-out

This development style has been adopted by the ImageJ team, with two additions (making the fall-out step much smaller):

  • tests are added as automated regression tests (to be run by the continuous integration whenever new changes were pushed) whenever possible.
  • merges are usually done with --no-ff, so that even fast-forwarding branches (i.e. rebased on top of master) will get a merge commit in which the branch is described more broadly.

See also coding style.

Class loading issue in 3-rd party libraries (e.g. JPPF)

Libraries trying to load resources or classes with the current thread's class loader rather than with IJ's class loader may fail. The solution is to first set the current thread's class loader to the IJ-classloader. This must be done from the same thread that will later call the problematic code:


How do I see the source code for a command?

Fiji is open source; as such, it is possible to inspect the source code for any command, in the interest of transparency and reproducibility.

Here are several ways to do so:

  1. Using the Command Finder:
    • Press L for the Command Finder.
    • Type the name of the command.
    • Press to select it.
    • Click the Source button.
    • This will open the source from the ImageJ web site online source.
    • Note: this method is very convenient, but only works for core ImageJ 1.x sources (e.g., not ImageJ2 code, not Fiji code, etc.).
  2. Using fiji.sc's search:
    • Using the Command Finder, locate your command, taking note of the Class column's value.
      • E.g., if we type "make binary" we see that the class is ij.plugin.Thresholder.
    • In your browser, type the name of the class followed by ".java"; e.g.: fiji.sc/Thresholder.java
    • This will automatically perform a search throughout all code known to fiji.sc for that source file. If there are multiple matches, you will see them all. Clicking on a match opens it in the fiji.sc gitweb interface.
    • Note: this method does a broad search and can find many things, but only Java code. If you want to search for a script instead, you will need to take note of the script argument:
      • For example, in Command Finder, if you type "scale to dpi" you will see that the "Class" is something like: Javascript.Refresh_Javascript_Scripts(".../Fiji.app/plugins//Scripts/Image/Adjust/Scale_to_DPI.js")
      • You can find this code by typing: fiji.sc/Scale_to_DPI.js
      • Scripts written in other languages work similarly.
  3. Using GitHub:
    • Using the Command Finder, locate your command, taking note of the Class column's value.
      • E.g., if we type "make binary" we see that the class is ij.plugin.Thresholder.
    • Open the relevant project in GitHub:
    • Press the T key, and type the name of the file you are looking for.
      • In the example above, this is Thresholder.java.
    • You should end up with a hit like: https://github.com/imagej/ImageJA/blob/master/src/main/java/ij/plugin/Thresholder.java.
    • This method requires that you know in which repository the code lives. However, you can combine it with the fiji.sc search method above to figure out which repository, then load the code on GitHub, if desired.
  4. Using the "Open Source for Menu Item" command:
    • Run Plugins > Scripting > Open Source for Menu Item.
      • Unfortunately, you must select this from the menu, not using the Command Finder.
    • Run the command whose source you want to see.
      • E.g., Process > Binary > Make Binary.
      • Again, select it from the menu directly, not using the Command Finder.
    • This will open the source using the fiji.sc gitweb interface.

In the future, we plan to make this easier by having one single easy command for viewing the source code.

What are "external" plugins?

As far as users are concerned, external Fiji plugins are exactly the same as internal Fiji plugins. For developers, "external plugin" simply implies that the plugin's source code is maintained in its own source code repository. For example, TrakEM2 has been an external Fiji plugin since Fiji's inception.

Where to put the jars of my plugin?

If you develop a Fiji plugin, the result will be in the form of one or more jars containing your plugin and possibly third-party libraries that you rely on. To deploy your plugin you put the jars in the plugins/ or jars/ Fiji subdirectories. The general idea is that only the jars directly containing plugin classes go into plugins/. Auxiliary and third-party jars go into jars/. (see this mail for more background on this.)

How can I call ImageJ from my software?

If your software is written in Java, we recommend using Maven to structure your project. You can then add dependencies to portions of ImageJ that are of interest to you. See the ImageJ tutorials for examples.

If your software is written in another language such as C or Python, there are many ways to integrate Java functionality. You must choose which one is best for your particular requirements.

To facilitate some use cases, we provide a script for generating a combined bundle of all ImageJ-related JARs in a single "uber-JAR" library. To use, check out the ImageJ source code and execute:

mvn -Pdeps package

For convenience, we provide a build of this combined JAR file (with suffix -all) from the latest DEVELOPMENT, UNSTABLE version of ImageJ. This build includes the latest changes on the master branch of the source repository. It has not been thoroughly tested and may contain new bugs.

In some cases, use of this JAR file is appropriate and convenient; for example, CellProfiler uses it to integrate with ImageJ. However, you should consider carefully what would be best for your project:

Advantages: A single JAR file is simpler to deploy. There is no chance of mismatched versions of multiple JAR files. It is easier to construct a Java classpath, since only a single JAR needs to be included.


  • Every time you need to update the version of ImageJ, you must redeploy the entire uber-JAR (~57 MB as of June 2014). If you bundle individual JAR components, you need only update those that changed. This issue is of particular relevant to Java applications deployed via Java Web Start, since it automatically downloads the latest available version of each JAR dependency; in that case, your application startup time will suffer if you use the uber-JAR.
  • You cannot cherry-pick only the JARs containing the functionality you need, so your application's footprint may suffer from bloat.
  • If you rely on any of the same dependencies that ImageJ does, you may run into trouble (e.g., NoSuchMethodError) with multiple copies of those dependencies on your classpath, especially if you need to use a different version of that dependency than is bundled with the uber-JAR.

As you can see, it is important to understand how use of the uber-JAR will affect your application. In particular, Java applications will likely be better served using the individual component JARs, ideally managed using a dependency management platform such as Maven or Ivy. But for non-Java applications, the uber-JAR may be sufficient to your needs.


Why is there Fiji when there is already ImageJ? And what is this ImageJ2 about?

The ImageJ, Fiji and ImageJ2 projects are very closely related. See ImageJ#Flavors for a thorough breakdown of the differences.

See also:

In short: we all collaborate, but have slightly different focus, hence the different projects and names.

How can we be sure that ImageJ1, ImageJ2 and Fiji aren't going to diverge or fork over time?

We are working to create an architecture where the programs work together and preserve compatibility. Fiji is just ImageJ with batteries included, and ImageJ2 includes ImageJ1 as-is for maximum compatibility. Fiji now uses ImageJ2 at its core. Most importantly, all involved developers are strongly dedicated to avoiding divergence—we are working closely together to ensure that ImageJ2 represents a continuation of ImageJ and Fiji, rather than a project fork.

Would it make sense to merge the ImageJ2 and Fiji projects?

Fiji and ImageJ2 are fundamentally the same software, using the same launcher. So from the standpoint of development effort, the ImageJ2 and Fiji projects have indeed merged. ImageJ2 is the core software, and several pieces of infrastructure originally developed for Fiji have now migrated to ImageJ2 (e.g., the Updater, Launcher and Script Editor components). At heart, Fiji is now a big collection of life sciences plugins (though "Fijabcolsp" doesn't have quite the same ring to it). In other words, Fiji is just an ImageJ update site ("Fijaius")—and as such, you can obtain a working Fiji installation by downloading ImageJ2, running the updater, and enabling the Fiji update site.

All of that said, we do not want to get rid of the two distinct project names, since people are familiar with both. But we are integrating resources when feasible: e.g., the ImageJ wiki and the Fiji wiki are really both the same wiki with different skins, to make cross-linking more seamless. But we want to ensure it is clear that ImageJ is not a life-sciences-specific project, whereas Fiji is. Historically, because Fiji has a life sciences focus, there have been some users who refused to switch from vanilla ImageJ1 to Fiji even though Fiji makes users' lives easier in lots of ways. With ImageJ2, we want to avoid such misconceptions.

More effort is still needed to clarify web resources, to explain concisely and clearly where people should go in different circumstances. We also have plans to make bug reporting simpler and easier across the projects.

This is a Wiki but I cannot edit it! Why?

If you create an account, you will be able to make edits while logged in.

The Wiki is lacking documentation about X, Y and Z

Please feel free to enhance the Wiki! We are thankful for all contributions!

How do I find more information about Command X?

The first place to check is this wiki. The Fiji's Menu page is especially helpful as it includes links to all the menu commands that ship as part of Fiji.

If documentation is missing for the command you're interested in, you can always view the source directly:

  1. Open the Command Finder (Shortcut: L)
  2. Filter to the command you're interested in.
  3. The `File` column will tell you the plugin where the desired command is contained.
  4. You can then use this information to find the source code on GitHub - for core ImageJ or Fiji plugins.
  5. From the appropriate project on GitHub, you can find the repository corresponding to the desired plugin.
  6. Finally, you can search for the actual file for the command of interest (Shortcut: T).

As a complete example, if you were interested in the 2D Histogram command:

I have a problem that is not covered on this page!

If you have an issue that is not mentioned here, you might want to ask on one of the mailing lists, or via IRC, or enter a bug report.

How to report issues?

Use the Help > Report a Bug command, which adds a ticket report to the Fiji bug tracker. While private mail might seem more desirable sometimes, but it is almost always inferior to the open process we established in ImageJ. For starters, bug reporters are unlikely to know who would be the best person to address the issue.

I reported an issue, but it is still not fixed! Why not?

ImageJ is an Open Source community project. The list of contributors is large but most of the people involved are not paid to work on it. We greatly value community contributions and assistance.

There are only three professional developers (User:Rueden, User:Hinerm and User:Schindelin) whose formal jobs include responding to and addressing bug reports. None of them are paid solely to fix bugs—rather, they are working to solve scientific problems and to advance the software's capabilities. And their attention is spread thin across many projects: ImageJ, Fiji, SCIFIO, SciJava, LOCI, OME, ImgLib2, OpenSPIM, SLIM Curve, Git for Windows and msysGit, NAR plugin for Maven, and others.

The organizations above total over 300 source code repositories, many of which have dozens of open issues in their issue trackers. There are also several hundred tickets in the old ImageJ issue tracker that are pending migration to GitHub Issues, as well as over a hundred open issues in the Fiji Bugzilla.

So please understand that just because we have not responded to a bug report, does not mean we are uninterested in fixing it. It's just that we are very busy, and can use all the help we can get!

If you want to increase the chances of your issue being worked on, you can:

See the bug reporting best practices article for details.

How do I contribute a bug fix or patch, or propose an idea for a change?

See the Contributing page!


Why do you program in Java? Is C++ not much faster?

See the Philosophy page!

With Oracle buying Sun and Apple deprecating Java, does Java have a future?

Yes. Java is one of the most popular programming languages and still one of the top choices for high-performance, cross-platform applications. Oracle is unlikely to attempt to "kill" Java, but even if they tried they probably couldn't—OpenJDK is open source and there is a massive community of Java developers behind it. Now that Apple is partnering with Oracle and the OpenJDK community, we are likely to see Java on Mac OS X get better, not worse. Java's popularity will eventually wane, but not because of any company's actions now. Rather, as with any programming language, new technologies will emerge and gain popularity, over a course of many years.

Why does ImageJ still target Java 6?

As of June 2014, around 19% of Mac OS X systems still run version 10.6 Snow Leopard or older [1]. (In December 2013, it was around 25%.) Unfortunately, Apple and the OpenJDK developer community decided to target OS X 10.7 Lion and above for Java 7. For the time being, to avoid abandoning older machines which cannot be upgraded from Snow Leopard, ImageJ continues to target Java 6.

Furthermore, updating the required version to a newer version of Java would necessitate improvements to the ImageJ Updater such that it could also update the bundled version of Java, which would be a substantial undertaking. Otherwise, most existing installations of ImageJ would stop working, and those users would need to download ImageJ from scratch again.

See this mailing list thread for further details.

How are you addressing the fact that with increased modularity comes increased complexity?

See the Philosophy page!

How about a version of ImageJ for the web browser, mobile devices, etc.?

While a pure web version of ImageJ would be desirable for a number of reasons, there are several substantial challenges with current technology. In particular, it would be difficult for a Javascript-based ImageJ to maintain compatibility with existing plugins, macros and scripts. For now, our goal is to continue improving the Java version of ImageJ, while remaining cognizant of developments in the web applications domain, to reduce the difficulties of a web version at some future date.

We are developing ImageJ with a careful eye toward modularity, avoiding gratuitous dependencies—particularly on AWT, which is not available on most mobile devices. We hope this approach makes it easier to port ImageJ to additional platforms in the future.

A shorter term pragmatic solution would be an ImageJ web client that connects to a remote server running ImageJ in headless mode, which does the heavy lifting. See also the [openmicroscopy.org/info/omero OMERO project].

Why is open software vital to science?

See the Open Source page!