簡體   English   中英

gson.JsonObject和類加載創建非常奇怪的情況

[英]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.

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