| <?xml version="1.0" encoding="UTF-8"?> |
| <!-- |
| |
| Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved. |
| |
| This program and the accompanying materials are made available under the |
| terms of the Eclipse Distribution License v. 1.0, which is available at |
| http://www.eclipse.org/org/documents/edl-v10.php. |
| |
| SPDX-License-Identifier: BSD-3-Clause |
| |
| --> |
| |
| <!DOCTYPE book [ |
| <!ENTITY % ents SYSTEM "docbook.ent"> |
| %ents; |
| ]> |
| <section version="5.0" xml:id="deployment-runtime-errors" xml:lang="en" |
| xmlns="http://docbook.org/ns/docbook" |
| xmlns:xlink="http://www.w3.org/1999/xlink" |
| xmlns:ns5="http://www.w3.org/1999/xhtml" |
| xmlns:ns3="http://www.w3.org/2000/svg" |
| xmlns:ns="http://docbook.org/ns/docbook" |
| xmlns:m="http://www.w3.org/1998/Math/MathML"> |
| <title>Runtime Errors</title> |
| |
| <section xml:id="Illegal_class_modifiers_for_package_info__0x1600"> |
| <title>Illegal class modifiers for package-info: 0x1600</title> |
| |
| <para>When you compile your sources files with JDK from Java6 and try |
| to run it on Java5 JVMs, you may see a <literal>ClassFormatError</literal> |
| at runtime like this:</para> |
| |
| <informalexample> |
| <programlisting language=""><![CDATA[main" java.lang.ClassFormatError: Illegal class modifiers in class |
| com/alu/parentalcontrol/jaxb/package-info: 0x1600 |
| at java.lang.ClassLoader.defineClass1(Native Method) |
| at java.lang.ClassLoader.defineClass(ClassLoader.java:620) |
| at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124) |
| at java.net.URLClassLoader.defineClass(URLClassLoader.java:260) |
| at java.net.URLClassLoader.access$100(URLClassLoader.java:56) |
| at java.net.URLClassLoader$1.run(URLClassLoader.java:195) |
| at java.security.AccessController.doPrivileged(Native Method) |
| at java.net.URLClassLoader.findClass(URLClassLoader.java:188) |
| at java.lang.ClassLoader.loadClass(ClassLoader.java:306) |
| at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268) |
| at java.lang.ClassLoader.loadClass(ClassLoader.java:251) |
| at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319) |
| at java.lang.Class.forName0(Native Method) |
| at java.lang.Class.forName(Class.java:242) |
| at java.lang.Package.getPackageInfo(Package.java:350) |
| at java.lang.Package.getAnnotation(Package.java:361) |
| at com.sun.xml.bind.v2.model.annotation.RuntimeInlineAnnotationReader.getPackageAnnotation(RuntimeInlineAnnotationReader.java:125) |
| at com.sun.xml.bind.v2.model.annotation.RuntimeInlineAnnotationReader.getPackageAnnotation(RuntimeInlineAnnotationReader.java:53) |
| at com.sun.xml.bind.v2.model.impl.TypeInfoImpl.parseElementName(TypeInfoImpl.java:122) |
| at com.sun.xml.bind.v2.model.impl.ClassInfoImpl.<init>(ClassInfoImpl.java:166)]]></programlisting> |
| </informalexample> |
| |
| <para>This is due to a bug, and so far the only way to fix this is to |
| compile your project with JavaSE 5.</para> |
| |
| <para>Here is what's happening. Java5 added a new class file modifier |
| attribute called <literal>ACC_SYNTHETIC</literal>, whose bit value is |
| 0x1000. This attribute marks types and methods that are not present in |
| the source file but generated by the compiler. When |
| <filename>package-info.java</filename> is compiled into |
| <filename>package-info.class</filename>, javac in Java5 apparently only put |
| 0x0600 (= <code>ACC_ABSTRACT|ACC_INTERFACE</code>.) Some time during |
| Java6 development, someone filed <link |
| xlink:href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6232928">a |
| bug, saying it should also include <literal>ACC_SYNTHETIC</literal> |
| bit</link>, since it was a synthesized class.</para> |
| |
| <para>Later <link |
| xlink:href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6313196">it |
| is discovered that the corresponding VM change needs to be made to |
| allow this 0x1600 combination</link>, but apparently no one realized |
| the real implication of this --- namely, 0x1600 will break all the |
| past JVMs. Of course, this problem is <link |
| xlink:href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6553734">eventually |
| discovered</link>, but as of this writing there's still no fix for |
| this.</para> |
| |
| <para>So as you see, this is why the only workaround is to use javac |
| from Java5.</para> |
| </section> |
| </section> |