【发布时间】:2014-01-29 17:19:21
【问题描述】:
我想做一个支持插件的java应用程序。现在我的核心将为某些进程使用 jars。如果我的插件在哪里也使用这些 jar,我的应用程序的插件是否需要配置它们的构建路径以包含它们也将使用的 jar,或者是它们的一种方式,以便可以像我导入包的方式一样导入 jar从主应用程序
【问题讨论】:
标签: java
我想做一个支持插件的java应用程序。现在我的核心将为某些进程使用 jars。如果我的插件在哪里也使用这些 jar,我的应用程序的插件是否需要配置它们的构建路径以包含它们也将使用的 jar,或者是它们的一种方式,以便可以像我导入包的方式一样导入 jar从主应用程序
【问题讨论】:
标签: java
Guice 和 Spring 是依赖注入的工具,这意味着使用它们创建对象更容易,因为它们负责实例化对象并将它们放入依赖它们的其他对象中。
现在,当我们谈论插件时,我们通常也在谈论将新类动态加载到正在运行的应用程序中。想想eclipse IDE。它的架构从一开始就被设计为“可插拔”的,例如,您可以下载 jars,eclipse 会将它们添加到正在运行的应用程序中,而无需重新启动应用程序。
在这种情况下,如果你想构建可插拔的应用程序,在动态类加载的意义上,我建议你不要走这条路,而是研究 OSGI 等主题。一种流行的 OSGI 框架是http://felix.apache.org/
应用程序扩展的另一种方法(我猜我们也可以称之为可插拔),这取决于您的应用程序的组织方式和功能,是为它开发一个 DSL (http://en.wikipedia.org/wiki/Domain-specific_language) 并扩展它让人们向它添加脚本。当浏览器允许您添加用 javascript 编写的功能时,不就是这样吗?对于 java 程序员,Groovy 在某些方面使 DSL 更容易。 (见http://docs.codehaus.org/display/GROOVY/Writing+Domain-Specific+Languages)
【讨论】:
如果您想要动态可插入系统 OSGI 可以为您提供此功能,但 OSGI 其 IMMO 技术过于复杂,请仅在您确实确定需要此动态可插入功能时使用。
构建可扩展系统的其他选项它使用 de ServiceProvider 机制,这是一种核心 java 机制,例如它是 JDBC 实现使用的一种,您可以将 JDBC 驱动程序放在类路径中,应用程序可以找到并使用它无需在代码中显式导入驱动程序类。
这是在您自己的应用程序中使用 ServiceProvider 的示例:http://docs.oracle.com/javase/tutorial/ext/basics/spi.html#limitations-of-the-service-loader-api
它当然比 OSGI 更受限制,但是当你得到这个想法时它非常容易使用,而且你不需要任何外部库,因为它是一个 java 核心机制。
编辑:关于图书馆。
在运行时:使用 ServiceProvicer 没有单独的类加载器(当然你可以实现,但默认情况下,在 OSGI 中它实现了这种分离),在运行时如果你的插件需要 X 类并且这个类在类路径中一切都可以,限制在于主应用程序和所有插件都使用这个版本的依赖(例如guice 3),如果这个版本不兼容,你不能有一个使用X版本的插件和另一个使用X+2版本的插件。 (这是著名的地狱 .jar,例如,jigsaw 项目背后的主要动机之一)。
在编译时,将依赖项包含在您的 pom、ant 构建文件、gradle 构建文件或您通常使用的任何构建系统中。
【讨论】: