2012-07-12 105 views
1

我在项目中实现此逻辑时遇到问题。我使用ServiceLoader,我不知道或者甚至可能,但我想动态地添加JAR到一些已知的应用程序目录,因此应用程序可以在启动时加载它们。我所做的唯一的事情就是我知道如何创建可扩展的ONE JAR(带有META-INF/services),所以我可以在这个JAR中添加越来越多的提供者和类(实现)。 JAR包含在类路径中,就像普通的库一样,所以应用程序知道它。我想要实现的: 我不想扩展一个jar文件,但我想通过添加更多jar文件(比如提供者(服务)的插件来扩展应用程序,但我不知道如何。Java SPI - ServiceLoader - 将多个JAR添加到APP类路径

感谢您的帮助!

回答

4

您只需要(a)使用这些目录中所有JAR文件的URL构建的URLClassLoader,并(b)调用ServiceLoader.load(Class service, ClassLoader loader)

+0

太棒了!谢谢!猜测动态加载JAR的唯一方法是通过该URLClassLoader。无论如何,它运作良好。我没有意识到,ServiceLoader.load()方法被第二个参数 - ClassLoader重载...我知道我错过了一些东西! – Slimer 2012-07-12 20:46:37

0

我想你可能会创建一个你的客户ClassLoader。 ClassLoader将以动态模式从jar中装载类。许多框架都有一些非常类似你想要的功能。你可以看看它们中的一些代码。 jetty中的WebAppClassLoader类可能是一个起点!

+0

不需要。您根本不需要自定义类加载器。 – EJP 2012-07-12 10:09:30