我有一个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中找到吗?
答案 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。