为什么 JSTL 有两个 JAR 文件?

Why are there two JAR files for JSTL?

为了使用JSTL库,我们需要下载两个jar文件。例如 javax.servlet.jsp.jstl-api-1.2.1.jarjavax.servlet.jsp.jstl-1.2.1.jar。我敢打赌他们有一些接口和 类 让我们可以使用那些 标签 。但不管他们有什么,为什么他们不把它们全部放在一个 jar 文件中?

正如安德烈亚斯指出的那样:

"One is the API, mostly interfaces, the other is the implementation. You need the API for compiling, you need both for running."


你的问题的核心是:

But whatever they have, why they didn't put it all inside a single jar file?

javax.servlet.jsp.jstl-xxx.jar 文件中 类 的功能通常由您的 Web 容器提供。您将在 Web 容器自己的 JAR 文件之一中找到 类。它们可能与您在 Maven Central(或其他地方)中找到的参考实现版本不同。

因此,以某种方式将 javax.servlet.jsp.jstl-1.2.1.jar 中的 类 合并到您的 WAR 文件中要么是多余的(因为已经提供了 类),要么就是将是有害的,因为参考实现 类 与 Web 容器实现的其他方面冲突/不工作。

无论如何,拥有单独的 JAR 文件的根本原因是因为分离 API 和实现对于正确运行和减少 WAR 文件膨胀是必要的。当然,无论如何,您都可以自由地将这两个 JAR 显式包含在您的 Web 应用程序的 WAR 文件中....