将外部库添加到基于 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
中,以便它们在 运行- 中正确解析时间.
我正在开发一个基于 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
中,以便它们在 运行- 中正确解析时间.