Java XmlDecoder和Akka流仅在Docker容器内出现问题

Java XmlDecoder和Akka流仅在Docker容器内出现问题,java,docker,akka-stream,Java,Docker,Akka Stream,我在AkkaStream中使用XmlDecoder时遇到了一个问题,即仅在Docker容器中运行的应用程序中使用XmlDecoder 错误描述 java.lang.ClassNotFoundException: com/example/xmldecoder/FileDto Continuing ... java.lang.ClassNotFoundException: com/example/xmldecoder/FileDto Continuing ... java.lang.NoSuchM

我在AkkaStream中使用XmlDecoder时遇到了一个问题,即仅在Docker容器中运行的应用程序中使用XmlDecoder


错误描述

java.lang.ClassNotFoundException: com/example/xmldecoder/FileDto
Continuing ...
java.lang.ClassNotFoundException: com/example/xmldecoder/FileDto
Continuing ...
java.lang.NoSuchMethodException: <unbound>=XMLDecoder.new();
Continuing ...
java.lang.NoSuchMethodException: <unbound>=XMLDecoder.new();
Continuing ...
java.lang.IllegalStateException: The outer element does not return value
Continuing ...
java.lang.IllegalStateException: The outer element does not return value
Continuing ...
java.lang.IllegalStateException: The outer element does not return value
Continuing ...
java.lang.IllegalStateException: The outer element does not return value
Continuing ...
2019-05-22 09:42:29.145 ERROR 1 --- [onPool-worker-5] com.example.xmldecoder.FileReader        : Unexpected exception in load file, {} 
java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0
    at java.desktop/java.beans.XMLDecoder.readObject(XMLDecoder.java:251) ~[na:na]
    at com.example.xmldecoder.FileReader.lambda$loadFile$0(XmlDecoderApplication.java:66) ~[classes!/:0.0.1-SNAPSHOT]
    at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1700) ~[na:na]
    at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:1692) ~[na:na]
    at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290) ~[na:na]
    at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1020) ~[na:na]
    at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1656) ~[na:na]
    at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1594) ~[na:na]
    at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:177) ~[na:na]
}

可通过以下方式运行,例如:

@SpringBootApplication
@EnableScheduling
@Slf4j
public class XmlDecoderApplication {

private Path holderPath = Paths.get("opt", "files_to_load");

public static void main(String[] args) {
    SpringApplication.run(XmlDecoderApplication.class, args);
}

@Scheduled(fixedDelay = 30000, initialDelay = 1000)
public void readFiles() {
    FileReader reader = new FileReader(ActorSystem.create(), new ReadJob(holderPath));
    reader.loadFiles();
}
}
我想根本原因是主机docker和java之间的某个地方


提前感谢您对此提供的任何帮助

示例代码对我进行了以下修改:替换行

XMLDecoder xmlDecoder = new XMLDecoder(bis2);

i、 e.有效地强制
XMLDecoder
使用用于加载相关类的精确类加载器。但是为什么它只会发生呢

  • 码头工人
  • 如果
    --CPU
    设置为大于1
  • 阿卡河
  • 使用特定的JDK版本

  • –我只有一些(大部分)未受过教育的猜测。

    我不确定那里发生了什么,但我曾经在阅读docker for akka应用程序的资源时遇到过类似的问题。那里的问题与classloader有关。若我使用来自akka的类加载器,那个么应用程序并没有读取资源。如果我在开始时从主线程执行此操作,它会起作用。据我所知,XMLDecoder内部使用了一些类加载器
    XMLDecoder xmlDecoder = new XMLDecoder(bis2);
    
    XMLDecoder xmlDecoder = new XMLDecoder(bis2, null, null, FileDto.class.getClassLoader());