将第三方罐子包含在核心库中的最佳实践?

时间:2009-02-16 21:35:22

标签: java jar

我们有一个核心库,我们将其作为JAR包含在我们所有的Web应用程序中,以最大限度地重用代码。现在我们想通过第三方库(iText)通过这个核心库包含一些功能。

将iText JAR添加到核心库不起作用,因为类加载器找不到嵌套的JAR。我们不希望将iText JAR添加到每个Web应用程序,因为Web应用程序不使用iText,他们使用的是使用iText的库。语义?也许,但是将第三方JAR添加到Web App中,因此它使用的库可以访问JAR中的类看起来很乱。

我是否错过了一个简单的练习来解决这个问题,或者是jar合并和自定义类加载器的最佳方法?

3 个答案:

答案 0 :(得分:2)

欢迎来到JAR hell,这是Java开发中一直存在的问题,也是OSGi获得成功的主要原因之一。直到最近,“凌乱”方法一直是行业的标准,清洁方法的成本可能远远超过快速和肮脏方法的成本。

但是要回答您的问题,大多数应用服务器都可以放置可以在所有网络应用中访问的JARS。例如,Tomcat具有common / lib目录。你可能想把你的JAR放在那里。

答案 1 :(得分:1)

EAR可能是适合的。没有什么比另一层间接的了。

答案 2 :(得分:1)

如果你分发战争,你将不得不在战争中放置iText jar 如果你分配耳朵,你可以将所有罐子放在耳根内的多个战争中。
如果jar对于许多耳朵是常见的,则可以选择将其放在Web服务器库目录中。在我看来,这个最终选项并不值得推荐,因为你可能会在每只耳朵中使用不同版本的jar,从而产生冲突,并且将jar放在服务器根目录中通常不是标准的分发机制。
有些工具可以重新打包所有库并将它们嵌入到单个jar中,如Jar Jar Links.
最后,我建议使用Maven或类似工具来管理您的依赖项并自动化您的构建。随着依赖关系数量的增加,这可能会有很大的帮助。