9

我想使用 SDK Java EE 7、Glassfish 4 和 Maven。
这是对的吗?请注意范围。

1. 对于小服务程序:

<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-api</artifactId>
    <version>7.0</version>
    <scope>provided</scope>
</dependency>

2. 没有标准标签和没有 JSTL 的 JSP:

<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>jsp-api</artifactId>
  <version>2.0</version>
</dependency>

3. 对于带有标准标签“c:”的 JSP

<dependency>
    <groupId>taglibs</groupId>
    <artifactId>standard</artifactId>
    <version>1.1.2</version>
</dependency>

4. 对于带有 JSTL 的 JSP

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
    <scope>runtime</scope>
</dependency>

您知道此信息包含的规范吗?

4

2 回答 2

13

有多种选择。正如问题中所建议的,一种方法是导入整个 Java EE API。但你也可以更有选择性。您可以改为仅包含 servlet API(这是针对 servlet API 3.0.1;更新的版本可用于相同的工件数据,但旧版本使用工件 ID servlet-api):

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.0.1</version>
        <scope>provided</scope>
    </dependency>

这个问题暗示 JSTL 包还引入了相关的 JSP 依赖项;情况并非如此:如果您需要使用 JSP API,您确实需要它的依赖项(但值得注意的是,您不一定需要它,正如在此问题中所讨论的那样)。您应该使用与您正在使用的 Servlet API 版本匹配的 JSP API 的正确版本,因此对于我上面显示的 servlet API 3.0.1,您应该使用 2.2:

    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.2</version>
        <scope>provided</scope>
    </dependency>

与 Servlet API 一样,JSP API 的依赖数据也发生了变化;在这种情况下,对于早于 2.0 的版本,组 id 只是javax.servlet,而对于高于 2.2 的版本,工件 id 已更改为javax.servlet.jsp-api

对于 JSTL,您几乎可以肯定只使用 1.2 版。此版本的新标准位置是:

    <dependency>
        <groupId>javax.servlet.jsp.jstl</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>

尽管问题中显示的旧位置继续正常工作。据推测,如果将来对该库进行任何更新,它们将包含在该组/工件 ID 中,因为这似乎被设计为与所有其他最近的工件适当地匹配。与其他工件不同,JSTL 不是由容器提供的,因此不应像其他工件那样将范围设置为“已提供”。

于 2017-04-25T02:52:14.347 回答
6

您不应该将这些依赖项添加到您的项目中。J2EE 规范的实例化(例如 servlet)应该由应用程序服务器的运行时提供。

在 Eclipse 中,为您的应用程序服务器添加服务器运行时。右键单击项目并选择属性。然后构建路径 > 添加库 > 服务器运行时。

于 2013-06-26T12:38:52.177 回答