Bug 52979 - [Compiler] Code compiled against JDK 1.5 does not run in jdk 1.4
Summary: [Compiler] Code compiled against JDK 1.5 does not run in jdk 1.4
Status: RESOLVED DUPLICATE of bug 51353
Alias: None
Product: JDT
Classification: Eclipse Project
Component: Core (show other bugs)
Version: 3.0   Edit
Hardware: PC Windows XP
: P3 normal (vote)
Target Milestone: 3.0 M8   Edit
Assignee: Philipe Mulet CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2004-02-24 15:28 EST by Jim Adams CLA
Modified: 2004-03-08 18:27 EST (History)
0 users

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
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 ***