Skip to content

Stale ome-jai exclusion from ome-codecs breaks JPEG-2000 decoding (scifio dropped jai-imageio-jpeg2000 in 0.48.0) #312

Description

@NicoKiaru

Summary

pom-scijava excludes org.openmicroscopy:ome-jai from org.openmicroscopy:ome-codecs. The exclusion was correct when it was added in 43.0.0, but its premise expired with scifio 0.48.0. As a result, nothing on the classpath provides the com.sun.media.imageioimpl.plugins.jpeg2000.* classes that ome-codecs requires, and JPEG-2000 decoding is broken — in downstream builds and, since the 2026-07-16 update-site rebuild, in Fiji itself.

Symptom for end users: opening any JPEG-2000-compressed file (e.g. Olympus .vsi) fails with

The JAI Image I/O Tools are required to read JPEG-2000 files.

The stale premise

pom-scijava master, lines 4186-4195:

<dependency>
    <groupId>org.openmicroscopy</groupId>
    <artifactId>ome-codecs</artifactId>
    <version>${org.openmicroscopy.ome-codecs.version}</version>
    <exclusions>
        <exclusion>
            <!--
            Conflicts with com.github.jai-imageio:jai-imageio-jpeg2000,
            which io.scif:scifio depends on as of version 0.47.0.
            -->
            <groupId>org.openmicroscopy</groupId>
            <artifactId>ome-jai</artifactId>
        </exclusion>
    </exclusions>
</dependency>

io.scif:scifio no longer depends on com.github.jai-imageio:jai-imageio-jpeg2000. Checking the released poms:

scifio depends on jai-imageio-jpeg2000?
0.45.0 no
0.46.0 no
0.47.0 yes (1.4.0) — the version the comment refers to
0.48.0 no — dependency removed again
0.49.0 no

And the corresponding pom-scijava versions:

pom-scijava scifio.version excludes ome-jai?
42.0.0 0.46.0 no
43.0.0 0.47.0 yes — correct at the time
44.0.0 0.48.0 yes — no longer correct
45.1.0 0.49.0 yes — no longer correct
45.1.1-SNAPSHOT (master) 0.49.0 yes — no longer correct

So from 44.0.0 onward the exclusion removes the only provider of the JPEG-2000 codec without anything taking its place.

Why scifio-jai-imageio does not cover it

io.scif:scifio-jai-imageio does ship a JJ2000 implementation, but under relocated package names (io.scif.jj2000.*, io.scif.media.*). ome-codecs' ome/codecs/services/JAIIIOServiceImpl hard-references the original coordinates:

com.sun.media.imageioimpl.plugins.jpeg2000.J2KImageReader
com.sun.media.imageioimpl.plugins.jpeg2000.J2KImageWriter
com.sun.media.imageio.plugins.jpeg2000.J2KImageReadParam
com.sun.media.imageio.plugins.jpeg2000.J2KImageWriteParam

(from javap -c on ome-codecs 1.1.3)

The relocated classes therefore cannot satisfy it. Only ome-jai (and com.github.jai-imageio:jai-imageio-jpeg2000) provide com.sun.media.imageioimpl.plugins.jpeg2000.

Impact on Fiji

The Fiji update site was rebuilt on 2026-07-16 22:11:37, obsoleting 150 files. jars/ome-jai-0.1.5.jar is now recorded in https://sites.imagej.net/Fiji/db.xml.gz with no current <version> element — i.e. removed from the site:

<plugin filename="jars/ome-jai-0.1.5.jar">
    <previous-version timestamp="20250408132205" timestamp-obsolete="20250805105728" filename="jars/ome-jai-0.1.4.jar"/>
    <previous-version timestamp="20250805105727" timestamp-obsolete="20260716221137" filename="jars/ome-jai-0.1.5.jar"/>
</plugin>

This looks like a side effect of the exclusion rather than an intentional removal: of the 150 files obsoleted in that same upload, every other one was an ordinary version bump with a successor still on the site (imglib2-7.1.58.0.0, scijava-common-2.100.02.100.1, bigdataviewer-core-10.6.410.6.11, ...). ome-jai-0.1.5.jar is the only one with no replacement.

Meanwhile jars/ome-codecs-1.1.3.jar is still live on the site, so Fiji currently ships the codec front-end with no back-end. jai-imageio-jpeg2000 appears zero times in the site database, and jars/jai_imageio-1.0.1.jar and jars/jai-imageio-core-1.3.1.jar are themselves already obsoleted.

Scanning a current Fiji installation (666 jars in jars/) for the required class:

$ for j in *.jar; do unzip -l "$j" | grep -q "com/sun/media/imageioimpl/plugins/jpeg2000/J2KImageReader.class" && echo "PROVIDES: $j"; done
PROVIDES: ome-jai-0.1.5.jar

Exactly one provider, and the updater uninstalls it on every update. Marking it "keep installed" in the updater restores JPEG-2000 reading (it then shows as Obsolete), which confirms the missing class is the whole problem.

This affects all Fiji users reading JPEG-2000 data, not just one plugin.

Suggested fix

Either:

  1. Drop the exclusion — since scifio 0.48.0 there is no longer a conflicting jai-imageio-jpeg2000 on the classpath, so ome-codecs can simply bring its own ome-jai again; or
  2. Manage com.github.jai-imageio:jai-imageio-jpeg2000 explicitly in pom-scijava and keep the exclusion, if that implementation is preferred.

Option 1 restores the pre-43.0.0 behaviour with the smallest change. Whichever is chosen, ome-jai (or its replacement) will also need to be put back on the Fiji update site.

Environment

  • pom-scijava 45.1.0 and 45.1.1-SNAPSHOT (master)
  • scifio 0.49.0, ome-codecs 1.1.3, bio-formats 8.5.0
  • Fiji (Fiji-Latest update site), Windows 11, Java 21

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions