Java 动态加载jar并在其中执行任意代码

Java 动态加载jar并在其中执行任意代码,java,jar,dynamic-loading,Java,Jar,Dynamic Loading,我正在编写一个java控制台应用程序,我希望人们能够为它编写插件,然后将这些插件作为JAR分发。我希望用户能够将插件(jar)放入“插件”文件夹,重新启动应用程序,并加载和运行插件。我不希望用户必须为插件或类似的东西指定要执行的类/方法 我可以使用通配符类路径将JAR加载到“plugins”目录,但是我需要一些方法让这些插件通过运行每个插件需要在某处定义的register()方法向应用程序注册自己。插件(jar)如何指定它的register()方法的定义位置(包和类),以便我的应用程序知道如何调

我正在编写一个java控制台应用程序,我希望人们能够为它编写插件,然后将这些插件作为JAR分发。我希望用户能够将插件(jar)放入“插件”文件夹,重新启动应用程序,并加载和运行插件。我不希望用户必须为插件或类似的东西指定要执行的类/方法

我可以使用通配符类路径将JAR加载到“plugins”目录,但是我需要一些方法让这些插件通过运行每个插件需要在某处定义的
register()
方法向应用程序注册自己。插件(jar)如何指定它的
register()
方法的定义位置(包和类),以便我的应用程序知道如何调用它

我意识到OSGi可以实现这一点,但这是一个相当小的应用程序,如果存在更简单的解决方案,我宁愿不使用OSGi

背景:


这些插件从他们想要处理的应用程序中注册事件。用户将能够在每个插件的基础上禁用特定事件的处理,因此这些插件的配置将存储在应用程序的数据库中。当插件自行注册时,应用程序将检查数据库,查看是否存在该插件的配置,如果不存在,则将在数据库中为其创建新的默认配置。

为应用程序定义一个清单文件,以标准化此行为。您可以将其实现为属性文件、XML或您选择的任何格式。清单文件将包含一个标准属性名,其值为插件的“启动类”。让用户从您定义的接口或抽象类扩展此启动类,以便您可以强制执行预期行为(也称为“注册”方法)

最终用户然后将其类文件和清单捆绑到一个JAR中,并将其分发到应用程序的插件文件夹中


OSGI绝对适合这个,你看过吗?它的部署规模小得可笑。

您的注册方法大概是插件接口的一部分吧


如果是这样,您可以实现自定义类加载器来检测实现此接口的类。然后随后使用基于侦听器的方法通知管理插件的任何对象类的存在

还有另一个线程,您可能会发现它很有用


另外,请尝试查看

我没有看礼宾部,我会看一看。对于您的解决方案tho,您正在讨论的清单文件是jar中的/META-INF/manifest.MF,对吗?我如何从该文件中读取值?@bigheels-我使用了术语manifest,从更一般的意义上讲,不使用JAR manifest文件可能是个好主意。我将用一个例子来扩展我的答案。好吧,你说的很有道理,只是我仍然不确定如何将该文件中的值输入到我的应用程序中,以便我可以使用它们。最后,我开始尝试这个,这似乎很好,谢谢:)