簡體   English   中英

多個版本的javamail jar導致NoSuchProviderException

[英]multiple versions of javamail jar causing NoSuchProviderException

我有一個獨立的庫(jar文件),它被添加到應用程序服務器類路徑中,以監視JVM中所有正在運行的應用程序,並在發生某些問題時發送電子郵件。

jar文件包含jar中的所有依賴項(使用maven-shade-plugin),包括javamail jar文件。

當appserver中的其他web應用程序之一將javamail作為依賴項時,我的jar文件中的javamail會發生一些依賴性沖突,並且我得到一個異常

MessagingException :javax.mail.NoSuchProviderException: No provider for smtp 

知道我無法修改正在運行的應用程序,如何解決此沖突。 我只能控制我的jar文件。

編輯

我通過javamail API調試。 我發現javax.mail.Session使用反射構造一個類型為com.sun.mail.smtp.SMTPTransport的新對象,並將兩個參數傳遞給構造函數,但不是使用位於同一個jar文件中的SMTPTransport,而是嘗試使用位於其中一個已部署應用程序中的其他mail.jar的SMTPTransport。

在tomcat 7中, 默認情況下, Web應用程序將首先查看此訂單上的類:

  1. 首先在WEB-INF / classes上
  2. 然后在WEB-INF / lib中的jar中
  3. 如果僅在YOUR_SERVER_HOME / lib中找不到該類
  4. 然后在系統類加載器,描述在這里

來自其他WAR的類版本(在類/ WEB-INF / lib上)在另一個WAR內部無法顯示。

您能否告訴我們可以幫助追蹤問題的更多信息:

  • 獨立庫更詳細地做了什么,它如何監視其他應用程序?

  • 如何將獨立庫添加到服務器類路徑? 是復制到YOUR_SERVER_HOME / lib,還是通過catalina.properties的shared.loader或common.loader屬性添加到服務器類路徑的文件夾

  • 是否每個WAR應用程序提供它在WEB-INF / lib下自己的郵箱廣口瓶,或者是在服務器級別的JNDI資源發布的庫如提到這里的部分安裝了JavaMail庫

  • 服務器中的任何應用程序是否都沒有在我上面提到的默認類加載模式下運行,並且正在使用delegate = true(這意味着它將首先在服務器上查看,然后才在WAR上查看)? 是如何配置的,檢查context.xml或server.xml中的Resource元素

對可能解決方案的一些建議

  1. 在Tomcat 7的安裝說明安裝一個JNDI資源的JavaMail安裝在這里的部分安裝了JavaMail庫 讓所有應用程序像在tomcat文檔中一樣使用JNDI資源,並使用shade插件排除從獨立庫中刪除java郵件。 這將始終有效,這是最推薦的解決方案。

  2. 如果您使用的是Java 7,請嘗試使用JHades對不同應用程序的類路徑進行故障排除。 您可以對WAR執行重復類的靜態分析,或查看給定類的運行時使用的版本以及可用的其他版本。

  3. 由於無法控制其他應用程序或其內容的部署設置,使用JNDI等,在所有環境和任何應用程序中都能正常工作的解決方案是重構該工具,以便它不需要郵件.jar將安裝在服務器上。 該工具可以將電子郵件請求寫入例如文件或數據庫表,並且部署在服務器上的另一個WAR將輪詢表文件並發送郵件。 或者調用bash / bat腳本,該腳本本身在單獨的java進程上發送電子郵件。

諸如Dynatrace之類的性能分析工具基於JVM代理並使用類似的機制,不需要在服務器級引入庫,代理收集數據並將其發送到收集過程,該過程將其存儲在某處以供進一步分析,處理等通過電子郵件等發送警報

希望這會有所幫助,一般來說,我沒有看到任何方法將庫部署到EE服務器,並確保它們永遠不會對不同服務器類型和不同應用程序類加載設置上的任何應用程序造成問題。

最好的方法是調整工具,使其依賴於部署在服務器上的最少的庫,將其分解為單獨的模塊,只在服務器上運行收集模塊或查看Dynatrace等替代方案。

我不熟悉maven-shade-plugin。 它是否將原始jar文件打包到一個新的jar文件中? 它是否提取原始jar文件的內容並將內容插入新的jar文件中? 如果是后者,它可能只包括類文件而不包括配置JavaMail提供程序的META-INF中的資源文件。

當然,最好的方法是只安排JavaMail jar文件的一個副本包含在服務器的類路徑中。

將Tomcat 7附帶的JavaMail版本升級到JavaMail到1.5.3,其中包含針對Bug 6668 -skip不可用的Store和Transport類的修復。 您可以從JavaMail參考實現主頁下載最新的快照和正式版本。

暫無
暫無

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

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