0

Due to use of Spring Batch one of my classes needs to be serializable. This works perfectly in the Eclipse IDE. But as soon as I build the target "maven install" and test from command line, the deserialization util of spring does not find the class although a Class.forName() does find it! The class to be serialized implements Serializable and has a serialVersionUID. See code example:

    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();
        }
        ...
        ...
    }

The result is inside Eclipse IDE: equals

But after 'maven install'

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

So, I can find the JobConfig.class in the exported JAR file even after exporting the JAR with maven install, what the Class.forName() proves. Why is this not the case for Spring Batch?

karldegen
  • 113
  • 8

1 Answers1

0

Make sure that de.test.JobConfig is in the maven classpath. (In Maven, how output the classpath being used?)

To add a dependency to classpath, add the jar which contains de.test.JobConfig as a dependency in the batch applications pom.xml.

bastian
  • 106
  • 2