Play Framework 2.6路由文件报错:参数列表长度超254限制求助
我之前升级Play项目的时候也碰到过一模一样的坑!Play 2.6在路由编译逻辑上做了调整,静态路由生成器会把所有路由规则打包进一个类的参数列表里,当你的routes文件足够大时,就会触发Scala编译器的默认参数列表长度限制(254)。既然你不能拆分模块,试试下面这两个简单有效的方案:
方案一:切换到注入式路由生成器(推荐)
这是最彻底的解决方法,不需要改动任何路由内容,只需要在build.sbt里添加一行配置,让Play改用InjectedRoutesGenerator:
// Scala项目用这个 routesGenerator := InjectedRoutesGenerator // 如果是Java项目,改用这个 // routesGenerator := JavaInjectedRoutesGenerator
这个生成器的原理是把每个路由规则对应的处理逻辑拆分成独立的方法,而不是把所有路由的参数塞进同一个超长的参数列表里,从根源上避开了长度限制。而且Play 2.6本来就推荐使用依赖注入,你的项目升级到2.6应该已经适配了依赖注入的控制器,所以这个方案几乎没有适配成本。
方案二:放宽Scala编译器的参数列表长度限制
如果因为某些原因不想切换路由生成器,可以直接调整Scala编译器的参数,在build.sbt里添加:
scalacOptions += "-Xmax-paramlists-length", "500" // 数值可以根据你的路由数量调整,比如设为500或更大
这个参数会告诉Scala编译器允许更长的参数列表,你可以根据自己routes文件的大小来设置合适的数值。不过要注意,不要把数值设得过大,避免引入其他潜在的编译问题。
额外小技巧:优化路由规则(可选)
如果你的routes文件里有很多重复前缀的路由,可以尝试用路由前缀来合并规则(不需要拆分模块,只是拆分到同一个模块下的多个routes文件),比如:
// 在主routes文件里添加 -> /api/v1 api.Routes
然后把所有/api/v1开头的路由放到同一个目录下的api.routes文件里,这样也能减少主路由文件的长度,间接降低参数列表的复杂度。不过你提到无法采用模块拆分路由,这个单模块内的路由拆分应该是可以接受的,当然如果不想动路由结构的话,前面两个方案就足够了。
内容的提问来源于stack exchange,提问作者MÖRK

