首页 > 解决方案 > 为什么 Spring-web 没有在其 POM 中添加 javax.javaee-api?

问题描述

在学习Spring框架的时候,发现了一个奇怪的编译错误:

“找不到类:javax.servlet.ServletException”。

搜索代码后,我在org.springframework.web.WebApplicationInitializer类中找到了一些代码,它使用javax.servlet.ServletException


package org.springframework.web;

import javax.servlet.ServletContext; //here
import javax.servlet.ServletException;//and here

public interface WebApplicationInitializer {
    void onStartup(ServletContext var1) throws ServletException;
}


但是,在其 POM 文件中,没有定义依赖项:


<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.springframework</groupId>
  <artifactId>spring-web</artifactId>
  <version>5.2.1.RELEASE</version>
  <name>Spring Web</name>
  <description>Spring Web</description>
  <url>https://github.com/spring-projects/spring-framework</url>
  <organization>
    <name>Spring IO</name>
    <url>https://spring.io/projects/spring-framework</url>
  </organization>
  <licenses>
    <license>
      <name>Apache License, Version 2.0</name>
      <url>https://www.apache.org/licenses/LICENSE-2.0</url>
      <distribution>repo</distribution>
    </license>
  </licenses>
  <developers>
    <developer>
      <id>jhoeller</id>
      <name>Juergen Hoeller</name>
      <email>jhoeller@pivotal.io</email>
    </developer>
  </developers>
  <scm>
    <connection>scm:git:git://github.com/spring-projects/spring-framework</connection>
    <developerConnection>scm:git:git://github.com/spring-projects/spring-framework</developerConnection>
    <url>https://github.com/spring-projects/spring-framework</url>
  </scm>
  <issueManagement>
    <system>GitHub</system>
    <url>https://github.com/spring-projects/spring-framework/issues</url>
  </issueManagement>
  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>5.2.1.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>5.2.1.RELEASE</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>
</project>

我认为每个库都应该在其 POM 文件中写入其依赖项,以便 Maven 可以识别并自动下载依赖库。为什么 Spring-web 省略了依赖?

标签: javaspring

解决方案


为什么 Spring-web 省略了依赖?

不知道具体为什么。您必须向开发人员询问完整的推理...

如果您将 spring-web 5.0.0 POM 文件与最新的 4.xx POM 文件进行比较,您会发现对依赖项进行了重大清理。删除了很多杂乱无章的内容,包括对 servlet api JAR 的任何依赖。

如果您查看 spring-webmvc 5.0.0 的依赖项(此处显示)并向下滚动到提供的依赖项,您将看到对“javax.servlet » javax.servlet-api » 4.0.0”的依赖项。将其与 spring-web 5.0.0 进行对比(如图所示

请注意,spring-web(即您使用的依赖项)本身不需要对 servlet-api 的依赖项,否则它不会构建。


所以这让我认为,也许你的项目需要依赖 spring-webmvc 而不是 spring-web ......如果你想获得一个传递的 servlet-api 依赖。

(您是在阅读教科书还是在学习旧版 Spring 的教程或视频?如果是,我建议您在学习时更新教科书或使用旧版 Spring 版本。)


回到你的问题:

为什么 Spring-web 没有在其 POM 中添加 javax.javaee-api?

一个原因是:因为它不需要它!


推荐阅读