當我嘗試執行程序時,我遇到了問題(破壞的類路徑?)。 .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
所以我的問題是,是什麼問題,如何解決?
檢查目錄類 –
如果你想讀一個序列化的集合是指老'com.company.Clerk'類和你感動該類到一個新的包,你將無法讀取它因爲java會尋找舊的路徑。 – StepTNT
您可能會嘗試編寫自己的類加載器:https:// dzone。com/articles/java-classloader-handling – Gavriel