views:

961

answers:

4

I have a project that uses generics and a few Java 1.5/6 bits and pieces. Is it possible to compile this code to work on a system running a 1.4 JRE?

I use an ANT build script and javac task to compile the library. This builds fine while the target attribute is 1.5.

If I change the target to be 1.4 I get the following error:

generics are not supported in -source 1.4 
(use -source 5 or higher to enable generics)

So I add a source attribute and try a value of 5 and 1.5. New error:

javac: source release 5 requires target release 1.5

Am I going to have to go through all my code and change the 1.5 stuff to make this work?

A: 

Generics are implemented by type erasure so they should work before generics were introduced. However you would be unable to compile the code with an older version of the compiler (I don't know why you would want to do that)

ggf31416
Using JDK 1.6 compiler. Just seems strange that you can specify the target version and source version but it gives an error if these aren't the same.
Adrian Hope-Bailie
You can specify an earlier source version than target version. So your 1.4 source with Enumerations called enum can still compile and work on in-service-life JDKs unmodified.
Tom Hawtin - tackline
+6  A: 

I've not used either of these solutions, but there is

  1. Retroweaver
  2. specifying the unsupported -target jsr14 may work
  3. Retrotranslator
  4. Declawer
  5. JBossRetro

You might also find javac -XD-printflat useful (though take care not to overwrite your original source).

Stephen Denne
Second one seems to work. Now to test that the library actually works on JRE 1.4...
Adrian Hope-Bailie
jsr14 is not gonna cut it. No enum support. Retroweaver on the other hand is great.
Adrian Hope-Bailie
Thanks, I was only aware of Retroweaver until now. Most of those tools explicitly state that they can target 1.4, but as far as I can see only Retroweaver allows you to target 1.2 as well, which might be needed for J2ME development.
Brian Schimmel
+6  A: 

I have a project that uses generics and a few Java 1.5/6 bits and pieces. Is it possible to compile this code to work on a system running a 1.4 JRE?

No.

Am I going to have to go through all my code and change the 1.5 stuff to make this work?

Yes. But there's a way to automate that, using a tool called Retroweaver. There's no guarantee that it will catch everything though.

Michael Borgwardt
+1  A: 

I have had good experience with Retrotranslator (retroweaver did not work well with what I was needing, cannot remember exactly what).

It worked very well for my purpose (creating JDK1.4 versions of Logback).

http://retrotranslator.sourceforge.net/

Thorbjørn Ravn Andersen