java - "multi plugins"Java Web 应用程序的最佳实践 - 管理公共(public)库和冲突版本

标签 java maven tomcat web-applications jar

我是 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.0some-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/

相关文章:

java - 如何在 Jenkins 中为每个从属节点配置 Maven 安装?

tomcat - Netbeans7.1.1 - tomcat 6.0.35 部署错误 - 部署错误 : Access to Tomcat server has not been authorized

java - 我们如何知道用户提交的日期格式?

tomcat - JIRA、第三方 SSL、在 CentOS 上重定向

Java Can't connect to X11 window server using 'localhost:10.0' as the value of DISPLAY variable

java - Android中解析嵌套的Json对象并存储在数据库中

java - Java 中第一次尝试序列化很慢?

java - maven.springframework.org/release 已缓存在本地存储库中

java - Maven 依赖项不会导出到 jar 中

java - Silvertunnel异常: java. lang.NoSuchMethodError : org. bouncycaSTLe.asn1.ASN1InputStream.readObject()Lorg/bouncycaSTLe/asn1/DERObject;