我正在構建一個需要一些外部依賴項的 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 實作的插件中:這是插件的清單
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)
api jar在javax.json-1.1.4.jar運行時找不到javax.json-api_1.1.4。
我發現使它作業的唯一方法是將實作 jar 添加到插件的運行時類路徑設定中,在 Bundle-Classpath 中:
Bundle-ClassPath: .,
lib/javax.json-1.1.4.jar,
這需要插件的 lib 檔案夾中的 jar,而它已經包含在 tartget 平臺中。應該足夠了..是否需要進行配置或做一些事情來使 OSGi 環境在運行時將 jar 識別為 Maven 依賴項?我已經閱讀過Eclipse-BuddyPolicy,DynamicImport-Package但我不知道如何在我的情況下使用它們,以及它們是否有用。
這個https://github.com/eclipse-ee4j/jsonp/issues/96說它“應該用 javax.json:1.1.4 和 jakarta.json:1.1.5 修復”但我不明白如何。 ..
uj5u.com熱心網友回復:
由于此執行緒中的評論,我設法解決了這個問題:
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.ProviderImplWeb 服務提供商時遇到的一個非常相似的問題有關。
在捆綁清單中包含OSGi 資源定位器以及具有實際實作的插件,使它們在運行時可被發現。
這是目標平臺檔案中的依賴項:
<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>
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/446522.html
