Play Framework 2.4.11升级至2.6遇路由编译错误求助
嘿,这个问题我之前帮好几个迁移Play版本的开发者处理过,Play 2.6在路由编译逻辑上的变化确实容易触发这个JVM方法大小的限制,结合你的情况,给你几个针对性的解决方向:
继续拆分路由文件:Play 2.6支持多路由文件的引入,你不用只局限于routes2,可以按业务模块、功能维度拆分成更多小文件(比如routes-api、routes-admin、routes-user等),每个文件控制在30条左右的路由试试。然后在主routes文件里用
->指令引入这些子路由,示例:-> /api routes.ApiRoutes -> /admin routes.AdminRoutes -> /user routes.UserRoutes这样每个拆分后的路由文件会生成独立的路由类,单个方法的代码量就不会超过JVM的64KB限制了。
精简或移除路由注释:报错里明确提到“Method documentation’s code too large”,说明Play 2.6会把路由的注释内容生成到字节码的文档段里,如果你的路由里有大量长注释(比如大段的接口说明、复制粘贴的文档),试着精简这些注释,或者直接删掉非必要的注释,能大幅减少生成方法的体积。
关闭路由文档生成:如果路由注释对你来说不是必须的,可以在
build.sbt里添加配置彻底关闭路由的文档生成逻辑,这能直接砍掉生成代码里的文档部分,配置如下:PlayKeys.routesGenerator := InjectedRoutesGenerator PlayKeys.routesDocumentation := Nil配置后重新编译,应该能立刻看到效果。
升级到Play 2.6的最新小版本:Play 2.6.x后续的小版本(比如2.6.20及以后)对路由编译做了不少优化,修复了一些生成代码冗余的问题,你可以尝试升级到2.6系列的最新稳定版(比如2.6.25),说不定官方已经帮你解决了部分代码体积问题。
简化复杂路由规则:如果你的路由里有大量带正则匹配、多动态参数的复杂路径,这些会让生成的路由匹配代码变得非常庞大。试着把复杂的匹配逻辑移到控制器里处理,或者简化路由的路径规则,比如把多参数的路由拆分成更简单的结构。
先从拆分路由和关闭文档生成这两个方向入手,这两个是最直接见效的方法,一般都能解决这个编译错误。
内容的提问来源于stack exchange,提问作者daemonThread

