Prior to JDK9, implementation of private Class<?> java.lang.Package.getPackageInfo()
was calling Class.forName(pkgName + ".package-info", false, loader);
and properly loaded package-info.class and its annotations.
Since JDK9 java.lang.Package.getPackageInfo()
calls java.lang.ClassLoader.loadClass() / findClass()
directly, which is overidden at org.codehaus.plexus.classworlds.realm.ClassRealm
with throw new ClassNotFoundException( name )
, which causes package-info.class not to be loaded.
Example 1:
Stacktrace on JDK8: ClassNotFoundException thrown by ClassRealm#findClass()
is being catched at ClassRealm#unsynchronizedLoadClass:266
and than properly loaded and returned with strategy.loadClass( name );
at org.codehaus.plexus.classworlds.realm.ClassRealm.findClass(ClassRealm.java:282)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at rg.codehaus.plexus.classworlds.realm.ClassRealm.unsynchronizedLoadClass(ClassRealm.java:266)
at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:247)
at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:239)
at java.lang.Class.forName0(Class.java:-1)
at java.lang.Class.forName(Class.java:348)
at java.lang.Package.getPackageInfo(Package.java:375)
at java.lang.Package.getAnnotation(Package.java:390)
Example 2:
Stacktrace on JDK9: ClassNotFoundException in ClassRealm#findClass()
is thrown directly to ClassLoader.findClass()
, which fails loading package-info.class.
at org.codehaus.plexus.classworlds.realm.ClassRealm.findClass(ClassRealm.java:282)
at java.lang.ClassLoader.findClass(ClassLoader.java:742)
at java.lang.ClassLoader.loadClass(ClassLoader.java:608)
at java.lang.Package.getPackageInfo(Package.java:420)
at java.lang.Package.getAnnotation(Package.java:441)