Из-за использования Spring Batch один из моих классов должен быть сериализуемым. Это отлично работает в Eclipse IDE. Но как только я создаю цель «maven install» и тестирую из командной строки, утилита десериализации Spring не находит класс, хотя Class.forName() находит его! Сериализируемый класс реализует Serializable
и имеет класс serialVersionUID
. См. пример кода:
import org.springframework.util.SerializationUtils;
public static void main(String[] args) {
try {
Class.forName("de.test.JobConfig");
System.out.println("JobConfig found as expected");
JobConfig jc1 = new JobConfig();
jc1.setCodePage("some string");
byte[] stasis = SerializationUtils.serialize(jc1);
JobConfig jc2 = (JobConfig) SerializationUtils.deserialize(stasis);
System.out.println(jc1.equals(jc2) ? "equals" : "not equals");
} catch (ClassNotFoundException e) {
System.out.println("JobConfig not found!");
e.printStackTrace();
}
...
...
}
Результат внутри Eclipse IDE: equals
Но после «установки maven»
JobConfig found as expected
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)
at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)
Caused by: java.lang.IllegalStateException: Failed to deserialize object type
at org.springframework.util.SerializationUtils.deserialize(SerializationUtils.java:75)
at de.sopra.zeb.loader.Zeb2JiraRESTLoader.main(Zeb2JiraRESTLoader.java:75)
... 8 more
Caused by: java.lang.ClassNotFoundException: de.test.JobConfig
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at java.io.ObjectInputStream.resolveClass(Unknown Source)
at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
at java.io.ObjectInputStream.readClassDesc(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at org.springframework.util.SerializationUtils.deserialize(SerializationUtils.java:69)
... 9 more
Итак, я могу найти JobConfig.class в экспортированном файле JAR даже после экспорта JAR с maven install
, что доказывает Class.forName()
. Почему это не относится к Spring Batch?