Java 或 Scala 插件框架
Posted
技术标签:
【中文标题】Java 或 Scala 插件框架【英文标题】:Java or Scala plugin framework 【发布时间】:2013-01-01 13:09:13 【问题描述】:我正在开发一个框架,可以将 jar 放入文件夹并扫描以后可以调用的函数。我的第一个实现使用了简单的 ClassLoader 方法,其中加载了 jar 并创建了类实例。这是插件架构。 我遇到的问题是版本控制。例如,假设我的主机应用程序正在使用依赖于 org.joda 时间版本 1.6 的第三方库,并且插件依赖于同一(较新)库的 2.1 版。 我尝试使用Java Simple Plugin Framework,但它似乎没有使用自定义类加载器加载我的插件(我假设我需要克服版本冲突并实际加载 2.1 版本)。 我的下一步是尝试 osgi。 所以,问题是:这是正确的方法还是有一种我不知道的简单方法,我来自.net世界,不太了解java,但我记得dll地狱,这似乎是它的java版本。顺便说一句,我正在使用 Scala 进行开发,但这与主要问题无关。
【问题讨论】:
你看过maven吗? @AaronKurtzhals 你是什么意思?是的,我正在使用 maven 来构建 jars 也许我不明白这个问题。我个人没有使用过 maven,但我知道使用 maven 是为了解决依赖需求/冲突。 是的,maven 有一个存储库,其中 jar 版本声明它们对其他 jars 版本的依赖关系。 OSGi 也管理版本;特别是同时使用多个版本。另一方面,如果您需要大锤来热交换类 chenges,请查看 JRebel。 可能我的问题没有说清楚,这是一个运行时插件架构,所以当我的主机运行时,它应该使用1.6版本的库,但是当它调用插件时,应该正确使用2.1。 【参考方案1】:试试ScalaScriptEngine。它允许您从源文件动态加载和编译类,并支持相当多的高级功能。
【讨论】:
【参考方案2】:我有一个类似的用例。我想要一个与您描述的非常相似的简单插件框架,但还没有准备好跳入 OSGi。我去了自定义类加载器路线,但遇到了和你一样的问题。我确实尝试了Parent-Last Classloader,它确实有助于解决一些 jar 冲突。这可能是需要调查的事情。我相当认真地研究了 CI 服务器 Jenkins 为他们的插件系统所做的事情 - 并发现 this article 很有趣。
最后,我需要能够跟踪服务何时来去去去,拥有一个服务注册中心等等……并意识到我正在重新发明 OSGi。我切换到了纯 OSGi,尽管有一个学习曲线并且有时会很痛苦,但我很高兴我做到了。
【讨论】:
听起来您的系统比我需要的要复杂得多,而且我还没有准备好跳入 osgi。感谢詹金斯的提示。以上是关于Java 或 Scala 插件框架的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 SBT 原生打包器部署 Scala Play 框架 API