当前位置: 首页 > 知识库问答 >
问题:

使用IntelliJ部署支持嵌入式tomcat的spring-boot应用程序

桑思远
2023-03-14
Caused by: java.lang.IllegalStateException: Failed to introspect annotated methods on class org.springframework.boot.web.support.SpringBootServletInitializer
    at org.springframework.core.type.StandardAnnotationMetadata.getAnnotatedMethods(StandardAnnotationMetadata.java:163) ~[spring-core-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.context.annotation.ConfigurationClassParser.retrieveBeanMethodMetadata(ConfigurationClassParser.java:380) ~[spring-context-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:314) ~[spring-context-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:245) ~[spring-context-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:198) ~[spring-context-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:167) ~[spring-context-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    ... 17 common frames omitted
Caused by: java.lang.NoClassDefFoundError: javax/servlet/ServletContext
    at java.lang.Class.getDeclaredMethods0(Native Method) ~[na:1.8.0_144]
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2701) ~[na:1.8.0_144]
    at java.lang.Class.getDeclaredMethods(Class.java:1975) ~[na:1.8.0_144]
    at org.springframework.core.type.StandardAnnotationMetadata.getAnnotatedMethods(StandardAnnotationMetadata.java:152) ~[spring-core-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    ... 22 common frames omitted
Caused by: java.lang.ClassNotFoundException: javax.servlet.ServletContext
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) ~[na:1.8.0_144]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_144]
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335) ~[na:1.8.0_144]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[na:1.8.0_144]
    ... 26 common frames omitted

我使用的是IntelliJ IDEA 2017.2(只是在构建为IDEA-IU-172.3317.76的情况下),作为一个SSCCE,让我们使用spring-boot的入门示例,并应用为传统部署提出的更改(第一个链接),我们将得到以下文件

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.springframework</groupId>
    <artifactId>gs-spring-boot</artifactId>
    <version>0.1.0</version>
    <packaging>war</packaging>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.6.RELEASE</version>
    </parent>

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

    <properties>
        <java.version>1.8</java.version>
    </properties>


    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

那么我们将有application.java

package hello;

import java.util.Arrays;

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.context.ApplicationContext;

@SpringBootApplication
public class Application extends SpringBootServletInitializer {

    public static void main(String[] args) {
        ApplicationContext ctx = SpringApplication.run(Application.class, args);

        System.out.println("Let's inspect the beans provided by Spring Boot:");

        String[] beanNames = ctx.getBeanDefinitionNames();
        Arrays.sort(beanNames);
        for (String beanName : beanNames) {
            System.out.println(beanName);
        }
    }

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

}
package hello;

import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;

@RestController
public class HelloController {

    @RequestMapping("/")
    public String index() {
        return "Greetings from Spring Boot!";
    }

}

共有1个答案

金子平
2023-03-14

注意:此答案参考了Spring V1.5.6.版本(当前版本)的文档

分析:

从IJ运行main类就像从命令行执行应用程序一样。因此,类路径将只包括compileruntime范围的依赖项。provided表示在编译期间需要它,但您希望JDK或容器在运行时为应用程序提供它:

默认情况下,重新打包运行目标都将包括项目中定义的任何提供的依赖项。基于引导的项目应将提供的依赖项视为运行应用程序所需的容器依赖项。

结论和解决方案:

所以这是一个类路径配置问题。正如您提到的,对于war打包或传统部署,您应该排除嵌入式servlet容器。但是,为了能够在开发过程中运行应用程序,您需要嵌入式容器。

作为一种解决方案或解决方案,您至少有以下2个选项:

<profiles>
    <profile>
        <id>dev</id>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
            </dependency>
        </dependencies>
    </profile>
</profiles>
 类似资料:
  • 我在将spring boot应用程序部署到tomcat时遇到了问题,尽管在IDE中工作得很好。我按照https://docs.spring.io/spring-boot/docs/current/reference/html/howto-tegratic-deployment.html中的说明进行了操作 更详细的结构: mvn clear包给出错误:

  • 基本上,我想使用spring boot auto配置数据源相关功能,并希望将spring boot应用打包到一个war,并部署到Tomcat。 github URL:https://github.com/oneslideicywater/customlizeofkakahair运行MVN构建后,我跳过测试,将部署到TomCat,重新启动它,然后在STS IDE中运行应用程序时,一切都很好。但是会发

  • 问题内容: 我有一个项目,其中将来自多个来源的数据处理为某些数据结构。程序完成这些结构的构建后,我希望它建立一个服务器,使用户可以手动微调这些结构。我认为使用Spring Boot设置的嵌入式Tomcat服务器上的Spring MVC正是我所需要的。 我想使用Thymeleaf作为查看技术,因此 和 但是,即使在处有一个查看文件,服务器对URL的回复也是 在调试器中单步执行代码后,似乎在某个时候(

  • 我有一个Spring Boot项目,我想在嵌入式spring tomcat上部署该项目,因为服务器(suse-linux)没有应用程序容器。我怎么能这么做?是.war还是un.jar?我如何配置嵌入式tomcat以指向服务器上安装的java?。 pom.xml .罐子 谢谢你的帮助。

  • 我正在尝试在一个新的Spring Boot应用程序中使用WebFlux反应类型。我在https://start.spring.io上使用了initializr,并选择了2.0.0快照版本。我添加了web reactive dependency,我所做的一切工作都很好。这是一个非常可靠的POC,目标是如何利用这些类型来更新我们的API,为了做到这一点,我们计划缓慢地替换阻塞和/或同步进程的每个部分,

  • 我已经使用JPA和JDK 7在spring boot上创建了一个应用程序,但我无法将其部署到Tomcat 7。tomcat 7是否支持Spring boot 2.0。5.JPA/Hibernate的发布版本和相关jar。