【问题标题】:Hello World with Spring-Boot using Groovy and IntelliJ使用 Groovy 和 IntelliJ 的带有 Spring-Boot 的 Hello World
【发布时间】:2025-11-26 05:40:01
【问题描述】:

我正在尝试基于从 IntelliJ 运行的 Spring Boot 获取基本的 Groovy 脚本 [1]。但是我遇到了使用 servlet 2 API 而不是 3 API 的问题。请参阅下面的堆栈跟踪 [2]。

如果我使用 Spring Boot CLI 从命令行运行相同的脚本,它运行良好。 那么我需要改变什么?

非常感谢任何帮助,

斯蒂芬

PS groovy 脚本可能会被简化,因为它只是从 java 复制/粘贴

[1]

@Grab(group='org.springframework.boot', module='spring-boot-starter-web', version='1.1.7.RELEASE')

import org.springframework.boot.*;
import org.springframework.boot.autoconfigure.*;
import org.springframework.stereotype.*;
import org.springframework.web.bind.annotation.*;

@Controller
@EnableAutoConfiguration
public class HelloWorld  {

    @RequestMapping("/")
    @ResponseBody
    String home() {
        return "Hello World!";
    }


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

[2]

java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Tomcat].StandardHost[localhost].StandardContext[]]
    at java.util.concurrent.FutureTask.report(FutureTask.java:122)
    at java.util.concurrent.FutureTask.get(FutureTask.java:188)
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1123)
    at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:816)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1575)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1565)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:744)
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Tomcat].StandardHost[localhost].StandardContext[]]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
    ... 6 common frames omitted
Caused by: **java.lang.NoSuchMethodError**: javax.servlet.ServletContext.addServlet(Ljava/lang/String;Ljavax/servlet/Servlet;)Ljavax/servlet/ServletRegistration$Dynamic;
    at org.springframework.boot.context.embedded.ServletRegistrationBean.onStartup(ServletRegistrationBean.java:166)

【问题讨论】:

  • 我在 groovy 2.3.6 的命令行上遇到了同样的错误
  • cmd 行在我使用 Groovy 2.3.6 ($ spring run HelloWorld.groovy) 时工作​​正常
  • 然后你应该添加你如何在 CLI 上运行它以及你如何在 IDEA 中运行它。根据您的问题,我假设:CLI 上的groovy HelloWorld 和课堂上的Shift+F10main。后者相当于在 CLI 上使用 groovy 运行它(或多或少)。

标签: groovy intellij-idea spring-boot


【解决方案1】:

检查您的 IDE 使用的 Groovy 发行版。我认为默认发行版中仍然包含 servlet jar,并且默认情况下它们将位于类路径中(可能有一种方法可以禁用它,但这取决于工具)。您需要删除它们,或者复制 Groovy 发行版并删除坏 jar,然后将 IDE 指向它。

【讨论】:

  • 我的想法是一样的,所以我删除了 servlet-api-2.4.jar,但结果相同。此外,cmd 行使用相同的 Groovy 发行版并且确实有效......我认为它与指示 Spring-boot 使用 3.0 api 有关。有一些文档可以让 Spring 有机会这样做。 (iirc SpringApplicationBuilder)。但是我希望 SpringApplication 已经这样做了...... 无能
【解决方案2】:

我通过将 javax.servlet-api-3.1.0.jar 添加到 groovy jar 之前的类路径来“修复”这个问题。 IE。将其移动到 上方 模块设置的 Dependency 选项卡中的 groovy 2.3.6 库。

现在我手动下载了 servlet jar,也许我可以用葡萄来改进它。

【讨论】:

    最近更新 更多