升级Java 11后RCP OSGi应用启动失败:javax.annotation类找不到
RCP OSGi应用升级至Java 11后启动失败:javax.annotation包缺失问题
将RCP OSGi应用升级至Java 11后无法启动,原因是Java 11移除了javax.annotation包,启动时抛出以下异常:
org.eclipse.e4.core.di.InjectionException: java.lang.NoClassDefFoundError: javax/annotation/PostConstruct at org.eclipse.e4.core.internal.di.InjectorImpl.internalMake(InjectorImpl.java:414) at org.eclipse.e4.core.internal.di.InjectorImpl.make(InjectorImpl.java:330) at org.eclipse.e4.core.contexts.ContextInjectionFactory.make(ContextInjectionFactory.java:202) at org.eclipse.e4.ui.internal.workbench.swt.E4Application.createDefaultHeadlessContext(E4Application.java:481) at org.eclipse.e4.ui.internal.workbench.swt.E4Application.createDefaultContext(E4Application.java:495) at org.eclipse.e4.ui.internal.workbench.swt.E4Application.createE4Workbench(E4Application.java:213) at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:573) at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:338) at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:551) at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:156) at *.application.Application.start(Application.java:534) at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:203) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:136) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:402) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:255) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:659) at org.eclipse.equinox.launcher.Main.basicRun(Main.java:596) at org.eclipse.equinox.launcher.Main.run(Main.java:1467) at org.eclipse.equinox.launcher.Main.main(Main.java:1440) Caused by: java.lang.NoClassDefFoundError: javax/annotation/PostConstruct at org.eclipse.e4.core.internal.di.InjectorImpl.internalInject(InjectorImpl.java:140) at org.eclipse.e4.core.internal.di.InjectorImpl.internalMake(InjectorImpl.java:403) ... 23 more Caused by: java.lang.ClassNotFoundException: javax.annotation.PostConstruct cannot be found by org.eclipse.e4.core.di_1.8.200.v20220512-1957 at org.eclipse.osgi.internal.loader.BundleLoader.generateException(BundleLoader.java:541) at org.eclipse.osgi.internal.loader.BundleLoader.findClass0(BundleLoader.java:536) at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:416) at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:168) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522) ... 25 more
负责依赖注入的Eclipse插件org.eclipse.e4.core.di在运行时无法找到javax.annotation包。应用运行在OSGi容器中,编译阶段无未解析依赖,且javax.annotation已存在于构建和目标平台中。以下是org.eclipse.e4.core.di Bundle的清单内容:
Automatic-Module-Name = org.eclipse.e4.core.di Build-Jdk-Spec = 11 Bundle-ActivationPolicy = lazy Bundle-Localization = plugin Bundle-ManifestVersion = 2 Bundle-Name = Eclipse Dependency Injection Bundle-RequiredExecutionEnvironment = JavaSE-11 Bundle-SymbolicName = org.eclipse.e4.core.di Bundle-Vendor = Eclipse.org Bundle-Version = 1.8.200.v20220512-1957 Created-By = Maven Archiver 3.5.2 Eclipse-SourceReferences = scm:git:https://github.com/eclipse-platform/eclipse.platform.runtime.git;path="bundles/org.eclipse.e4.core.di";tag="I20220512-1800";commitId=ada015b6ae742e99f70411886c4f72f1a1fe1713 Export-Package = org.eclipse.e4.core.di;version="1.7.0",org.eclipse.e4.core.di.suppliers;version="1.7.0",org.eclipse.e4.core.internal.di;x-friends:="org.eclipse.e4.core.contexts",org.eclipse.e4.core.internal.di.osgi;x-internal:=true,org.eclipse.e4.core.internal.di.shared;x-friends:="org.eclipse.e4.core.contexts,org.eclipse.e4.core.di.extensions.supplier" Import-Package = javax.inject;version="1.0.0",org.eclipse.osgi.framework.log;version="1.1.0",org.osgi.framework;version="1.8.0",org.osgi.util.tracker;version="1.5.1" Manifest-Version = 1.0 Require-Bundle = org.eclipse.e4.core.di.annotations;bundle-version="[1.4.0,2.0.0)";visibility:=reexport,javax.annotation;bundle-version="[1.3.5,2.0.0)"
该Bundle通过Require-Bundle依赖javax.annotation,但未在Import-Package中声明导入。我们有另一构建方式完全相同的应用却能正常运行,暂时无法定位差异点。按OSGi机制,每个插件拥有独立类加载器,javax.annotation似乎未被纳入org.eclipse.e4.core.di的类加载范围,且OSGi运行时中javax.annotation Bundle已启动并处于激活状态,理论上应能被依赖注入插件访问。
已尝试的解决方案
- 在Maven Tycho构建中添加
javax.annotation依赖:无效果,因依赖由OSGi运行时解析 - 对比两个应用的运行环境:OSGi运行时配置一致,未发现差异
- 检查包和Bundle版本兼容性:未发现异常版本冲突
- 在Eclipse运行配置中显式添加
javax.annotation:无效果
问题
如何在OSGi运行时中配置,让javax.annotation能被org.eclipse.e4.core.di插件正常访问?是否有其他用户遇到过类似问题?
环境信息:Eclipse BundleId: 20220609-1112,JDK: 11.0.14.1
内容的提问来源于stack exchange,提问作者Maximilian Lutz
相关产品推荐
相关产品推荐

