2

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

将 iText JAR 添加到核心库不起作用,因为类加载器找不到嵌套的 JAR。我们不想将 iText JAR 添加到每个 Web 应用程序,因为 Web 应用程序不使用 iText,它们使用的是使用 iText 的库。语义?也许吧,但是将第三方 JAR 添加到 Web 应用程序以便它使用的库可以访问 JAR 中的类似乎很麻烦。

我是否错过了解决此问题的简单实践,或者 jar 合并和自定义类加载器是最佳方法?

4

3 回答 3

2

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

但要回答您的问题,大多数应用程序服务器都有一个地方可以放置可跨所有 Web 应用程序访问的 JARS。例如,Tomcat 有 common/lib 目录。你可能想把你的 JAR 放在那里。

于 2009-02-16T21:42:54.747 回答
1

EAR 可能是合适的选择。没有什么比另一层间接更重要了。

于 2009-02-16T21:40:52.113 回答
1

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

于 2009-02-21T00:33:27.660 回答