使用JavaScript提供的其他包中的Eclipse RCP包

时间:2018-02-06 10:00:20

标签: eclipse rcp nashorn

我有一个Eclipse RCP应用程序,可以评估Nashorn JVM上的JavaScript文本。

Bundle A实现了对JS的评估。

JS脚本引用了Bundle B中的类,例如。一个枚举类。但Bundle B并不知道Bundle B.Bundle B通过读取外部jar文件来动态加载类。

现在当我使用importPackage或Java.type时,我得到一个ClassNotFoundException。

在Bundle A中,我可以从JAR中检索Bundle B中的对象。使用它的类加载器,我也可以从JAR访问其他类。

var district = districts.district;

function generateCities(cities){
    cities.map((city) => {
        return (
            "<li>"+ city.name  + "</li>"
        )
    })
}

function generateStates(states, generateCities){
    states.map((stat) => {
        return (
            "<li>"+stat.name + " consists of following cities --- population " + stat.population + "</li>"
            +"<ol>" + generateCities(stat.cities) + "</ol>"
            )
    });
}
function generateMyHtml(district, generateStates){
    district.map((dist, index) => {
        return (
            "<li> District "+ index + "consists of following states --- ration " + dist.ration + "</li>"
             +"<ol>" + generateStates(dist.states) + "</ol>"
        )   
    });
};

这成功。
我可以用某种方式来制作这个包裹,我的。*&#39; (来自Bundle B)可以在JS中找到吗?

2 个答案:

答案 0 :(得分:0)

如果你有一个java.lang.Class实例,你可以将它作为全局变量公开给脚本并在其上使用“static”属性。

在Java中:

// Class yourClassObject = ...

// expose Class object as variable to your script
// "engine" is nashorn engine instance

engine.put("MyClass", yourClassObject);

在JavaScript中:

var M = MyClass.static;
var obj = new M(); // create object
M.func(); // call static method

答案 1 :(得分:0)

最干净的方法是让Bundle A为Bundle B提供API或扩展点,以便将其类加载器或一些特定类添加到在Bundle A中实例化的Nashorn引擎。

另一种方法是查看Eclipse-BuddyPolicy,它允许类加载器在包之间“泄漏”:https://wiki.eclipse.org/Context_Class_Loader_Enhancements#Buddy_Class_Loading。但这恰好是对OSGi的破解,这使得维护更加困难并且代码无法移植到其他OSGi容器比Equinox。