问题 如果我使用Spring Boot开发Web应用程序作为战争,为什么我需要main方法?


我正在使用Spring Boot开发Web应用程序。我的典型部署正在产生 war 把它放进去 webapps Tomcat目录中的文件夹。

我注意到了 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);
    }

}

8550
2018-04-21 20:10


起源

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


答案:


构建战争并将其放置在Tomcat的webapps文件夹中的典型部署方案不需要主方法。所有你需要的是:

public class Application extends SpringBootServletInitializer {

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

但是,如果您希望能够在开发期间从IDE中启动应用程序(例如使用Eclipse的Run As - > Java Application) 建立一个可执行的jar或战争 可以通过Spring Boot的嵌入式tomcat独立运行 java -jar myapp.war 命令,带有main方法的入口点类可能会有所帮助。


10
2018-04-22 07:59



+1。谢谢(你的)信息。顺便问一下 application.sources(Application.class) 做?它的唯一目的是什么?有必要还是可以避免? - brain storm
按照 JavaDoc的方法,它为Spring添加了更多的源(配置类和组件)来扫描该应用程序的上下文初始化。 - Naymesh Mistry
我尝试没有主要方法,它失败了:这是: stackoverflow.com/questions/29831953/... - brain storm


在单独的Web容器中运行

你不需要main方法,你需要做的就是扩展 SpringBootServletInitializer 如 Kryger 提及。

@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
2018-04-22 06:39



这不起作用:请看这篇文章 stackoverflow.com/questions/29831953/... - brain storm
在3.8.3版中,SpringBootServletInitializer的替代方法是什么? - user982


在Spring Boot中,基本上需要三件事:

1)使用@SpringBootApplication注释

2)扩展SpringBootServletInitializer

3)覆盖如上所示的configure方法

就是这样!


0
2017-10-18 17:57