再向banq老师及广大道友求教一个关于java如何调用脚本语言中的类的问题

我打算在应用里集成脚本语言支持,可是我怎样才能在我的java程序中调用脚本语言里定义的类呢?

任何脚本语言都可以,javafx/jpython/groovy等等,随便一种都可以。


*请注意,是调用脚本,我不管编译,java或容器可以编译但是我不管细节,因为我想通过web浏览器来直接编辑脚本。


这个想法可以实现吗?Banq老师请多指教

你这个想法和主流思路相反。
脚本调用java ,简化开发,甚至到了只需要jvm ,基于jvm 的脚本。
java调用脚本,没有必要,脚本有自己的特定条件。

banq老师,现实里经常有这样一种情况:

大的框架需要用java语言规划出来,但是应用里还有一部分经常变动的规则,这部分最好由脚本语言嵌入进来,现实经常变化的规则定制。

有一种典型的应用,在RPG游戏里,像资源管理、图像显示、通讯等等都是固定的,这些可以用C++实现,但是游戏的剧情是经常变化的,每个节日都要定制针对这个节日的剧情,每年的节日活动,剧情都不一样,这一部分就用lua等脚本语言嵌入进来实现。


这种需求其实在很多场合下都有,我想知道在java里能实现这样的功能吗?


最好不用我来编译,能够互相传递java对象是必须的。

如果用我来编译的话也可以,可是我的应用在jboss里。我试过一使用一个简单的classloader load出自己编译过的java类,但是发现这些类与jboss的classloader加载的类发生cast Exception。我应该把我的class loader的parent设置成jboss ejb组件的classloader,这样只有脚本中定义的类是从自定义的class loader中加载的,其它的基本类还由jboss ejb的class loader加载,可惜这方面资料太少,谁能给一点资料或是一点提示...


另一条路就是绕过java的classloader机制,尝试使用更高层一点的协议,像基于http的webservice等...? 如果可能,还是pure java+脚本简单...


先谢谢banq老师的热心回复!


[该贴被atester于2009-10-04 10:29修改过]

我个人认为,剧本由脚本编写属于脚本调用java 类型,现在脚本双向调用技术很成熟,包括javascript jython scala jruby 等都可以的。而且这是一个

你的需求包含很多技术架构,用脚本写规则,这是直接运行在服务器上,如用脚本实现界面逻辑,可通过rest 等接口通讯来实现。

谢谢,头一次听说REST,头都大了...

我试过在一个普通的Java Project中调用脚本没问题,但是在ejb容器中不行。

我的做法是用java定义一个接口,然后脚本实现这个接口,把编译过的.jar文件用自定义的classloader加载进来,开始的时候自定义的classloader找不到接口,索性我把接口文件也放到自定义的classloader搜索路径中,这下接口是找到了,但是这个接口与ejb中的接口不是一个类,因为不是用一个classloader加载的....想来要这样做只能找出ejb的classloader是哪个,然后把它设置为自定义classloader的父?

不同EJB容器,classloader策略不一样,这个基本难以做到,只能根据特定容器绑定死。

这里其实就体现EJB的根本问题,它为解决一类问题,采取一些强封装,也就是说:它为解决某类问题采取断肢截背,结果这方面就成为弱项,而如果将来拓展恰恰是这方面,它就无能为力,所以,只依赖JVM是最好的设计。

JDK6内建了对脚本语言的支持。缺省情况下可以支持JavaScript,扩展可以支持Groovy、Python、Ruby等20多种语言。可以支持字符串和文本等多种方式传入文本。支持Java和脚本语言双向传参。
只要你的JDK是6.0及其以上版本,就可以直接使用了。不过如果要使用JS之外的脚本语言,其Java实现必须在ClassPath中并支持JDK6的脚本引擎。
详情请参考javax.script包的相关资料。
要注意的是你这种在Web页面上自定义编写脚本的功能可能引发安全问题。比如写一个把硬盘格式化、删除文件、死循环耗光资源的脚本传进去就麻烦了。
[该贴被wlmouse于2009-10-05 18:51修改过]

to wlmouse:

非常感谢

这应该是jdk6的一些新特性吧。。。哈哈。。学习了。