java 无法访问org.springframework.web.WebApplicationInitializer

xam8gpfp  于 6个月前  发布在  Java
关注(0)|答案(4)|浏览(98)

我目前正在使用Spring 4、Java 1.8和Gradle(https://spring.io/guides/gs/scheduling-tasks/)完成调度任务的示例。
但是,在运行此示例时,我收到以下错误:
错误:(11,8)java:无法访问org.springframework.web的org.springframework. web应用程序初始化程序类文件。未找到Web应用程序初始化程序
我的Application.java的源代码如下:

package hello;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling
public class Application extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }

    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class);
    }
}

字符串
我的Gradle文件:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.4.2.RELEASE")
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'
apply plugin: 'war'

jar {
    baseName = 'gs-scheduling-tasks'
    version =  '0.1.0'
}

repositories {
    mavenCentral()
}

sourceCompatibility = 1.8
targetCompatibility = 1.8

dependencies {
    compile("org.springframework.boot:spring-boot-starter")
    testCompile("org.springframework.boot:spring-boot-starter-test")
    providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
}


为什么org.springframework.web.WebApplicationInitializer在指南中甚至都没有提到它的时候会导致这个错误呢?
谢谢.

lsmd5eda

lsmd5eda1#

添加此依赖项来解决此问题。我完美地为我工作。

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

字符串

kr98yfug

kr98yfug2#

本指南不会扩展SpringBootServletInitializer,如果您想在应用程序中启动Tomcat Web服务器,请将其删除或添加spring-boot-starter-web作为依赖项。

vi4fp9gy

vi4fp9gy3#

您正在扩展实现WebApplicationInitializerSpringBootServletInitializer
检查http://grepcode.com/file/repo1.maven.org/maven2/org.springframework.boot/spring-boot/1.0.2.RELEASE/org/springframework/boot/context/web/SpringBootServletInitializer.java
请使用此Application类,如指南所示

@SpringBootApplication
@EnableScheduling
public class Application {

    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class);
    }
}

字符串

vyu0f0g1

vyu0f0g14#

正如@萨利指出的,SpringBootServletInitializer确实实现了WebApplicationInitializer,但两者都在不同的JAR-s(工件)中。当你想将WAR文件部署到独立的Tomcat时,不使用spring-boot-starter-web是完全合理的-否则你会包括Tomcat的引擎(除非你显式地将其从依赖项中排除)。如果是这样的话,那么我建议放入父POM:

<dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>${spring.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <dependency>
        <groupId>jakarta.servlet</groupId>
        <artifactId>jakarta.servlet-api</artifactId>
        <version>${servlet-api.version}</version>
      </dependency>
    </dependencies>
  </dependencyManagement>

字符串
然后在你的“web模块”项目中:

<dependencies>
    <dependency>
      <groupId>jakarta.servlet</groupId>
      <artifactId>jakarta.servlet-api</artifactId>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
    </dependency>
  </dependencies>


spring-boot-dependencies提供了spring-boot-starter和spring-web(包含缺少的类)。但是为了使一切正常工作,您还需要提供servlet API,因此我们也添加了那个。
使用这种方法,您可以获得最小的WAR大小,并且不必记住排除Tomcat依赖项。

相关问题