blob: 8143451f1e3cbb625db617743edf9276aacfeb92 [file] [log] [blame]
<?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>