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

如何解决使用 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 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res