由于使用Spring Batch,我的一门课需要被序列化。这在Eclipse IDE中非常有效。但是,一旦我构建了目标“ maven install”并从命令行进行了测试,尽管Class.forName()does找到了它,但是spring的反序列化util却找不到该类!要序列化的类实现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
因此,即使用maven install
导出JAR,也可以在导出的JAR文件中找到JobConfig.class,Class.forName()
证明了。为什么Spring Batch不是这种情况?
确保de.test.JobConfig
在maven类路径中。 (In Maven, how output the classpath being used?)
要向类路径添加依赖项,请在批处理应用程序pom.xml中将包含de.test.JobConfig
的jar添加为依赖项。