使用“ maven install构建后”,尽管Class.forName()在IDE中找到该类并导出,但Java反序列化失败并显示ClassNotFoundException

问题描述 投票:0回答:1

由于使用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不是这种情况?

java deserialization spring-batch classloader urlclassloader
1个回答
0
投票

确保de.test.JobConfig在maven类路径中。 (In Maven, how output the classpath being used?

要向类路径添加依赖项,请在批处理应用程序pom.xml中将包含de.test.JobConfig的jar添加为依赖项。

© www.soinside.com 2019 - 2024. All rights reserved.