【问题标题】:Why do I need main method if I develop web app as war using Spring Boot?如果我使用 Spring Boot 将 web 应用程序开发为战争,为什么我需要 main 方法?
【发布时间】:2023-03-17 07:48:01
【问题描述】:

我正在使用 Spring Boot 开发 Web 应用程序。我的典型部署是生成war 并将其放在Tomcat 目录下的webapps 文件夹中。

我注意到SpringBoot,我需要一个main 方法。我想知道为什么需要这样做。如果有办法避免它,那会是什么?

@SpringBootApplication
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, args);
    }

}

【问题讨论】:

  • 如果您想部署为战争,我认为您不需要 main 方法。如果删除它会发生什么?
  • 是的,你不需要它。如果它只是您正在构建的 WAR 文件,则可以将其删除。
  • 文档的关键部分是“(...)您更新应用程序的主类以扩展 SpringBootServletInitializer”;如果您在该页面的其余部分搜索“public class Application”的出现,您会发现它们只是引用该类的先前形状。
  • @JBNizet:如果我删除 main 方法,构建将失败。我在这里有一个帖子:stackoverflow.com/questions/29831953/…
  • @kryger:请看我上面的评论

标签: spring spring-mvc spring-boot


【解决方案1】:

典型部署场景构建war并放置在Tomcat的webapps文件夹中,不需要main方法。您只需要:

public class Application extends SpringBootServletInitializer {

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

但是,如果您希望能够在开发时从 IDE(例如,使用 Eclipse 的运行方式 -> Java 应用程序)中启动应用程序,或者 build an executable jar or a war 可以通过 java -jar myapp.war 与 Spring Boot 的嵌入式 tomcat 独立运行命令,带有 main 方法的入口点类可能会有所帮助。

【讨论】:

  • +1。谢谢(你的)信息。顺便说一句,application.sources(Application.class) 是做什么的?它的唯一目的是什么?有必要还是可以避免?
  • 根据JavaDoc of the method,它为 Spring 添加了更多源(配置类和组件)以扫描此应用程序的上下文初始化。
  • 我尝试不使用 main 方法,但失败了:这里是:stackoverflow.com/questions/29831953/…
【解决方案2】:

在单独的网络容器中运行

你不需要 main 方法,你只需要像 Kryger 提到的那样扩展SpringBootServletInitializer

@SpringBootApplication
public class Application extends SpringBootServletInitializer {

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

在命令行中作为独立应用程序运行

这里你需要main方法,这样你就可以在命令行中使用java -jar运行它。

public class Application {
    public static void main(String[] args){
        ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);
    }
....
....

来源:https://spring.io/guides/gs/convert-jar-to-war/

【讨论】:

【解决方案3】:

在 Spring Boot 中,基本上需要三样东西:

1) 使用@SpringBootApplication 注解

2) 扩展 SpringBootServletInitializer

3)如上图覆盖configure方法

就是这样!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-21
    • 2017-03-11
    • 1970-01-01
    • 2018-09-04
    • 1970-01-01
    • 2020-05-23
    • 2018-12-03
    • 1970-01-01
    相关资源
    最近更新 更多