V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dcsuibian
V2EX  ›  Java

无法通过 web 访问 jar 包中的一个 0 字节的文件

  •  
  •   dcsuibian · 2022-02-25 13:39:45 +08:00 · 1352 次点击
    这是一个创建于 995 天前的主题,其中的信息可能已经有所发展或是发生改变。

    无法访问 jar 包中的一个 0 字节的文件

    我目前正在做一个小型 web 项目。因为项目比较简单,所以用不上 nginx ,而是把前端生成的文件直接放到 /src/main/resources/static 下。

    开发模式用 IDE 运行项目时没有什么问题,但在打包后用java -jar 后会发现前端有一个 chunk 访问不到:

    image-20220225125800200

    然而在生成的 jar 包中,这个chunk-6800bed8.432245a1.css文件是有的,而且和其它 css 文件一样放在BOOT-INF/classes/static/css目录下:

    image-20220225125913381

    其它的 css 访问完全没有问题,但这个就不行。发现的唯一区别就是它的大小是 0B ,也就是空的,怀疑 Spring Boot 在生产模式下对空文件做一些处理。但不确定也不知道怎么解决,所以来问问,请大佬解答。

    附加信息:

    1 、Java:openjdk 11.0.12 。Spring Boot:2.5.3

    2 、前后端分离,前台 vue2 全家桶。空的 chunk 文件确实不应该产生,但我认为即使产生了,Spring Boot 也应该帮我返回回去,最主要是打包后行为不一致。

    3 、前台路由的配合方式是用 ErrorPages ,除了状态码不对外,效果上应该没问题。

    image-20220225131727080

    对比

    通过 IDE 运行:

    其它文件正常访问:

    image-20220225132820037

    此文件也能正常访问(只不过是空的):

    image-20220225132829658

    java -jar 运行:

    其它文件仍能正常访问:

    image-20220225132922170

    此文件无法正常访问(返回了 ErrorPage ):

    image-20220225132936305

    第 1 条附言  ·  2022-02-25 16:49:14 +08:00

    找到问题所在了,ClassPathResource对File URL和jar URL采取不同的做法:

    image-20220225162730187

    在jar中,空文件和目录会被认为是不可读的。而打包走了另一条路。

    这个问题的背景是:https://github.com/spring-projects/spring-framework/issues/21372,有人访问了一个空文件夹,但下载了一个空文件。

    跟我遇到相同问题的有:https://github.com/spring-projects/spring-boot/issues/16034,不过是在spring-boot里。

    我的issue:https://github.com/spring-projects/spring-framework/issues/28107

    2 条回复    2022-02-25 13:57:00 +08:00
    cslive
        1
    cslive  
       2022-02-25 13:52:55 +08:00
    有可能打包之后文件损坏
    dcsuibian
        2
    dcsuibian  
    OP
       2022-02-25 13:57:00 +08:00
    @cslive 重新打包过几次,maven 3.8.1 ,mvnw 也试过。应该不是损坏,最主要是 jar 包确实里有这个文件,
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2853 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 05:57 · PVG 13:57 · LAX 21:57 · JFK 00:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.