簡體   English   中英

WebSphere 9 上 javax.transaction.* 類的 LinkageError

[英]LinkageError on WebSphere 9 for javax.transaction.* classes

我有一個 web 應用程序,它曾經在許多 web 服務器(tomcat、jboss、weblogic 和 websphere)上運行良好。 但是,現在在 WebSphere 9 上部署時出現錯誤。

該應用程序包含 jar javax.transaction-api-1.2。 它的一些類,例如javax.transaction.xa.XAResource ,也包含在 Java SE 中,但不是全部。 有些特定於 Java EE,並且是我的應用程序中的某些 3rd 方庫所必需的。 該應用程序始終使用子級優先(父級最后)類加載器進行部署。 當應用程序嘗試加載 Oracle JDBC 驅動程序時,WebSphere 9 在啟動期間拋出此錯誤:

java.lang.LinkageError: loading constraint violation: loader "com/ibm/ws/classloader/CompoundClassLoader@7157be44" previously initiated loading for a different type with name 
"javax/transaction/xa/XAResource" defined by loader "com/ibm/oti/vm/BootstrapClassLoader@422c7b1b"

請注意,我們實際上並未在應用程序中使用 XA 事務,而是使用常規事務。

在其他服務器和以前版本的 WebSphere 上,這從來都不是問題。 服務器並不關心我們是否從戰爭內部加載XAResource ,即使它之前已加載到服務器中的某個位置。 現在 WebSphere 9 不同了,它說應用程序類加載器已經從服務器加載了這個類,但我不知道為什么或何時發生這種情況。

知道如何解決這個問題嗎?

從您的應用程序中刪除事務 API。 JTA 1.2 已經包含在服務器中,並且在您的應用程序中沒有任何價值。 除非您 100% 確定它們在技術上是必要的,否則將 Java EE/SE API 引入父級最后一個類加載器總是有風險的,因為它們可能導致類似這樣的問題。

我不能說這在以前的服務器版本中是如何工作的(在強制執行這樣的鏈接問題方面有一些 Java 級別的更改),但解決方案相當簡單。

最后我們做了兩件事來解決這個問題。

1) 我們將 jta jar 升級到 1.3 版(鏈接在這里)。 這個jar 通過避免重復類解決了這個問題——它只包含J2EE 類並省略了JVM 中已經包含的J2SE 類。 2) 我們將 WebSphere 服務器從 9.0.0.7 升級到 9.0.0.11。

當時,我懷疑只升級 jar 就足夠了,但是我們的 QA 遇到了一些問題,他們還升級了服務器。 由於時間不夠,我們沒有進一步調查,只是決定兩者都做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM