在单个应用程序中配置同一jar的两个版本

时间:2010-01-06 12:49:37

标签: java java-ee

我的应用程序使用Http client2.0.2 jar文件,我的单元测试套件使用Http client3.1 jar文件。

如何在单个应用程序中配置两个版本的相同jar文件?

5 个答案:

答案 0 :(得分:3)

您需要设置两个不同的类路径。对于测试(您可能使用像ant这样的工具运行),将http客户端3.1添加到类路径中。

部署时,将http客户端2.0.2部署到应用服务器。省略测试类和其他版本的http客户端。

但是有一个缺点:你无法测试使用旧的http客户端的类(好吧,至少不是本地的)。因此,我建议将应用程序升级到新版本的库。

答案 1 :(得分:2)

也许您可以使用jarjar将Http客户端2.0.2嵌入到您的应用中,让您的单元测试使用更新的版本。

答案 2 :(得分:1)

真的不相信你应该对一个jar进行测试,并且要对另一个jar进行部署。我认为这是真正的问题。

答案 3 :(得分:1)

您可以在应用程序中使用同一类(或库)的不同版本。这不是一个大问题,你只需要为你的库使用不同的类加载器。

您必须创建一个URLClassLoader来加载您的开源测试应用程序(父类加载器将是系统类加载器),也许是3.1客户端版本的另一个类加载器作为第一个的子级。然后从类路径中删除这些库,并从开源应用程序中解析并“启动”'main'类。它应该直接工作或者至少为缺少的步骤提供足够的提示(NoClassDefFoundError)(之前没有尝试过,抱歉,这很理论)。查看java.lang.Classloader类(及其扩展程序)的JavaDoc

如果需要在单个应用程序中使用相同库的不同版本,我会使用OSGi作为框架,因为您可以免费获得此功能。客户端捆绑包可能依赖于2.0.2客户端版本,即客户端版本3.1上的测试捆绑包。您只需编辑Manifest文件并使用OSGi框架(如Equinox)启动应用程序。

答案 4 :(得分:1)

Netbeans做得非常好:你有两个单独的文件夹用于导入的图书馆,一个用于测试(测试图书馆),另一个用于你的应用程序(Librairies)......

如果您的IDE不支持此功能,您可以按照 Aaron Digulla 的建议手动执行此操作,并在您的ant配置中定义不同的类路径...您可以按照此tutorial进行操作它...