UnsupportedClassVersionError workaround hack

I tried to run an “iText toolbox” tool but got:

Exception in thread "main" java.lang.UnsupportedClassVersionError:
com/lowagie/toolbox/Toolbox (Unsupported major.minor version 49.0)

In the target environment, upgrade of Java is out of question. Therefore, I had a choice:

* recompile the library, or
* force Java to accept the older version class.

The second way is more fun. And unexpectedly not hard. The search on “java class format” revealed the specification. A fix is very simple: just two shorts, one is minor version and one is major, and no checksum. A Python program:

MINOR = 0x00
MAJOR = 0x2e00 # Not 0x2e: big-endian Java vs Intel CPU

import sys, struct
s_version = struct.pack('2H', MINOR, MAJOR)

def fix_file(fname):
  h = open(fname, 'r+')
  h.seek(4)
  h.write(s_version)
  h.close()

for fname in sys.argv[1:]:
  fix_file(fname)

The not-so-robust program fixes a set of files, which are given as command line arguments.

To fix classes in jar:

$ rm -rf com/ META-INF/
$ jar xf ../iText-toolbox-2.1.7.jar 
$ find . -name '*.class' -print0 | xargs -0 python set-class-version.py
$ jar cf iText-toolbox-2.1.7-olpa.jar com/ META-INF/

It worked!

Unfortunately, I got a new problem: the toolbox uses java.awt....Desktop, which appeared after Java 1.3. Therefore, there was a reason why a more recent version of Java required. And therefore, I had to modify the source code for my needs. But anyway, I liked the experiment.

Leave a Reply