Bug 52979

Summary: [Compiler] Code compiled against JDK 1.5 does not run in jdk 1.4
Product: [Eclipse Project] JDT Reporter: Jim Adams <Jim.Adams>
Component: CoreAssignee: Philipe Mulet <philippe_mulet>
Status: RESOLVED DUPLICATE QA Contact:
Severity: normal    
Priority: P3    
Version: 3.0   
Target Milestone: 3.0 M8   
Hardware: PC   
OS: Windows XP   
Whiteboard:

Description Jim Adams CLA 2004-02-24 15:28:17 EST
JDK 1.5 introduced some changes in some of the core classes. In particular 
java.lang.StringBuffer was given a superclass of 
java.lang.AbstractStringBuilder. Code compiled with the javasoft 1.5 compiler 
does run in earlier versions of the VM. If you build the classes using the 
eclipse compiler, there seems to be a built in hook to the superclass. Thus 
the classes won't run in earlier versions of the vm. A ClassNotFoundException 
for java.lang.AbstractStringBuilder is thrown.
Comment 1 Philipe Mulet CLA 2004-02-24 15:54:53 EST
Please provide steps to reproduce. Also to be a fair comparison, you should try 
to achieve the result with javac 1.4, as the Eclipse compiler you are using is 
a 1.4 compiler (moving to 1.5, but not yet there).
Comment 2 Jim Adams CLA 2004-02-24 16:26:32 EST
Install the latest 1.5 beta
Set Eclipse to use the 1.5 JRE in the installed JREs
ALso set it to use the 1.4.2_02 jre (which 1.4 version shouldn't matter)

Create the following file in Eclipse
public class StringBufferTest
{
	
	public static void main(String[] args)
	{
		StringBuffer a = new StringBuffer();
		a.append("This is a test");
		System.out.println(a.toString());
		System.exit(0);
	}
}
Build and run it.
Now switch the runtime VM to 1.4 in the run... dialog.
Re run without rebuilding
It fails.

Below is the output of my sessions outside eclipse from this point on. As you 
can see before rebuilding it fails. After rebuilding it works. Note that I did 
have to use the -target 1.4 switch on the compiler but Eclipse doesn't have 
such a switch to my knowledge.

C:\eclipse\workspace\test>dir
 Volume in drive C is WXP
 Volume Serial Number is 08E8-C1C4

 Directory of C:\eclipse\workspace\test

02/24/2004  04:05 PM    <DIR>          .
02/24/2004  04:05 PM    <DIR>          ..
02/24/2004  03:57 PM               226 .classpath
02/24/2004  03:57 PM               380 .project
02/24/2004  04:05 PM               804 StringBufferTest.class
02/24/2004  03:58 PM               552 StringBufferTest.java
               4 File(s)          1,962 bytes
               2 Dir(s)   1,767,754,752 bytes free

C:\eclipse\workspace\test>java -classpath . StringBufferTest
This is a test

C:\eclipse\workspace\test>java -version
java version "1.5.0-beta"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0-beta-b32c)
Java HotSpot(TM) Client VM (build 1.5.0-beta-b32c, mixed mode)

C:\eclipse\workspace\test>"c:\Program Files\java\j2re1.4.2_02\bin\java" -
classpa
th . StringBufferTest
Exception in thread "main" java.lang.NoSuchMethodError: 
java.lang.StringBuffer.a
ppend(Ljava/lang/String;)Ljava/lang/AbstractStringBuilder;
        at StringBufferTest.main(StringBufferTest.java:19)

C:\eclipse\workspace\test>c:\jdk1.5.0\bin\javac -classpath . 
StringBufferTest.ja
va

C:\eclipse\workspace\test>java -classpath . StringBufferTest
This is a test

C:\eclipse\workspace\test>"c:\Program Files\java\j2re1.4.2_02\bin\java" -
classpa
th . StringBufferTest
Exception in thread "main" java.lang.UnsupportedClassVersionError: 
StringBufferT
est (Unsupported major.minor version 49.0)
        at java.lang.ClassLoader.defineClass0(Native Method)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$100(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClassInternal(Unknown Source)

C:\eclipse\workspace\test>c:\jdk1.5.0\bin\javac -target 1.4 -classpath . 
StringB
ufferTest.java

C:\eclipse\workspace\test>"c:\Program Files\java\j2re1.4.2_02\bin\java" -
classpa
th . StringBufferTest
This is a test

C:\eclipse\workspace\test>java -classpath . StringBufferTest
This is a test

C:\eclipse\workspace\test>c:\jdk1.4.2_02\bin\javac -classpath . 
StringBufferTest
.java
The system cannot find the path specified.

C:\eclipse\workspace\test>c:\j2sdk1.4.2_02\bin\javac -classpath . 
StringBufferTe
st.java

C:\eclipse\workspace\test>java -classpath . StringBufferTest
This is a test

C:\eclipse\workspace\test>"c:\Program Files\java\j2re1.4.2_02\bin\java" -
classpa
th . StringBufferTest
This is a test
Comment 3 Philipe Mulet CLA 2004-02-25 03:01:36 EST
Note that in your script, it shows that when using javac 1.4 you did compile 
against 1.4 libraries (by default).
Comment 4 Jim Adams CLA 2004-02-25 09:25:36 EST
Yes, but when I compiled against 1.5, I ran against 1.4 libraries with no 
problem (using the javasoft compiler)
Comment 5 Philipe Mulet CLA 2004-02-25 09:30:37 EST
Understood, but your point was to use a 1.4 compiler to compile against JDK1.5 
and then run against 1.4. 
Javac doesn't support it, as it refuses to compile against more recent 
libraries.

We may still have an obvious issue leading us to misbehave, will investigate.
Comment 6 Jim Adams CLA 2004-02-25 09:44:07 EST
I recompiled the classes, first with Eclipse and then with jdk 1.5. I dumped 
out each class and Eclipse has compiled in the return type differently.

C:\eclipse\workspace\test>c:\jdk1.5.0\bin\javap -classpath . -c 
StringBufferTest
Compiled from "StringBufferTest.java"
public class StringBufferTest extends java.lang.Object{
public StringBufferTest();
  Code:
   0:   aload_0
   1:   invokespecial   #9; //Method java/lang/Object."<init>":()V
   4:   return

public static void main(java.lang.String[]);
  Code:
   0:   new     #17; //class java/lang/StringBuffer
   3:   dup
   4:   invokespecial   #18; //Method java/lang/StringBuffer."<init>":()V
   7:   astore_1
   8:   aload_1
   9:   ldc     #20; //String This is a test
   11:  invokevirtual   #24; //Method java/lang/StringBuffer.append:
(Ljava/lang/
String;)Ljava/lang/AbstractStringBuilder;
   14:  pop
   15:  getstatic       #30; //Field java/lang/System.out:Ljava/io/PrintStream;
   18:  aload_1
   19:  invokevirtual   #34; //Method java/lang/StringBuffer.toString:()
Ljava/la
ng/String;
   22:  invokevirtual   #40; //Method java/io/PrintStream.println:
(Ljava/lang/St
ring;)V
   25:  iconst_0
   26:  invokestatic    #44; //Method java/lang/System.exit:(I)V
   29:  return

}


C:\eclipse\workspace\test>c:\jdk1.5.0\bin\javac -target 1.4 -classpath . 
StringBufferTest.ja
va

C:\eclipse\workspace\test>c:\jdk1.5.0\bin\javap -classpath . -c 
StringBufferTest
Compiled from "StringBufferTest.java"
public class StringBufferTestextends java.lang.Object{
public StringBufferTest();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

public static void main(java.lang.String[]);
  Code:
   0:   new     #2; //class java/lang/StringBuffer
   3:   dup
   4:   invokespecial   #3; //Method java/lang/StringBuffer."<init>":()V
   7:   astore_1
   8:   aload_1
   9:   ldc     #4; //String This is a test
   11:  invokevirtual   #5; //Method java/lang/StringBuffer.append:
(Ljava/lang/S
tring;)Ljava/lang/StringBuffer;
   14:  pop
   15:  getstatic       #6; //Field java/lang/System.out:Ljava/io/PrintStream;
   18:  aload_1
   19:  invokevirtual   #7; //Method java/lang/StringBuffer.toString:()
Ljava/lan
g/String;
   22:  invokevirtual   #8; //Method java/io/PrintStream.println:
(Ljava/lang/Str
ing;)V
   25:  iconst_0
   26:  invokestatic    #9; //Method java/lang/System.exit:(I)V
   29:  return

}
Comment 7 Philipe Mulet CLA 2004-03-08 18:27:49 EST
Works fine now in latest, dup of bug 51353

*** This bug has been marked as a duplicate of 51353 ***