“多插件”Java Web应用程序的最佳实践 - 管理公共库和冲突版本

时间:2014-03-02 16:50:54

标签: java maven tomcat web-applications jar

我是一个新项目,我们必须开发插件(在该特定项目中称为“ extensions ”)。主应用程序在一个经过修改的Tomcat Web服务器中运行,我们必须将我们的插件'.jars添加到一个公共的 lib 文件夹中。我仍然不习惯应用程序及其工作方式,但我非常确定应用程序及其所有插件都有一个通用的类加载器。 lib 文件夹中的所有库都是共享的。

我的问题是如何在该环境中处理插件的依赖关系和潜在的冲突版本。

我们是否应该将共享库(例如some-common-lib-1.3.4作为 lib 文件夹中的jar文件而插件必须使用 这些版本 他们需要使用图书馆吗?

或者插件是否应该包含自己的依赖项(例如,使用Maven Shade Plugin),因此不同版本的相同依赖项不是问题?

我看到将共享库与特定版本用于所有插件的问题是关于传递依赖性的。如果一个公共库对some-transitive-dependency-1.0.0具有依赖性,并且我们有一个特定的插件,它需要一个新的库,它本身对some-transitive-dependency-2.0.0具有传递依赖性,那么我们就搞砸了...我们需要两个{ lib 文件夹中的{1}}和some-transitive-dependency-1.0.0以及谁知道会发生什么。

此外,如果对于一个特定的插件,我们需要将依赖项更新为新的主要版本,我们可能必须更新所有插件,因为该库是由所有人共享的。

有这种情况的真实世界经验吗?有什么提示吗?

1 个答案:

答案 0 :(得分:1)

由于OSGI不是一个选项,并且可能每个人都可以创建新的插件,正如您已经建议的那样,分离它们的唯一可行方法是使用阴影插件或类似的技术。

由于你无法分离类加载器并重新编译所有插件(你甚至可能没有源代码)实际上不是一个选项,有时你甚至可能有不可解决的冲突(asm 1.x和2.x完全是不兼容),你必须使用自己的“穷人的OSGI”并使用阴影。

但请注意,这确实减少了插件协同工作或共享主应用程序中未定义的公共数据的选项。

相关问题