将外部库添加到基于 Maven 的 JSF 项目的正确方法

Right way of adding External Libraries to Maven based JSF project

我正在开发一个基于 Maven + JSF + PrimeFaces 的项目,我可以 运行 它并且没有问题。但是我有一些问题。

我在 pom.xml 中添加了 PrimeFaces 依赖项,更新 Maven 后,Maven:org.primefaces:primefaces:5.2 文件被添加到 "External Libraries" 部分。此时,我可以使用 PrimeFaces 命名空间等,但在将 primefaces-5.2.jar 文件添加到 lib 文件夹之前,我无法使用它的组件,如 Editor。然后代码工作并且 PrimeFaces 组件加载到页面。

我做的这两个导入有什么区别?

我在想,如果我在 pom.xml 中添加 PrimeFaces 依赖项并加载它,一切正常,但事实并非如此!现在,如果我从 pom.xml 中删除 PrimeFaces 依赖项,所有与 PrimeFaces 相关的代码在 IDE 中都会变成红色并且看起来遗漏了什么,但是因为我在 lib 文件夹中有 PrimeFaces jar 文件,代码仍然有效!没看懂。

您似乎混淆了两个不同的问题,所以我会尽量简单地解释一下。

当您向应用程序添加依赖项(通过 POM)时,该依赖项会添加到该应用程序的类路径中。类路径表示编译 应用程序所需的每个依赖项。这意味着,在添加它之后,您将能够在该依赖项中使用和导入 类 并且代码将编译。如果类路径中没有依赖项,编译器将无法解析导入,因此当您将其从 POM 中删除时会出现错误。每个 IDE 都有自己的方式以一种很好的格式向用户呈现类路径。对于您正在使用的 IntelliJ,类路径显示在 "External Libraries" 列表中。因此,"External Libraries" 只是 IntelliJ 向您展示类路径是什么以及它包含什么的方式。

到目前为止,一切都在 "compile-time"。 Web 应用程序的结果是需要部署在 Web 服务器上的 war 文件。我们现在进入所谓的 "run-time"。 war 是一个包含 Web 应用程序所有代码的文件,包括它的所有依赖项。它们需要出现在 war 中,以便 Web 服务器可以正确加载 类 并解析导入。这些依赖项始终位于文件夹 WEB-INF/lib 中(就是这样)。因此,此文件夹中的库表示 运行 时需要的依赖项,即应用程序需要 运行.

这就是为什么你同时拥有它们(但实际上是相同的依赖关系):一个表示编译时所需的依赖关系,另一个表示 运行 时所需的依赖关系。

创建 war 文件时,Maven 会自动将所有类路径依赖项(提供的除外)定位到 WEB-INF/lib 中,以便它们在 运行- 中正确解析时间.