如何使用Vert.xJavaScript动态加载JAR文件



使用Vert.x JavaScript(3.8.4(,我想在运行时动态地加载JAR文件。这是必要的,因为当我的Vert.x应用程序启动时,该文件可能不存在。理想情况下,我希望能够使用这样的代码:

// load custom JAR file
requireJar("path/to/dynamic.jar");
// use class from dynamically loaded package
var instance = new com.mydynamicpackage.MyCustomClass();

我怎样才能做到这一点?

您可能会发现这个答案很有帮助:

如何使用Rhino和Eclipse从JavaScript访问外部JAR文件?

另一种有效的方法是为jar提供其他方式,即不通过javascript实现,然后检查它是否可用,如果不可用,则处理该情况。

java.lang.Class.forName( 'com.mydynamicpackage.MyCustomClass' )

如果MyCustomClass不存在,这将引发错误。

如果您不能确定jar是从不可靠的来源加载的,那么在运行时加载jar可能不是一个好主意。这至少对java世界来说是正确的。

基于这个答案,我创建了以下JavaScript函数,用于从JAR文件动态加载类:

var requireJavaClass=(function(){
var method=java.net.URLClassLoader.class.getDeclaredMethod("addURL",java.net.URL.class);
method.setAccessible(true);
var cache={};
var ClassLoader=java.lang.ClassLoader;
var File=java.io.File;
return function(classname,jarpath){
var c=cache[classname];
if (c) return c;
if (jarpath) {
var cl=ClassLoader.getSystemClassLoader();
method.invoke(cl,new File(jarpath).toURI().toURL());
cl.loadClass(classname);
}
return cache[classname]=Java.type(classname);
}
})();

相当于我在问题中发布的片段是:

var MyCustomClass=requireJavaClass("com.mydynamicpackage.MyCustomClass","path/to/dynamic.jar");
var instance = new MyCustomClass();

到目前为止,我只在JRE8中运行的Vert.x 3.8.5上测试过这一点,也就是说,我不能说这是否也适用于较旧的Vert.x版本或JRE9+。

最新更新