我想让我的项目支持一个依赖项的多个版本。这种依赖可能具有API不兼容性,这是最简单和最好的做法吗?有没有办法在运行时检测版本,并控制是否编译使用依赖项的新功能的代码段。
答案 0 :(得分:1)
我认为您的意思是最终用户可以在其类路径中添加JAR的多个版本中的任何一个,并且您希望能够使用他们提供的任何版本。
有很多方法可以做到这一点。您可以通过查看清单目录来检测使用Maven或类似版本构建的版本。另一种方法是编写一些适配器,一个适用于您所知道的每个版本的系列,并测试哪个版本看起来有效。
您可以通过为每个版本创建一个模块,并在该模块支持的版本上具有可选的依赖关系,从而在maven中构建它。您创建一个具有唯一名称的类,例如使用您名称中支持的版本。这将为您提供N个模块,其中包含少量类。然后,您可以创建一个包含所有这些类的模块,并在它们之间进行搜索,以找到第一个看起来有用的类。显然,如果你知道你支持哪个版本,这比跟踪和错误更好,但并不总是可行。
如果你想一次支持多个版本,不使用自定义类加载器,你可以使用像jarjar这样的工具重命名一些受支持版本的包,并在所有支持版本的超级JAR中提供。
答案 1 :(得分:0)
您还应该考虑OSGI。有了它,您可以为每个捆绑包指定依赖关系的版本(就像您的应用程序的单个模块),并且具有不同的捆绑包取决于同一个库的不同版本。
另见: http://www.eclipse.org/virgo/documentation/virgo-documentation-3.6.0.M01/docs/virgo-user-guide/html/ch02s02.html 和 http://www.christianposta.com/blog/?p=247