2016-02-23 34 views
0

當我嘗試執行程序時,我遇到了問題(破壞的類路徑?)。 .class文件位於: C:\...\...\...\StoreDirectorySystem4.0\bin\build\classes\system,所以我將類路徑指向system文件夾。我也嘗試指向jar文件,但無濟於事,繼續:重構包後反序列化時的ClassNotFoundException

指定.zip或.jar文件的路徑時,必須以文件名結束路徑。指定.class文件的路徑時,該路徑應以包含.class文件的文件夾結尾。 (source

然而,當我生成項目(螞蟻),它拋出一個ClassNotFoundException。這是堆棧跟蹤:

[java] java.lang.ClassNotFoundException: com.company.Clerk 
    [java]  at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
    [java]  at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    [java]  at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
    [java]  at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    [java]  at java.lang.Class.forName0(Native Method) 
    [java]  at java.lang.Class.forName(Class.java:348) 
    [java]  at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java :626) 
    [java]  at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream. java:1613) 
    [java]  at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518) 
    [java]  at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1774) 
    [java]  at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351) 
    [java]  at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371) 
    [java]  at java.util.ArrayList.readObject(ArrayList.java:791) 
    [java]  at sun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethod) 
    [java]  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    [java]  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    [java]  at java.lang.reflect.Method.invoke(Method.java:497) 
    [java]  at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1017) 
    [java]  at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1900) 
    [java]  at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801) 
    [java]  at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351) 
    [java]  at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371) 
    [java]  at system.Directory.readFile(Unknown Source) 
    [java]  at system.Directory.<init>(Unknown Source) 
    [java]  at system.DirectoryServer.main(Unknown Source) 

問題是,所述Clerk類不再在com.company存在(I重構了包中的IntelliJ IDEA的名稱)。它存在於前面提到的system包中。 Clerk已在其中聲明package system;。 唯一的例外出現,當我嘗試在序列化集合中的Directory類閱讀,特別是在這裏:

public ArrayList<Employee> readFile() { 
    try (ObjectInputStream inputStream = 
       new ObjectInputStream(new FileInputStream(this.file))) { 
     employeeList = (ArrayList<Employee>) inputStream.readObject(); 
    } catch (ClassNotFoundException | IOException e) { 
      e.printStackTrace(); 
    } 
    return employeeList; 
} 

的jar文件包含:

META-INF/ 
META-INF/MANIFEST.MF 
system/ 
system/Clerk.class 
system/Directory.class 
system/DirectoryServer.class 
system/Employee.class 
system/FullTime.class 
system/Manager.class 
system/PartTime.class 

所以我的問題是,是什麼問題,如何解決?

+0

檢查目錄類 –

+0

如果你想讀一個序列化的集合是指老'com.company.Clerk'類和你感動該類到一個新的包,你將無法讀取它因爲java會尋找舊的路徑。 – StepTNT

+0

您可能會嘗試編寫自己的類加載器:https:// dzone。com/articles/java-classloader-handling – Gavriel

回答

1

ClassNotFoundException的:com.company.Clerk

這意味着它無法找到類com.company.Clerk所以你需要在你的JAR com/company/Clerk.class或具有以上com/company/Clerk.class目錄中的類路徑。

總之,包裝必須符合目錄類是英寸

他說他重構的代碼,並改變了包裝,並希望反序列化的東西,是在重構

之前連載

這不會更改序列化格式,並且標準序列化不支持別名或重命名。在運行時需要反序列化原始類並將其轉換爲新類。

+0

這是全部真實的,但恕我直言,它不幫助OP,因爲他似乎知道這一切,他說他REFACTORED的代碼,並改變了軟件包,並想反序列化一些序列化在重構之前 – Gavriel

+0

@Gavriel好點,那麼OP真的已經知道解決方案,但是OP不知道的是,真的沒有其他方法可以構建Java序列化(除非他創建了自定義類加載器)其他一些序列化庫支持別名。 –

0

存儲在文件中的對象具有com.company.Clerk類。當你改變它的名字時,這個類就停止了,所以顯然不可能再讀取這些對象。您的選擇是:將課程名稱改回原來的樣子,或者創建一個程序將文件從一種格式轉換爲另一種格式,或者接受您將丟失文件中的數據並繼續使用您的生活,或者添加解析舊類名作爲新類的代碼(覆蓋resolveClass方法)。

相關問題