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.5 → 8.0.0, scijava-common-2.100.0 → 2.100.1, bigdataviewer-core-10.6.4 → 10.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:
- 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
- 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
Summary
pom-scijavaexcludesorg.openmicroscopy:ome-jaifromorg.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 thecom.sun.media.imageioimpl.plugins.jpeg2000.*classes thatome-codecsrequires, 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 withThe stale premise
pom-scijava master, lines 4186-4195:
io.scif:scifiono longer depends oncom.github.jai-imageio:jai-imageio-jpeg2000. Checking the released poms:jai-imageio-jpeg2000?And the corresponding pom-scijava versions:
scifio.versionome-jai?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-imageiodoes not cover itio.scif:scifio-jai-imageiodoes ship a JJ2000 implementation, but under relocated package names (io.scif.jj2000.*,io.scif.media.*).ome-codecs'ome/codecs/services/JAIIIOServiceImplhard-references the original coordinates:(from
javap -conome-codecs1.1.3)The relocated classes therefore cannot satisfy it. Only
ome-jai(andcom.github.jai-imageio:jai-imageio-jpeg2000) providecom.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.jaris now recorded inhttps://sites.imagej.net/Fiji/db.xml.gzwith no current<version>element — i.e. removed from the site: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.5→8.0.0,scijava-common-2.100.0→2.100.1,bigdataviewer-core-10.6.4→10.6.11, ...).ome-jai-0.1.5.jaris the only one with no replacement.Meanwhile
jars/ome-codecs-1.1.3.jaris still live on the site, so Fiji currently ships the codec front-end with no back-end.jai-imageio-jpeg2000appears zero times in the site database, andjars/jai_imageio-1.0.1.jarandjars/jai-imageio-core-1.3.1.jarare themselves already obsoleted.Scanning a current Fiji installation (666 jars in
jars/) for the required class: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:
jai-imageio-jpeg2000on the classpath, soome-codecscan simply bring its ownome-jaiagain; orcom.github.jai-imageio:jai-imageio-jpeg2000explicitly 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