JDK 11导致AEM 6.5中出现NoClassDefFoundError问题
在外部安装CXF包以解决在升级到AEM 6.5x的Java 11后出现 NoClassDefFoundError 的问题。
描述 description
升级到AEM 6.5.x的Java 11后,日志中出现以下错误。
15.09.2020 00:30:20.868 *ERROR* [ FelixStartLevel] org.apache.sling.scripting.sightly包
org.apache.sling.scripting.sightly:1.1.2.1_4_0 (557)[ org.apache.sling.scripting.sightly.impl.engine.extension.use.JavaUseProvider(3410)] :运行期间出错
实现对象的实例化(java.lang.NoClassDefFoundError:
jdk/internal/reflect/ConstructorAccessorImpl)
java.lang.NoClassDefFoundError: jdk/internal/reflect/ConstructorAccessorImpl
在java.base/jdk.internal.misc.Unsafe.defineClass0(本机方法)
在java.base/jdk.internal.misc.Unsafe.defineClass(Unsafe.java:1192)
在java.base/jdk.internal.reflect.ClassDefiner.defineClass(ClassDefiner.java:63)
在java.base/jdk.internal.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:400)
在java.base/jdk.internal.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:394)
在java.base/java.security.AccessController.doPrivileged(本机方法)
…
原因为: java.lang.ClassNotFoundException:无法加载类
'jdk.internal.reflect.ConstructorAccessorImpl'
在org.apache.felix.framework.BundleWiringImpl$1.loadClass(BundleWiringImpl.java:91)
在java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
在
org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1463)
在org.apache.felix.framework.BundleWiringImpl.access$300(BundleWiringImpl.java:79)
在
org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1982)
在java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
… 111省略了公用帧
解决方法 resolution
此问题是由于CXF包已从AEM中移除所致,并且这些包需要从外部安装:
-
停止AEM。
-
在文本编辑器中查找并打开此文件: crx-quickstart/conf/sling.properties。
-
修改此行:
早于
org.osgi.framework.bootdelegation=com.yourkit.*,${org.apache.sling.launcher.bootdelegation}
之后org.osgi.framework.bootdelegation=sun。*,com.sun.*,jdk.internal.reflect,jdk.internal.reflect.*,com.yourkit.*,${org.apache.sling.launcher.bootdelegation}
-
启动AEM。
注意:有关此问题的技术详细信息,请参阅issues.apache.org上的Oracle为JDK 11.0.3🔗的NoClassDefFoundError: jdk/internal/reflect/ConstructorAccessorImpl。