当前位置: 首页 > 面试题库 >

使用IDE运行Spring-boot的主程序

岳玉书
2023-03-14
问题内容

我有一个Spring Boot应用程序,需要:

  • 可作为战争部署在servlet容器中
  • 可通过mvn spring-boot:run运行

我还希望能够通过右键单击main并运行它在IDE(Eclipse或IntelliJ IDEA社区)中运行此应用程序。

这是我pom.xml有趣的部分(请注意,我不是从spring-boot-starter-parent pom继承的):

...
        <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>
...
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.6</version>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring.boot.version}</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

这是我的SpringBootServletInitializer:

@Configuration
@EnableAutoConfiguration
@ComponentScan("com.company.theproject")
public class Application extends SpringBootServletInitializer
{
    private static final Logger logger = LoggerFactory.getLogger(Application.class);

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

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

在IDE中运行main时,出现以下错误:

org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.getEmbeddedServletContainerFactory(EmbeddedWebApplicationContext.java:183) ~[spring-boot-1.2.3.RELEASE.jar:1.2.3.RELEASE]
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:156) ~[spring-boot-1.2.3.RELEASE.jar:1.2.3.RELEASE]
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:130) ~[spring-boot-1.2.3.RELEASE.jar:1.2.3.RELEASE]
    ... 12 common frames omitted

好像mvn spring-boot:run在运行main直接运行时不会发生的更多魔术。

providedspring-boot-starter-tomcat依赖关系中删除作用域可解决此问题,但当在servlet容器内运行战争时会引起麻烦。

现在,我发现的唯一“修复”是mvn spring-boot:run在IntelliJ IDEA中运行,而不是直接运行main。尽管这是可以接受的解决方法,但我仍然想知道为什么它不起作用以及是否可以解决。


问题答案:

IntelliJ IDEA没有将provided依赖项注入到CLASSPATH中,正如Andy所说,这就是为什么spring无法创建嵌入式servlet容器的原因。

注释中提到的解决方法包括使用带有必要库的伪造模块,并将其用作类路径,使用-Xbootclasspath JVM参数,或使用定义maven配置文件运行(compiled)build(provided)



 类似资料:
  • 我的观察表明,当我运行springboot应用程序时,使用的类路径是我的 更改代码时,下的文件不会得到更新。Intellij IDE编译文件,但不更新类/生产目录。如何让hotswap与IntelliJ IDE一起工作以进行Spring-Boot?

  • 现在尝试使用spring Boot。我们怎样做才能达到同样的目的? 在pom.xml中有 使用spring boot并执行命令

  • 在 中测试代码依赖项。格雷德尔, 当我以的形式运行应用程序时,我得到了一个错误: 为什么在IDE中运行项目时使用测试依赖项?或者我错过了什么? 任何帮助都非常感谢:) 注: 1-如果我使用或gradle boot run在IDE之外运行它,它运行得很好 2-我尝试过刷新gradle项目、清洁项目等。 3-使用STS版本

  • 我将Spring Boot应用程序打包为可执行JAR。应用程序有一个带有main方法的实用程序类,我想通过命令行调用它,但命令似乎无法在类路径中找到该类。

  • 我将spring boot starter父级修改为2.3.0。通过此修改,我还引入了spring maven插件中的版本 我能够完成..但当我运行命令..我得到以下错误。 Lifecycle.LifecycleExecutionException:无法执行目标org.springframework.boot:spring-boot-maven-plugin:2.3.0。release:在项目上运

  • 我有这个春靴应用程序。使用Quartz(一个功能丰富的开源作业调度库,几乎可以集成在任何Java应用程序中)在每月10日执行作业 在配置包中: 请参考一下,我有另一个类似的应用程序,没有,而且工作正常: