繁体   English   中英

非OSGi开发人员的JAR Hell黑客

[英]JAR Hell Hacks for Non-OSGi Developers

编辑 :查看完该剧后,我在下面使用的示例有点误导。 我正在寻找这样的情况:我有两个依赖于同一jar的不同版本的3rd party jar (不是我可以访问源代码的本地jar)。


原文:所以我最近熟悉了OSGi是什么,以及OSGi核心解决的问题(“ JAR Hell”)。 而且,正如我对它感兴趣(并计划在将来的某个地方迁移)一样,我只是没有内心开始学习将我的项目付诸实践的过程。

因此,我现在很感叹:如果JAR发生在我身上,我该如何解决这种OSGi问题?

显然,解决方案几乎需要编写我自己的ClassLoader ,但是我很难想象它如何表现出来,更重要的是,这将如何解决问题。 我进行了一些研究,共识是您必须为生成的每个JAR编写自己的ClassLoader,但是由于我已经很难看清树林,因此该声明不会引起我的注意。

有人可以提供一个具体的示例,说明如何编写我自己的ClassLoader如何在这个巨大的伤口上创可贴(我知道,我知道,唯一真正的解决方案是OSGi)?

假设我编写了一个名为SuperJar-1.0.jar的新JAR,它可以完成各种惊人的工作。 假设我的SuperJar-1.0.jar还有另外两个依赖项, Fizz-1.0.jarBuzz-1.0.jar FizzBuzz jar都依赖于log4j ,除了Fizz-1.0.jar依赖于log4j-1.2.15.jar ,而Buzz-1.0.jar依赖于log4j-1.2.16.jar 同一罐子的两个不同版本。

基于ClassLoader的解决方案如何解决(概括地说)?

如果您是从“我正在开发一个应用程序,如何避免这个问题”而不是从“我需要这个特定解决方案”的角度提出问题,那么我强烈希望使用Maven方法-即仅解决一个任何给定依赖项的单一版本。 在log4j 1.2.15-> 1.2.16的情况下,这可以正常工作-您只能包含1.2.16。 由于较早的版本与API兼容(它只是补丁程序版本),因此Fizz 1.0极有可能甚至没有注意到它正在使用比预期更高的版本。

你会发现,这样做将有可能与调试的问题比较容易的方式 (没有混淆了我就像甚至类或静态字段漂浮的多个版本!谁知道哪一个你处理!),也不需要任何聪明的类加载器黑客。

但是,这正是所有应用服务器必须处理的内容。 假设您的Fizz和Buzz是Web应用程序(WAR),而Super-Jar是您的appserver。 Super-Jar将为每个“破坏”常规委派模型的Web应用程序安排一个类加载器,即,在查找层次结构之前,它将在本地(向下)查找。 在任何appservers文档中都可以阅读到。 例如http://download.oracle.com/docs/cd/E19798-01/821-1752/beade/index.html

使用log4j-1.2.16 它仅包含wrt 1.2.15的错误修正。

如果Fizz的版本为1.2.16,请对其进行分叉和修补 ,然后将这些修补提交给Fizz的作者。

使用特殊委派逻辑创建自定义类加载器的替代方法非常复杂,并且可能会引起许多问题。 我不明白为什么您会想要这样做而不是仅仅使用OSGi。 您是否考虑过创建嵌入式OSGi框架,所以不必转换整个应用程序?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM