после сборки с помощью maven install Десериализация Java завершается с ошибкой ClassNotFoundException, хотя Class.forName() находит класс в среде IDE и экспортирует

Из-за использования 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?


person karldegen    schedule 20.11.2019    source источник


Ответы (1)


Убедитесь, что de.test.JobConfig находится в пути к классам maven. (Как в Maven выводить используемый путь к классам?)

Чтобы добавить зависимость к пути к классам, добавьте банку, содержащую de.test.JobConfig, в качестве зависимости в пакетных приложениях pom.xml.

person bastian    schedule 20.11.2019