在Eclipse环境中,我有项目A.A对项目或库B和C具有依赖性。(如果它们是项目或库则没有区别) B依赖于LibX.v1,C依赖于LibX.v2。 在运行时,A将需要B.jar和C.jar。另外,B.jar中的类需要LibX.v1,而C.jar中的类需要LibX.v2。 作为同一个库的不同版本,LibX.v1和LibX.v2具有相同的类,因此可能会在运行时从错误的库版本加载类,从而导致很多麻烦。我该如何处理这类情况?
亲切的问候 谢雷夫
答案 0 :(得分:4)
真的,你没有。大多数Java类加载器都不保证库的加载顺序,因此您确实需要确保不要在类路径上复制依赖项。我会检查B或C是否可以更新到更新的版本,或者LibX是否完全向后兼容。
编辑:实际上,我发现了一些可能对您有帮助的内容。它被称为OSGi,我没有使用它,但它似乎可以做你想做的事情。以下是介绍文章的link。
答案 1 :(得分:4)
你需要使用'多种类加载器'机制(这是OSGI能够实现的)。在这种情况下,B类的类加载器只能看到LibX.v1,而类加载器C只能看到LibX.v2。
你可以用OSGI做到这一点,但OSGI远不止于此,开始使用它并非易事。
另一个插件框架是JPF,它提供的不仅仅是使用多个类加载器。我认为他们都使用每个插件1个类加载器的原理(模块,无论如何......)
也许看看classworlds。我认为可以用这个库来做。好处是它专注于类加载方面。文档不太好。 classworlds使用类领域的概念。看一下网站上的API Usage示例。
如果我找到一个,我会在这里添加一个例子。
无论如何,我认为这不是一个简单的解决方案
通过依赖管理来解决它当然是最好的解决方案,但并不总是可行。