Freewind @ Thoughtworks scala java javascript dart 工具 编程实践 月结 math python english [comments admin] [feed]

(2011-09-13) Play的最大缺点

广告: 云梯:翻墙vpn (省10元) 土行孙:科研用户翻墙http proxy (有优惠)

Play的优点无数,缺点只有一个,但也是最大的一个:

  很多第三方的Java库在Play中无法直接使用!


这就是所谓的有得即有失。Play通过实现自己的ClassLoader,做到了修改源代码不用重启,大大提高了开发效率,让Play脱颖而出。但同时也导致与其它Java类库(涉及到ClassLoader的),与Play一起使用时,有可能因为ClassLoader的问题,无法正常运行。

比如我现在正打算使用guice,发现得去找一个play-guice的plugin。之前用Ebean,得写一个play-ebean的plugin。不知道Mybatis,是不是也需要一个plugin。

明明大家都是Java,却不能一块工作。现在我用play写网站时,一看到第三方的Java库,首先想到的就是“不知道是不是又得写个插件”,太麻烦了。

一些评论

green

总的来说我不赞同这个观点。

拿guice来说吧,给guice写plugin不是因为guice和play的class loader冲突,而是通常来讲guice并不是作为一个app的library来使用,而是有容器来初始化并调用。你可以直接在应用里面用guice,只是比较麻烦而已。另外guice模块也增强了一些特性,以更方便地在play app里面使用,比如允许注入到static member,这个原有的guice库是不能做到的。这也是仰仗play class loader的威力。

同样的道理也适用于morphia模块,你可以直接用原生的morphia库,但是morphia模块提供了好些特性让你在play里面可以讲模版本身的功能发挥得淋漓尽致,甚至衍生出更好用的特性。

要点在于play和Java传统的servlet是不同的系列,而很多在servlet容器里能直接使用的库,play需要用插件的形式来使用。另外因为有了app classloader,play往往能让库的使用更加方便,所以才会有插件加入,将本来的特性发挥更多。如果只是单纯的库,不需要容器来注入或者初始化,比方说commons-xxx之类的,应用大可放心地用,没有什么非得插件不可的说法。

comments powered by Disqus