如何使java应用程序的外部JAR对其插件可用

如何使java应用程序的外部JAR对其插件可用,java,Java,我想制作一个支持插件的java应用程序。现在,我的核心将在某些过程中使用JAR。如果我的插件在何处也要使用这些JAR,那么我的应用程序的插件是否需要配置其构建路径以包括它们也将使用的JAR,或者是它们的一种方式,以便可以像我从主应用程序导入包一样导入JARGuice和Spring是依赖项注入的工具,这意味着使用它们创建对象更容易,因为它们负责实例化对象并将它们放置到依赖于它们的其他对象中 现在,当我们谈论插件时,我们通常也在谈论将新类动态加载到正在运行的应用程序中。考虑一下EclipseIDE。

我想制作一个支持插件的java应用程序。现在,我的核心将在某些过程中使用JAR。如果我的插件在何处也要使用这些JAR,那么我的应用程序的插件是否需要配置其构建路径以包括它们也将使用的JAR,或者是它们的一种方式,以便可以像我从主应用程序导入包一样导入JAR

Guice和Spring是依赖项注入的工具,这意味着使用它们创建对象更容易,因为它们负责实例化对象并将它们放置到依赖于它们的其他对象中

现在,当我们谈论插件时,我们通常也在谈论将新类动态加载到正在运行的应用程序中。考虑一下EclipseIDE。它的体系结构从一开始就被设计为可插拔的,比如,您可以下载JAR,eclipse将它们添加到正在运行的应用程序中,而无需重新启动应用程序

在这种情况下,如果您想要构建可插拔的应用程序,在动态类加载的意义上,我建议您不要走这条路,而是研究OSGI之类的主题。一个流行的OSGI框架是


应用程序扩展的另一种方法,我们也可以称之为可插拔的,不知何故,我想,这取决于你的应用程序是如何组织的,它做什么,就是为它开发一个DSL,并扩展它,让人们向它添加脚本。当浏览器允许您添加用javascript编写的函数时,不是这样吗?对于java程序员来说,Groovy在某些方面使DSL更容易。请参阅

如果您想要动态可插拔系统,OSGI可以为您提供此功能,但OSGI的IMMO技术过于复杂,只有在您确实确定需要此动态插拔功能时才使用

构建可扩展系统的另一个选项是使用de-ServiceProvider机制,这是一个核心java机制,例如,它是JDBC实现使用的机制,您可以在类路径中放置JDBC驱动程序,应用程序可以找到它并使用它,而无需在代码中显式导入驱动程序类

这是在您自己的应用程序中使用ServiceProvider的示例:

当然,它比OSGI更为有限,但当您了解了这个概念后,它就非常容易使用,而且您不需要任何外部库,因为它是java核心机制

编辑:关于库

在运行时:ServiceProvider没有单独的类加载器可以实现,但默认情况下,在OSGI中,它实现了这种分离,在运行时,如果插件需要X类,并且该类位于类路径中,则一切正常,例如,主要应用程序和所有插件都使用此版本的依赖关系GUI 3,如果此版本不兼容,则不能有一个插件使用X版本,而其他插件使用X+2版本。这就是著名的hell.jar,例如jigsaw项目背后的主要动机之一


在编译时,将依赖项包含在pom、ant构建文件、gradle构建文件或您通常使用的任何构建系统中。

对于误解,我深表歉意。我并不是说我会使用guicejar动态加载插件。我声明我的应用程序将使用guice来处理依赖关系。这只是一个例子。为了清楚起见,我更新了我的问题。我真正的问题是我的插件如何干净地使用我的主应用程序使用的JAR没有问题。不过,对于处理动态jar加载,我认为应该采用OSGI,正如我在回答中所说的:-OSGi对我来说太多了。我已经读过了。决定坚持使用服务提供者接口。虽然OSGi肯定是一个更可靠的方法,但这个项目只是为了好玩,所以我选择了简单。我可以通过添加我的插件(如guice)使用的外部JAR的构建路径来解决我的问题。我只是觉得它不干净。如果是为了好玩,你为什么不尝试学习一些你不想通过一个真正的盈利项目学习的东西呢但是如果SPI适合你,那就玩得开心-我想设置OSGi框架的时间限制。