錯誤學習:Java + OSGi

最近,我致力于在OSGi環境中使Apache Hive工作。 雖然沒有被證明是小菜一碟(軟件對嗎?。。為什么我不感到驚訝? :) ),它引導我解決了各種Java和OSGi錯誤。 在這里,我列出了其中一些讓我有些吃力的東西(沒有雙關語),所以我想為了自己的滿意而在它們上面寫一個博客。

java.lang.VerifyError

在初始化OSGi服務組件之一的過程中,我感到很討厭。 由于違規捆綁軟件處于活動狀態,因此無法立即識別出罪魁禍首。 從表面上看,一切看起來都不錯,除了應該在捆綁軟件中存在的服務組件初始化期間啟動的Hive服務器未啟動并正在運行的事實。 OSGi控制臺中快速顯示“ ls”,表明服務組件處于“不滿意”狀態。 最后,一個“ comp”顯示了根本原因,即VerifyError。

如果類的運行時依賴項與編譯時使用的依賴項不同,則可能會發生VerifyError。 例如,如果方法簽名在依賴關系之間更改,則將導致此錯誤。 在已接受的答案的[1]中對此進行了很好的解釋。 事實證明,在兩個捆綁包中公開了一個軟件包的稍有不同的版本,導致Hive捆綁包在編譯環境中的版本上選擇了不同的版本。 正確的OSGi版本控制是解決方案。

java.lang.IncompatibleClassChangeError

在系統中存在兩個軟件包的類似情況下,也會出現此錯誤。 正如[2]清楚地解釋的那樣,在我的案例中,這樣做的原因是在有沖突的軟件包版本之間將接口更改為抽象類。 再次,版本控制節省了一天。

java.lang.LinkageError:xxxx中違反加載程序約束–等等……

現在,這似乎是一個著名的錯誤,特別是在OSGi環境中。 根本原因似乎是由不同的ClassLoader以某種方式進入的兩個類加載的。 例如,說A類對象接受B類對象作為方法參數。 B類由ClassLoader-A加載,該類加載器也加載A類。但是,在方法調用時,由ClassLoader-B加載的B類對象如何作為參數傳遞給已加載的A類對象通過ClassLoader-A。 現在,結果將是一個很大的LinkageError,并帶有非常冗長的錯誤消息。

OSGi中基于圖的類加載結構使其特別有利于此類錯誤。 在我的案例中,罪魁禍首是一個包裝,該包裝已被復制到兩個不同的包中,并且該包中的一個特定類由每個包的單獨的ClassLoader加載,并通過方法調用期間系統中存在的第三個包來聯系。 因此,這是在OSGi中不遵循“導入導出內容”的最佳做法[3]的情況。 這樣做將有助于減少重復的包在捆綁包中的暴露,并有助于為給定的包維護一致的類空間。 因此,這就是這種情況下的解決方案。

包使用沖突:導入包:yyy; 版本=“ xxx”

在鍛煉過程中,我經常將這種不便之處丟在臉上。 在SpringSource上有兩個關于此問題的出色文章[4],[5],它們提供了很多幫助。 但是,讓我總結一下我在這個問題上的學習。 簡單來說,如果捆綁包通過直接導入并通過使用約束暴露給同一軟件包的兩個版本,則會出現此錯誤。 該圖最能說明這種情況。

捆綁軟件A直接導入org.foo版本1.0.0。 但是,它也從捆綁軟件B導入捆綁軟件org.bar。但是事實證明,軟件包org.bar也使用org.foo軟件包,盡管它是與捆綁軟件A導入的版本不同的版本(2.0.0)。直接連接到org.foo的1.0.0版本,并且由于使用org.foo的2.0.0版本的org.bar的導入而暴露于org.foo的2.0.0版本。 現在,由于無法將捆綁包連接到同一軟件包的不同版本,因此使用沖突將引起冒犯的導入org.bar作為根本原因。 (例如:程序包使用沖突:導入程序包:org.bar;版本=“ 0.0.0?”)。 解決方案是更改捆綁軟件A或捆綁軟件B中的org.bar軟件包導入版本,以使兩者都指向相同的軟件包版本。 尼爾·巴特利特(Neil Bartlett)撰寫的另一篇很棒的博客可以在[6]中找到。

java.lang.UnsatisfiedLinkError

我的一個工作朋友在嘗試將另一個第三方庫納入我們的OSGi環境時遇到了這個問題。 JavaDocs繼續說這變得“如果Java虛擬機無法找到聲明為native的方法的適當的本地語言定義,則會拋出此錯誤”。 有問題的庫是一個Linux .so(動態鏈接庫)文件,在運行時捆綁ClassLoader時看不到該文件。 通過將庫資源直接包含在捆綁軟件ClassLoader中,我們能夠使其工作。 之前在TCCL(線程上下文類加載器)上設置此資源的嘗試失敗了,這使我們意識到TCCL通常不是捆綁軟件類加載器。 在Equinox OSGi環境下可以很好地閱讀TCCL,請參見[7]。

[1] http://stackoverflow.com/questions/100107/reasons-of-getting-a-java-lang-verifyerror
[2] http://stackoverflow.com/questions/1980452/what-c??auses-java-lang-incompatibleclasschangeerror
[3] http://blog.osgi.org/2007/04/importance-of-exporting-nd-importing.html [4] http://blog.springsource.org/2008/10/20/understanding-the-osgi-uses-directive/ [5] http://blog.springsource.org/2008/11/22/diagnosing-osgi-uses-conflicts/ [6] http://njbartlett.name/2011/02/09/uses-constraints.html [7] http://wiki.eclipse.org/Context Loader_Enhancements

參考: 錯誤學習:來自Source Open博客的JCG合作伙伴 Buddhika Chamith的Java + OSGi 。


翻譯自: https://www.javacodegeeks.com/2012/05/learn-by-errors-java-osgi.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372778.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372778.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372778.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

iOS多Targets管理

序言: 個人不善于寫東西,就直奔主題了。 其實今天會注意到多targets這個東西,是因為在學習一個第三方庫FBMemoryProfiler的時候,用到了,所以就搜索了一些相關資料,就在這里記錄一下。 可能每個人都會遇到這…

優化的34條定律

1.Minimize HTTP Requests 減少HTTP請求 圖片、css、script、flash等等這些都會增加http請求數,減少這些元素的數量就能減少響應時間。把多個JS、CSS在可能的情況下寫進一個文件,頁面里直接寫入圖片也是不好的做法,應該寫進CSS里,…

休眠提示:排序和排序

讓我們介紹另一個休眠性能提示。 你還記得以前的休眠的模式后 ? 我們有一個與一對多協會有關的星際飛船和軍官。 Entity public class Starship {Id GeneratedValue(strategyGenerationType.SEQUENCE) private Long id;public Long getId() {return id;}protected v…

java 基本類型 線程安全_java的基本類型和i++線程安全性的深入解析

在java中,除了long和double的8個字節、64位比特的變量外,其他的基本變量都是原子性的。java存儲模型要求獲取和存儲操作都為原子性,但是對于非volatile的long和double變量,jvm允許將64位的讀或寫劃分為兩個32位的操作。如果讀和寫…

MySQL配置文件mysql.ini參數詳解

my.ini(Linux系統下是my.cnf),當mysql服務器啟動時它會讀取這個文件,設置相關的運行環境參數。 my.ini分為兩塊:Client Section和Server Section。 Client Section用來配置MySQL客戶端參數。 要查看配置參數可以用下面…

微信公眾平臺和微信開放平臺的區別

自己也剛開始做微信開發,先寫寫自己的認識: 用微信公眾平臺可以做手機端H5頁面的微信登錄,微信支付 用微信開放平臺可以做PC端網頁的微信登錄。 轉載于:https://www.cnblogs.com/mafeng/p/5610770.html

java 傳遞bean_如何將bean作為參數傳遞給JSP標記?

我ve created a custom JSP tag that is supposed to accept a list of products to render, but I我無法弄清楚如何將列表傳遞給標簽 . 產品列表作為頁面范圍的bean存在 . Web應用程序使用Struts taglib在Struts 1.2.x中編寫 .這是我的代碼的簡化版本:renderProduc…

Business Component(BC)和Business Object(BO)

Siebel應用架構的一個成功的地方就是在應用里引入了BC,BO的概念,從而使得幾千張關系數據表能夠按照業務的含義組織成業務對象,對于業務人員而言具有了業務上的含義,而不僅僅是從技術人員的觀點來對待數據(就是關系表而…

NetBeans可用性提示

的Java IDE都來了,因為在很長的路要走天的JBuilder的 (盡管JBuilder中似乎是一個值得歡迎提前在時間)。 當今的Java IDE(例如NetBeans , Eclipse , IntelliJ IDEA和JDeveloper )是非常先進的工具…

一個JVM進程啟動后里面有幾個線程

在寫Java程序時,通常我們管只有一個main函數(而沒有別的Thread或Runnable的程序)叫單線程程序。但是我們寫的這個所謂的單線程程序只是JVM這個程序中的一個線程,JVM本身是一個多線程的程序,至少得有一個垃圾收集器線程…

WPF 反編譯后錯誤處理

1. 首先,手動創建一個WPF工程(WpfApplicationReflectorDemo) 2. 把生成的WpfApplicationReflectorDemo.exe 拖到ILSpy里 3.點擊 File -> Save Code...: 相應的代碼會生成到指定地方。 4. 打開應用程序,并且編譯它,此…

JavaFX 2 GameTutorial第1部分

介紹 我相信大多數軟件開發人員可能會在年輕人(年輕人)一生中的某一時刻被迫創建游戲來幫助他們學習編程語言(我知道我確實做到了)。 以前,我的第一臺計算機實際上是Franklin Ace 1000 ,后來是Apple [] 。 …

虛擬現實-VR-UE4-認識UE4

VR的火熱,讓每個人都想參與一下, 公司在展會上面搞了一個VR的Demo,關注度超出預期,使得公司高層決定來個VR項目 所以 關于UE4 百度百科地址:http://baike.baidu.com/link?urlmEmbwOcqEuqtkfdu9lNdxVtWAkv0Q6UHZ4VgIHr…

java concurrent 例子_[Java Concurrent] 并發訪問共享資源的簡單案例

EvenGenerator 是一個偶數生成器,每調用一個 next() 就會加 2 并返回疊加后結果。在本案例中,充當被共享的資源。EvenChecker 實現了 Runnable 接口,可以啟動新的線程執行 run() 任務,用于檢測所指向的偶數生成器是否每次都返回偶…

OSGI實戰第一章

第一章 解開OSGI的面紗 OSGI是什么?是Java平臺的一個模塊化層。模塊化:軟件應用程序的代碼被分割為表示獨立內容的邏輯單元,可簡化開發,可通過強化邏輯模塊的界限來提高可維護性。Java模塊化的不足a) Java使用訪問…

輕松完成Birt報告

這是使用Birt插件在Eclipse中構建報告的完整指南。 Birt或Business Intelligence and Reporting工具是一種無需編寫太多Java代碼即可生成報告的工具。 如果您使用的是ireport,那么您知道我在說什么:)(晶體報告..毫無意義&#xff…

MySQL 的 RowNum 實現

MySQL 下面沒有RowNum,排序后序號卻無法得到,比較麻煩! SELECT rownum:rownum1 rownum, CollectSn From(SELECT rownum:0,bbgmain.* FROM qbdb.bbgmain WHERE collectsn! ORDER BY collectsn limit 10) t轉載于:https://www.cnblogs.com/hym-…

java jdbc事務管理_hibernate事務管理 (jdbc jta)

評論# re: hibernate事務管理 (jdbc jta)2007-07-29 10:18pigJTA事務的開始Transaction tx session.beginTransaction();應該不是這樣吧,應該是從容器中獲得。 回復 更多評論# re: hibernate事務管理 (jdbc jta)2007-07-29 12:35slxpig建議看看hibernate referen…

@Resource VS @Autowired

Resource 和 Autowired 均是用于bean注入的注解,都可以寫在字段和setter方法上,如果都寫在字段上,就無需寫setter方法。 Autowired 由Spring的org.springframework.beans.factory.annotation.Autowired提供 默認byType方式注入,并且對象不能為…

用于Spring應用程序的Gradle原型

我發布了Gradle原型,可用于基于Springframework創建Java / Groovy應用程序。 當然,它不是一個真正的原型,因為這樣的創作是不可能的 。不過,你可以創建,編輯和部署應用服務器很少的步驟。 對于可部署的軟件項目而言&am…