使用 ECF JaxRS (Jersey) 的 RCP 客户端在 OpenWebstart 上启动,但不是原始/Oracle Webstart (Java 8)

问题描述

我们使用 e4 和 Java 1.8.0.281(用于运行)和 AdoptOpenJDK 11 来构建,使用 Eclipse IDE for RCP 和 RAP 开发人员版本:2020-12 (4.18.0)。

我们打算在我们新开发的 RichClientPlatform Client 中使用这个库 https://github.com/ECF/JaxRSProviders/,并且能够按照 https://www.modumind.com/2020/07/23/eclipse-rcp-and-rest-jax-rs-extensions/ 和本系列后续博文中的描述进行集成。我们还可以使用 tycho 构建客户端,启动它,发现服务并且我们可以消耗后端。

当我们尝试通过 webstart 做同样的事情时,麻烦就开始了。到目前为止,我们根本无法通过 webstart 运行我们的客户端。所以我们退后一步,实现了一个最小的客户端。这在单独启动时也能正常工作,但在作为 webstart 应用程序启动时不起作用(通过 org.eclipse.equinox.launcher.WebStartMain.main(args);)

为了调试问题,我们创建了一个工作区,允许使用 WebStartWrapper 类从 Eclipse 启动它。我们看到的是客户端启动但服务注入因 ClassCastException 而中断。大多数情况下会发生这种情况,但并非所有机器上的所有时间都会发生这种情况。我们无法调试为什么它有时会起作用,但我们已经能够调试发生错误是因为使用了不同的类加载器。

例如

class org.glassfish.jersey.inject.hk2.Hk2InjectionManagerFactory -> loaded by sun.misc.Launcher$AppClassLoader@18b4aac2 with Parent CL: sun.misc.Launcher$ExtClassLoader@4043bcaf

interface org.glassfish.jersey.internal.inject.InjectionManagerFactory -> loaded by
org.eclipse.osgi.internal.loader.EquinoxClassLoader@49752ef8[org.glassfish.jersey.core.jersey-common:2.30.1(id=127)] withParent org.eclipse.osgi.internal.framework.EquinoxContainer$1@2a060884

Wenn 工作正常,我们看到 org.glassfish.jersey.internal.OsgiRegistry$OsgiServiceFinder$1@7e440207 被调用 当我们没有看到 org.glassfish.jersey.internal.ServiceFinder$LazyObjectIterator@6929efb4

我们尝试了各种不同的开始级别和自动启动包,但没有骰子。

但我们发现 org.glassfish.jersey.internal.ServiceFinder 有这个静态块:

static {
    final OsgiRegistry osgiRegistry = ReflectionHelper.getOsgiRegistryInstance();

    if (osgiRegistry != null) {
        LOGGER.log(Level.CONFIG,"Running in an OSGi environment");

        osgiRegistry.hookUp();
    } else {
        LOGGER.log(Level.CONFIG,"Running in a non-OSGi environment");
    }
}

我们看到,当类加载器在 OSGI 注册表可用后加载类时一切正常,但在之前加载类时却没有(我可以通过日志验证这一点,每次我得到“在 OSGi 环境中运行”消息它会起作用)。我可以通过为 org.glassfish.jersey.core.jersey-common 包设置较低的 startLevel (3) 来解决这个问题。

不幸的是,这仅在通过我们的 WebStartWrapper(来自 Eclipse)直接启动应用程序时解决了我们的问题,当我们尝试使用 JNLP(和 WebStartWrapper)启动应用程序时,我们仍然收到错误

ENTRY org.eclipse.ecf.osgi.services.remoteserviceadmin 4 0 2021-03-17 11:50:52.355
!MESSAGE FrameworkEvent ERROR
!STACK 0
org.osgi.framework.BundleException: Could not resolve module: org.eclipse.ecf.osgi.services.remoteserviceadmin [137]
  Unresolved requirement: Import-Package: org.eclipse.ecf.core.provider; version="[3.2.0,4.0.0)"

    at org.eclipse.osgi.container.Module.start(Module.java:463)
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel$2.run(ModuleContainer.java:1845)
    at org.eclipse.osgi.internal.framework.EquinoxContainerAdaptor$1$1.execute(EquinoxContainerAdaptor.

出于绝望,我们尝试使用 OpenWebStart 运行该应用程序,并使用以下 osgi.bundles 设法做到了:

<property name="jnlp.osgi.bundles"
value="org.eclipse.core.runtime@start,org.eclipse.equinox.simpleconfigurator@:start,org.apache.felix.scr@2:start,org.eclipse.ecf.osgi.services.distribution@start,org.eclipse.core.runtime@start,org.eclipse.ecf.provider.jersey.client@3:start,org.glassfish.jersey.core.jersey-common@start" />       

日志中仍然有一个错误,但应用程序启动得很好,并正确执行了请求。 显示错误的日志(为了好的措施,但正如我所写的,它不会影响被发现的服务和请求的工作)

!SESSION 2021-06-16 18:10:40.311 -----------------------------------------------
eclipse.buildId=unknown
java.version=1.8.0_282
java.vendor=AdoptOpenJDK
BootLoader constants: OS=win32,ARCH=x86_64,WS=win32,NL=de_DE

!ENTRY org.apache.felix.scr 4 0 2021-06-16 18:10:41.754
!MESSAGE bundle org.apache.felix.scr:2.1.16.v20200110-1820 (3)Circular reference detected trying to get service {org.eclipse.ecf.remoteservice.provider.IRemoteServiceDistributionProvider}={service.id=46,service.bundleid=5,service.scope=bundle,component.name=org.eclipse.ecf.provider.jersey.client.JerseyClientDistributionProvider,component.id=0}
 stack of references: ServiceReference: {org.eclipse.ecf.remoteservice.provider.IRemoteServiceDistributionProvider}={service.id=46,component.id=0}

!STACK 0
java.lang.Exception: stack trace
    at org.apache.felix.scr.impl.ComponentRegistry.enterCreate(ComponentRegistry.java:485)
    at org.apache.felix.scr.impl.BundleComponentActivator.enterCreate(BundleComponentActivator.java:734)
    at org.apache.felix.scr.impl.manager.SingleComponentManager.getService(SingleComponentManager.java:881)
    at org.eclipse.osgi.internal.serviceregistry.ServiceFactoryUse$1.run(ServiceFactoryUse.java:216)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.eclipse.osgi.internal.serviceregistry.ServiceFactoryUse.factoryGetService(ServiceFactoryUse.java:213)
    at org.eclipse.osgi.internal.serviceregistry.ServiceFactoryUse.getService(ServiceFactoryUse.java:114)
    at org.eclipse.osgi.internal.serviceregistry.ServiceConsumer$2.getService(ServiceConsumer.java:48)
    at org.eclipse.osgi.internal.serviceregistry.ServiceRegistrationImpl.getService(ServiceRegistrationImpl.java:554)
    at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.getService(ServiceRegistry.java:529)
    at org.eclipse.osgi.internal.framework.BundleContextImpl.getService(BundleContextImpl.java:685)
    at org.eclipse.ecf.internal.remoteservice.Activator$1.addingService(Activator.java:103)
    at org.eclipse.ecf.internal.remoteservice.Activator$1.addingService(Activator.java:1)
    at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:943)
    at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:1)
    at org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTracked.java:256)
    at org.osgi.util.tracker.AbstractTracked.trackInitial(AbstractTracked.java:183)
    at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:321)
    at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:264)
    at org.eclipse.ecf.internal.remoteservice.Activator.start(Activator.java:190)
    at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:843)
    at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:835)
    at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:792)
    at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:1015)
    at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:365)
    at org.eclipse.osgi.container.Module.doStart(Module.java:605)
    at org.eclipse.osgi.container.Module.start(Module.java:468)
    at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:493)
    at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:117)
    at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:571)
    at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:346)
    at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:398)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:477)
    at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:171)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
    at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:620)
    at org.apache.felix.scr.impl.manager.AbstractComponentManager.initDependencyManagers(AbstractComponentManager.java:999)
    at org.apache.felix.scr.impl.manager.AbstractComponentManager.collectDependencies(AbstractComponentManager.java:1026)
    at org.apache.felix.scr.impl.manager.SingleComponentManager.getServiceInternal(SingleComponentManager.java:935)
    at org.apache.felix.scr.impl.manager.AbstractComponentManager.activateInternal(AbstractComponentManager.java:756)
    at org.apache.felix.scr.impl.manager.AbstractComponentManager.enableInternal(AbstractComponentManager.java:666)
    at org.apache.felix.scr.impl.manager.AbstractComponentManager.enable(AbstractComponentManager.java:432)
    at org.apache.felix.scr.impl.manager.ConfigurableComponentHolder.enableComponents(ConfigurableComponentHolder.java:665)
    at org.apache.felix.scr.impl.BundleComponentActivator.initialEnable(BundleComponentActivator.java:338)
    at org.apache.felix.scr.impl.Activator.loadComponents(Activator.java:382)
    at org.apache.felix.scr.impl.Activator.access$200(Activator.java:49)
    at org.apache.felix.scr.impl.Activator$ScrExtension.start(Activator.java:264)
    at org.apache.felix.scr.impl.AbstractExtender.createExtension(AbstractExtender.java:196)
    at org.apache.felix.scr.impl.AbstractExtender.modifiedBundle(AbstractExtender.java:169)
    at org.apache.felix.scr.impl.AbstractExtender.addingBundle(AbstractExtender.java:139)
    at org.apache.felix.scr.impl.AbstractExtender.addingBundle(AbstractExtender.java:49)
    at org.osgi.util.tracker.BundleTracker$Tracked.customizerAdding(BundleTracker.java:475)
    at org.osgi.util.tracker.BundleTracker$Tracked.customizerAdding(BundleTracker.java:1)
    at org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTracked.java:256)
    at org.osgi.util.tracker.AbstractTracked.trackInitial(AbstractTracked.java:183)
    at org.osgi.util.tracker.BundleTracker.open(BundleTracker.java:159)
    at org.apache.felix.scr.impl.AbstractExtender.startTracking(AbstractExtender.java:100)
    at org.apache.felix.scr.impl.AbstractExtender.doStart(AbstractExtender.java:92)
    at org.apache.felix.scr.impl.Activator.doStart(Activator.java:172)
    at org.apache.felix.scr.impl.AbstractExtender.start(AbstractExtender.java:72)
    at org.apache.felix.scr.impl.Activator.restart(Activator.java:139)
    at org.apache.felix.scr.impl.config.ScrConfigurationImpl.configure(ScrConfigurationImpl.java:217)
    at org.apache.felix.scr.impl.config.ScrConfigurationImpl.start(ScrConfigurationImpl.java:120)
    at org.apache.felix.scr.impl.Activator.start(Activator.java:100)
    at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:843)
    at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:835)
    at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:792)
    at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:1015)
    at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:365)
    at org.eclipse.osgi.container.Module.doStart(Module.java:605)
    at org.eclipse.osgi.container.Module.start(Module.java:468)
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel$2.run(ModuleContainer.java:1845)
    at org.eclipse.osgi.internal.framework.EquinoxContainerAdaptor$1$1.execute(EquinoxContainerAdaptor.java:136)
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.incStartLevel(ModuleContainer.java:1838)
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.incStartLevel(ModuleContainer.java:1781)
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.doContainerStartLevel(ModuleContainer.java:1743)
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.dispatchEvent(ModuleContainer.java:1665)
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.dispatchEvent(ModuleContainer.java:1)
    at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:234)
    at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:345)

!ENTRY org.eclipse.osgi 4 0 2021-06-16 18:10:42.291
!MESSAGE Bundle org.eclipse.equinox.simpleconfigurator_1.3.500.v20200211-1505 [2] is not active.

!ENTRY klv-ui 1 0 2021-06-16 18:10:44.278
!MESSAGE Create controls for HelloWorldPart

!ENTRY klv-ui 1 0 2021-06-16 18:10:46.691
!MESSAGE Controls for HelloWorldPart created

我使用了 Moongoose 网络服务器以 root 身份共享 webstart_minimal 目录并进行设置 在minimal.jnlp中。

这个在 OpenWebstart 上工作的 Minimal 客户端告诉我,我的 jnlp 或构建过程没有任何内在错误,但与 OpenWebstart 处理事情的方式(也许是类加载?)相比,Oracle Webstart 处理事情的方式存在问题。

我们的最小客户端可以在 https://drive.evolit.com/seahub/f/7a525e80a98f4318a791/

下载

我们还在 https://github.com/ECF/JaxRSProviders/issues/39 提出了一个问题,但到目前为止没有人能够解决这个问题。

如果您对使用 Oracle Webstart 和 JDK 8 运行此最小应用程序有任何疑问、提示或见解,请告诉我。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...