我正在构建一个加载模块的服务器。每个模块都是.jar
文件。在jar中,有模块需要的所有类。服务器需要读取jar,找到主类(它没有主要方法就是使模块工作但不作为不同程序的类),构建该类的对象并将其存储在向量中模块,以便它可以访问特定模块,具体取决于要完成的工作。
我该怎么做?
就服务器而言,它是侦听和接收请求,但是没有模块可以委托作业,因为我的模块向量是空的。
答案 0 :(得分:2)
Here is a network class loader示例。 这应该涵盖你需要的一切。
获取原始URLClassLoader
的URL后,请尝试使用此语法JAR网址
JAR URL的语法是:
jar:<url>!/{entry}
例如:
jar:http://www.foo.com/bar/baz.jar!/COM/foo/Quux.class
jar:file:/export/home/faculty/stansif/public_html/java/applets/image/view.jar!/image.gif
访问资源
final java.net.URL url = X.class.getResource ("/dir/image.png");
final ImageIcon icon = new ImageIcon (url);
另请查看此网址http://www.javaworld.com/javaworld/javatips/jw-javatip70.html
答案 1 :(得分:2)
您应该使用Java的ServiceLoader类
http://java.sun.com/javase/6/docs/api/java/util/ServiceLoader.html
这要求您的JAR在META-INF / services目录中有一个提供程序配置文件。这是用Java加载模块的标准内置方法。如果您需要更强大的模块加载,您可能需要查看OSGi。
答案 2 :(得分:1)
您应该查看现有框架,包括轻量级OSGi容器。但是,所采用的一般方法是为每个模块创建一个类加载器,并使用Reflection或通用API调用每个模块 - Runnable
和Callable
是两个好的候选者。