[英]gson.JsonObject and class loading creating very odd situations
我有一些依賴的maven項目回到:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.1</version>
</dependency>
導致下載單個gson-2.8.1.jar文件。 我使用“clean package”maven構建檢索此文件的副本,因此我可以為我的Web應用程序動態加載的類使用的共享庫引用單個目錄。
由於war文件構建策略(使用“clean install deploy”maven build),war文件也在其WEB-INF / lib目錄中獲取gson-2.8.1.jar文件的副本。 據我所知,這些都來自同一個jar文件。
但是,在運行Web應用程序並使用如下調用時:
JsonObject retVal = null;
try {
paramData.add(0, userID);
paramData.add(0, session);
retVal = (JsonObject) method.invoke(null,
paramData.toArray(new Object[0]));
} catch (Exception e) {
我得到一個奇怪的例外:
"Caused by: java.lang.ClassCastException: com.google.gson.JsonObject cannot be cast to com.google.gson.JsonObject"
我不明白為什么從共享庫目錄中的gson-2.8.1.jar文件加載的相同JsonObject類與可能從戰爭中的gson-2.8.1.jar加載的JsonObject類不兼容文件。 它們具有相同的大小等,並且是同一類...因為它們都來自相同的gson-2.8.1.jar文件...
我試圖隔離這些類,因此只調用共享庫目錄中的一個jar文件(例如,將其從war文件中刪除)。 但是,在某些情況下,我會在嘗試動態加載類時創建一個未找到類的類。
我意識到我的描述很難理解。 是否有一些原因從這個jar加載的JsonObject會導致Java認為它有兩個不兼容的類,因為它們可能已被不同的類加載器加載時加載的是同一個對象?
您正在觀察的是預期的類加載行為。 如果從兩個不同的源加載相同的Foo
類,從JVM的角度來看,這是兩個不同的類,因此不能相互轉換(即Foo cannot be cast to Foo
)。 同樣,如果您從兩個不同的類加載器加載了相同的類Foo
,則這些類也不能相互轉換。
要解決此問題,只需刪除其中一個副本即可。 由於您已經完成了設置共享庫(這是首選方法)的工作,只需通過將maven依賴項的范圍更改為“提供”,從應用程序WEB-INF / lib目錄中刪除gson jar。
例如:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.1</version>
<scope>provided</scope>
</dependency>
這告訴maven在編譯時包含這個依賴項,但不是在運行時(因為我們知道它將由共享庫提供)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.