You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 06:20:12