我是 Web 项目的新手,我们必须在该项目中开发插件(在该特定项目中称为“扩展”)。主应用程序在修改后的 Tomcat Web 服务器中运行,我们必须将插件的 .jars 添加到一个公共(public) lib 文件夹中。我仍然不太习惯该应用程序及其工作方式,但我很确定该应用程序及其所有插件都有一个通用的类加载器。 lib 文件夹中的所有库都是共享的。
我的问题是如何在该环境中处理插件的依赖关系和潜在的冲突版本。
我们是否应该将 some-common-lib-1.3.4
等共享库作为 lib 文件夹中的 jar,并且插件必须使用 那些版本当他们需要使用库时?
或者一个插件是否应该包含它自己的依赖项(例如使用 Maven Shade Plugin)以便相同依赖项的不同版本不是问题?
我看到的问题是共享库具有用于所有插件的特定版本,是关于传递依赖性的。如果一个公共(public)库依赖于 some-transitive-dependency-1.0.0
并且我们有一个特定的插件需要一个新的库,它本身对 some-transitive-dependency 有一个传递依赖-2.0.0
那么我们就完蛋了...然后我们需要 some-transitive-dependency-1.0.0
和 some-transitive-dependency-2.0.0
在 lib 文件夹中,谁知道会发生什么。
此外,如果对于一个特定的插件,我们需要将依赖项更新到新的主要版本,我们可能必须更新所有插件,因为该库由所有人共享。
有没有遇到这种情况的真实经验?有什么建议吗?
最佳答案
由于 OSGI 不是一个选项,并且可能每个人都可以创建新的插件,所以分离它们的唯一可行方法是,正如您已经建议的那样,使用 shade 插件或一些类似的技术。
因为你不能分离类加载器和重新编译所有插件(你甚至可能没有源代码)真的不是一个选项,有时你甚至可能有无法解决的冲突(asm 1.x 和 2.x 完全不兼容),你必须使用你自己的“穷人的 OSGI”并使用阴影。
但是请注意,这确实会减少插件协同工作或共享未在主应用程序中定义的公共(public)数据的选项。
关于java - "multi plugins"Java Web 应用程序的最佳实践 - 管理公共(public)库和冲突版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22130447/