OSGi 环境在运行时找不到 Maven jar 依赖项

Maven jar dependency not found at runtime by OSGi environment

我正在构建一个需要一些外部依赖项的 Eclipse 产品,这些依赖项未捆绑为 Eclipse 插件。 例如 javax.json-1.1.4.jar.

我正在使用目标平台文件,添加了 Maven 依赖项。这是 .target 文件的相关部分:

<location includeDependencyScope="compile" includeSource="true" missingManifest="generate" type="Maven">
            <dependencies>
                ......
                <dependency>
                    <groupId>org.glassfish</groupId>
                    <artifactId>javax.json</artifactId>
                    <version>1.1.4</version>
                    <type>jar</type>
                </dependency>
            </dependencies>
        </location>

生成的包包含在使用此 Json 实现的插件中:这是插件的 MANIFEST

Require-Bundle: org.glassfish.javax.json;bundle-version="1.1.4"

插件正常编译和运行。问题发生在 运行 时间,当加载 Json 实现时:

2022-03-11 09:44:18,166 ERROR [main]: Provider org.glassfish.json.JsonProviderImpl not found
2022-03-11 09:44:18,168 ERROR [main]: 
javax.json.JsonException: Provider org.glassfish.json.JsonProviderImpl not found
    at javax.json.spi.JsonProvider.provider(JsonProvider.java:99)
    at javax.json.Json.createReader(Json.java:225)
    at com.test.mas.rcp.hwconfigurator.sirius.core.utils.MotorDataHandler.parseMotorJsonFile(MotorDataHandler.java:64)
    at com.test.mas.rcp.hwconfigurator.sirius.core.utils.DBHandler.initMotorsDB(DBHandler.java:209)
    at com.test.mas.rcp.hwconfigurator.sirius.core.utils.DBHandler.getMotors(DBHandler.java:116)
    at com.test.mas.rcp.hwconfigurator.sirius.core.impl.FieldBusDevice.getMotors(FieldBusDevice.java:1323)
    at com.test.mas.rcp.hwconfigurator.sirius.core.impl.FieldBusDevice.createFromSiriusString(FieldBusDevice.java:1257)
    at com.test.mas.rcp.hwconfigurator.sirius.core.impl.HwConfiguratorFactoryImpl.createFieldBusDeviceFromString(HwConfiguratorFactoryImpl.java:252)
    at com.test.mas.rcp.hwconfigurator.sirius.core.impl.HwConfiguratorFactoryImpl.createFromString(HwConfiguratorFactoryImpl.java:93)
    at org.eclipse.emf.ecore.xmi.impl.XMLHelperImpl.createFromString(XMLHelperImpl.java:1615)
    at org.eclipse.emf.ecore.xmi.impl.XMLHelperImpl.setValue(XMLHelperImpl.java:1156)
    at org.eclipse.emf.ecore.xmi.impl.XMLHandler.setFeatureValue(XMLHandler.java:2710)
    at org.eclipse.emf.ecore.xmi.impl.XMLHandler.setAttribValue(XMLHandler.java:2769)
    at org.eclipse.emf.ecore.xmi.impl.SAXXMIHandler.handleObjectAttribs(SAXXMIHandler.java:79)
    at org.eclipse.emf.ecore.xmi.impl.XMLHandler.createObjectFromFactory(XMLHandler.java:2247)
Caused by: java.lang.ClassNotFoundException: org.glassfish.json.JsonProviderImpl cannot be found by javax.json-api_1.1.4
    at org.eclipse.osgi.internal.loader.BundleLoader.generateException(BundleLoader.java:516)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass0(BundleLoader.java:511)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:403)
    at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:168)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
    at java.base/java.lang.Class.forName0(Native Method)
    at java.base/java.lang.Class.forName(Class.java:315)
    at javax.json.spi.JsonProvider.provider(JsonProvider.java:96)
    at javax.json.Json.createReader(Json.java:225)
    at com.test.mas.rcp.hwconfigurator.sirius.core.utils.MotorDataHandler.parseMotorJsonFile(MotorDataHandler.java:64)
    at com.test.mas.rcp.hwconfigurator.sirius.core.utils.DBHandler.initMotorsDB(DBHandler.java:209)
    at com.test.mas.rcp.hwconfigurator.sirius.core.utils.DBHandler.getMotors(DBHandler.java:116)
    at com.test.mas.rcp.hwconfigurator.sirius.core.impl.FieldBusDevice.getMotors(FieldBusDevice.java:1323)
    at com.test.mas.rcp.hwconfigurator.sirius.core.impl.FieldBusDevice.createFromSiriusString(FieldBusDevice.java:1257)
    at com.test.mas.rcp.hwconfigurator.sirius.core.impl.HwConfiguratorFactoryImpl.createFieldBusDeviceFromString(HwConfiguratorFactoryImpl.java:252)

javax.json-1.1.4.jar 未在 运行 时间被 api jar javax.json-api_1.1.4 找到。

我发现让它工作的唯一方法是将实现 jar 添加到插件的 运行time classpath 设置中,在 Bundle-Classpath 中:

Bundle-ClassPath: .,
 lib/javax.json-1.1.4.jar,

这需要插件 lib 文件夹中的 jar,而它已经包含在 tartget 平台中。应该够了吧。。 是否有配置或需要做的事情来使 OSGi 环境在 运行 时将 jar 识别为 Maven 依赖项? 我读过 Eclipse-BuddyPolicyDynamicImport-Package 但我不知道如何在我的案例中使用它们,以及它们是否有用。

这个 https://github.com/eclipse-ee4j/jsonp/issues/96 说它“应该用 javax.json:1.1.4 和 jakarta.json:1.1.5 修复”,但我没有 了解如何...

由于此线程中的评论,我设法解决了这个问题:

https://github.com/eclipse-ee4j/jax-ws-api/issues/90

特别是最后一个:

https://github.com/eclipse-ee4j/jax-ws-api/issues/90#issuecomment-952793454

这与我在执行 com.sun.xml.ws.spi.ProviderImpl 网络服务提供商。

在捆绑清单中包含 OSGi Resource Locator,以及具有实际实现的插件,使它们在运行时可被发现。

这是目标平台文件中的依赖:

<dependency>
    <groupId>org.glassfish.hk2</groupId>
    <artifactId>osgi-resource-locator</artifactId>
    <version>2.5.0-b42</version>
    <type>jar</type>
</dependency>

最后,对于Json问题,我切换到Eclipse Parsson实现,它在运行时没有问题。 这些是目标平台所需的依赖项:

<dependency>
    <groupId>org.eclipse.parsson</groupId>
    <artifactId>jakarta.json</artifactId>
    <version>1.0.0</version>
    <type>jar</type>
</dependency>
<dependency>
    <groupId>org.eclipse.parsson</groupId>
    <artifactId>parsson</artifactId>
    <version>1.0.0</version>
    <type>jar</type>
</dependency>