错误信息

在将playwright部署到linux容器中的时候,总是报下面的错误:

[pool-3-thread-1] 2022-04-11 21:12:01,482 DEBUG (BaseCapture.java:143)- 开始初始化Playwright, 配置参数为[CaptureConfig(retryCount=8, headless=false, sandbox=false, chromeExtPath=/opt/google/chrome/chrome, tempDir=/tmp/capture)] Exception in thread “pool-3-thread-1” java.util.zip.ZipError: zip END header not found at com.sun.nio.zipfs.ZipFileSystem.zerror(ZipFileSystem.java:1661) at com.sun.nio.zipfs.ZipFileSystem.findEND(ZipFileSystem.java:1040) at com.sun.nio.zipfs.ZipFileSystem.initCEN(ZipFileSystem.java:1049) at com.sun.nio.zipfs.ZipFileSystem.(ZipFileSystem.java:130) at com.sun.nio.zipfs.ZipFileSystemProvider.newFileSystem(ZipFileSystemProvider.java:117) at java.nio.file.FileSystems.newFileSystem(FileSystems.java:326) at java.nio.file.FileSystems.newFileSystem(FileSystems.java:276) at com.microsoft.playwright.impl.DriverJar.extractDriverToTempDir(DriverJar.java:89) at com.microsoft.playwright.impl.DriverJar.initialize(DriverJar.java:44) at com.microsoft.playwright.impl.Driver.ensureDriverInstalled(Driver.java:52) at com.microsoft.playwright.impl.PlaywrightImpl.create(PlaywrightImpl.java:40) at com.microsoft.playwright.Playwright.create(Playwright.java:96) at com.microsoft.playwright.Playwright.create(Playwright.java:100) at ai.guiji.capture.BaseCapture.init(BaseCapture.java:144) at ai.guiji.service.impl.CaptureServiceImpl.lambda$jdCaptureAll$0(CaptureServiceImpl.java:103) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748)

单步调试

经过单步调试,发现playwright初始化的时候,会有如下操作:

  1. 将当前jar包中的依赖库driver-bundle-1.20.1.jar解压到临时目录
  2. 再读取解压好的driver-bundle-1.20.1.jar,以便找到playwright的驱动。

问题就出在第一步,解压出去的jar包不可用,虽然大小还是一样的,但是格式错误,无法当作zip解压。
如下:
image.png
如下,不可解压:
image.png

解决方案

深层次的原因暂时没有精力排查,目前的解决方案是重新打jar包,将所有的lib依赖放到外面。
这样在拷贝文件的时候,就不会出现解压错误。
具体实现的步骤参考:如何打造瘦身的spring boot jar?