我們正在嘗試將現有的 Eclipse IDE 產品從 Java 8 遷移到 Java 11。
我們自己的代碼一切正常;但是,不幸的是,該產品還包括來自第三方的一些(相當舊的)捆綁包。這些包已經構建并在 Java 8 和使用javax.xml.bind(JAXB) 下運行,我們無權訪問源代碼,因此我們無法為 Java 11 重新構建它們。
現在的問題是這些捆綁包假定它javax.xml.bind位于(Java 運行時庫)類路徑(這對于 Java 8 是正確的),因此它們的清單中沒有Import-Packagefor JAXB。當然,當在我們的新 Java 11 產品中執行時,NoClassDefFoundException對于 JAXB 類,它會以 s 結尾。
到目前為止,我的研究有兩種解決這個問題的可能性:
通過將 JAXB 作為模塊提供并將其
--add-modules作為 VM 引數添加到eclipse.ini.對于每個舊包,創建一個帶有附加
Import-Package標頭的片段,以將 JAXB 匯入添加到每個受影響的包。
第一個解決方案對我們來說效果不佳,因為我們自己的包已經Import-Package在清單中使用了一個標頭來利用 JAXB,它在我們的目標平臺中作為 OSGi 包提供。如果我們向 Java 添加一個 JAXB 模塊,我們最終會遇到類/包在兩個模塊中可用的問題(OSGi 包中未命名的一個,以及我們通過命令列添加的 JAXB)。
第二種解決方案有效,但缺點是我們需要為N個遺留包創建N個片段,這給我們的代碼庫增加了相當多的混亂。
所以我的問題是:Equinox 中是否有任何其他機制可以用來讓某些包(我們的舊包)的 BundleClassloader 知道某些包(JAXB),而無需修改或重建這些舊包?
uj5u.com熱心網友回復:
捆綁包應始終具有匯入的javax.*包。那些捆綁總是錯誤的。
您是否嘗試過引導委托以及將 JAXB 添加到 Java 類路徑?
org.osgi.framework.bootdelegation=javax.xml.bind,javax.xml.bind.*
如果已經有一個 bootdelegation 值,您將需要添加javax.xml.bind,javax.xml.bind.*到現有值。
由于您也有匯入包的javax.xml.bind包,因此您還需要確保系統包匯出它們。因此,如果您的匯入需要,您將需要org.osgi.framework.system.packages.extra使用所有 JAXB 包(包括版本)配置屬性。
org.osgi.framework.system.packages.extra=javax.xml.bind;version=1.2.3, ...
uj5u.com熱心網友回復:
在對BJ Hargrave 的 答案中給出的關鍵字進行了一些搜索之后,我們最終找到了 Dirk Fauth 的這篇關于 vogella 的博客條目。那篇文章中的變體 3 描述了我們成功應用的方式。
簡而言之,
- 創建一個片段
system.bundle并將其設定為framework擴展 - 將您需要的庫放在該片段的類路徑中(或配置 POM 讓 Maven 為您完成)
- 匯出你需要匯出的包
MANIFEST.MF片段(摘錄):
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: JAXB framework extension
Bundle-SymbolicName: net.winklerweb.jaxbfix
Bundle-Version: 1.0.0.qualifier
Fragment-Host: system.bundle; extension:=framework
Bundle-RequiredExecutionEnvironment: JavaSE-11
Bundle-ClassPath: lib/jakarta.activation-api-1.2.2.jar,
lib/jakarta.xml.bind-api-2.3.3.jar,
lib/jaxb-impl-2.2_1.jar,
.
Export-Package: com.sun.istack,
com.sun.istack.localization,
com.sun.istack.logging,
pom.xml片段(摘錄):
<modelVersion>4.0.0</modelVersion>
<groupId>net.winklerweb</groupId>
<artifactId>net.winklerweb.jaxbfix</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>initialize</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<excludeTransitive>false</excludeTransitive>
<includeArtifactIds>jakarta.activation-api,jakarta.xml.bind-api,jaxb-impl</includeArtifactIds>
<failOnMissingClassifierArtifact>false</failOnMissingClassifierArtifact>
<silent>false</silent>
<outputDirectory>lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.eclipse.m2e</groupId>
<artifactId>lifecycle-mapping</artifactId>
<version>1.0.0</version>
<configuration>
<lifecycleMappingMetadata>
<pluginExecutions>
<pluginExecution>
<pluginExecutionFilter>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<versionRange>[1.0.0,)</versionRange>
<goals>
<goal>copy-dependencies</goal>
</goals>
</pluginExecutionFilter>
<action>
<execute>
<runOnIncremental>true</runOnIncremental>
<runOnConfiguration>true</runOnConfiguration>
</execute>
</action>
</pluginExecution>
</pluginExecutions>
</lifecycleMappingMetadata>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
<dependencies>
<dependency>
<groupId>jakarta.activation</groupId>
<artifactId>jakarta.activation-api</artifactId>
<version>1.2.2</version>
</dependency>
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>2.3.3</version>
</dependency>
<dependency>
<groupId>org.apache.geronimo.bundles</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.2_1</version>
</dependency>
</dependencies>
最后,一些有用的鏈接解釋了我在研究期間遇到的 OSGi/Equinox 類加載:
- https://moi.vonos.net/java/osgi-classloaders/
- http://www.martinlippert.org/events/WJAX2008-ClassloadingTypeVisibilityOSGi.pdf
- https://www.jfokus.se/jfokus09/slides/salong4/OSGiClassloading.pdf
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/457476.html
